From 562ca73a586296f7634460932a75a2cb1437a1d3 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Fri, 30 Jan 2026 14:03:47 -0500 Subject: [PATCH 001/495] chore(zbugs): create terabugs mirror (#5495) --- .github/workflows/mirror.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 3d33110093..36e7c70279 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -7,7 +7,7 @@ on: jobs: mirror_job: runs-on: ubuntu-latest - name: Mirror main branch to sandbox and gigabugs branch + name: Mirror main branch to sandbox and terabugs branch steps: - name: Mirror main to sandbox id: mirror-sandbox @@ -16,10 +16,10 @@ jobs: github-token: ${{ secrets.PERSONAL_GITHUB_TOKEN }} source: 'main' dest: 'sandbox' - - name: Mirror main to gigabugs - id: mirror-gigabugs + - name: Mirror main to terabugs + id: mirror-terabugs uses: google/mirror-branch-action@v2.0 with: github-token: ${{ secrets.PERSONAL_GITHUB_TOKEN }} source: 'main' - dest: 'gigabugs' + dest: 'terabugs' From ec7ae60074da1e3e96358dacacbb87db2142048f Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 30 Jan 2026 11:36:32 -0800 Subject: [PATCH 002/495] chore(zero-cache): move ChangeSource interface into change-source package (#5497) Simple refactoring for clarity / organization. --- .../services/change-source/change-source.ts | 24 ++++++++++++++++ .../change-source/custom/change-source.ts | 5 +--- .../change-source/pg/change-source.pg.test.ts | 5 +--- .../change-source.toasted-values.pg.test.ts | 5 +--- .../change-source/pg/change-source.ts | 5 +--- .../change-streamer-service.ts | 28 ++++--------------- 6 files changed, 33 insertions(+), 39 deletions(-) create mode 100644 packages/zero-cache/src/services/change-source/change-source.ts diff --git a/packages/zero-cache/src/services/change-source/change-source.ts b/packages/zero-cache/src/services/change-source/change-source.ts new file mode 100644 index 0000000000..b8df8a9637 --- /dev/null +++ b/packages/zero-cache/src/services/change-source/change-source.ts @@ -0,0 +1,24 @@ +import type {Sink, Source} from '../../types/streams.ts'; +import type { + ChangeSourceUpstream, + ChangeStreamMessage, +} from './protocol/current.ts'; + +export type ChangeStream = { + changes: Source; + + /** + * A Sink to push the {@link StatusMessage}s that reflect Commits + * that have been successfully stored by the {@link Storer}, or + * downstream {@link StatusMessage}s henceforth. + */ + acks: Sink; +}; /** Encapsulates an upstream-specific implementation of a stream of Changes. */ + +export interface ChangeSource { + /** + * Starts a stream of changes starting after the specific watermark, + * with a corresponding sink for upstream acknowledgements. + */ + startStream(afterWatermark: string): Promise; +} diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.ts b/packages/zero-cache/src/services/change-source/custom/change-source.ts index 138b59d91f..92a1cb5bae 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.ts @@ -9,10 +9,6 @@ import {computeZqlSpecs} from '../../../db/lite-tables.ts'; import {StatementRunner} from '../../../db/statements.ts'; import type {ShardConfig, ShardID} from '../../../types/shards.ts'; import {stream} from '../../../types/streams.ts'; -import type { - ChangeSource, - ChangeStream, -} from '../../change-streamer/change-streamer-service.ts'; import { AutoResetSignal, type ReplicationConfig, @@ -24,6 +20,7 @@ import { initReplicationState, type SubscriptionState, } from '../../replicator/schema/replication-state.ts'; +import type {ChangeSource, ChangeStream} from '../change-source.ts'; import {changeStreamMessageSchema} from '../protocol/current/downstream.ts'; import {type ChangeSourceUpstream} from '../protocol/current/upstream.ts'; import {initSyncSchema} from './sync-schema.ts'; diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index b2e0b91751..d91759203f 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -18,12 +18,9 @@ import {DbFile} from '../../../test/lite.ts'; import {versionFromLexi, versionToLexi} from '../../../types/lexi-version.ts'; import {type PostgresDB} from '../../../types/pg.ts'; import type {Source} from '../../../types/streams.ts'; -import type { - ChangeSource, - ChangeStream, -} from '../../change-streamer/change-streamer-service.ts'; import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; import {getSubscriptionState} from '../../replicator/schema/replication-state.ts'; +import type {ChangeSource, ChangeStream} from '../change-source.ts'; import type { Begin, ChangeStreamMessage, diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.toasted-values.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.toasted-values.pg.test.ts index 839f28afd2..357cc3aaec 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.toasted-values.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.toasted-values.pg.test.ts @@ -9,10 +9,7 @@ import {getConnectionURI, type PgTest, test} from '../../../test/db.ts'; import {DbFile} from '../../../test/lite.ts'; import {type PostgresDB} from '../../../types/pg.ts'; import type {Source} from '../../../types/streams.ts'; -import type { - ChangeSource, - ChangeStream, -} from '../../change-streamer/change-streamer-service.ts'; +import type {ChangeSource, ChangeStream} from '../change-source.ts'; import type {MessageInsert} from '../protocol/current.ts'; import type { ChangeStreamMessage, diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index d7500acebf..6402d1b414 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -36,15 +36,12 @@ import { } from '../../../types/shards.ts'; import type {Sink} from '../../../types/streams.ts'; import {Subscription, type PendingResult} from '../../../types/subscription.ts'; -import type { - ChangeSource, - ChangeStream, -} from '../../change-streamer/change-streamer-service.ts'; import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; import { getSubscriptionState, type SubscriptionState, } from '../../replicator/schema/replication-state.ts'; +import type {ChangeSource, ChangeStream} from '../change-source.ts'; import type {JSONObject} from '../protocol/current.ts'; import type { DataChange, diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index bc6b22948c..47fb22a2cc 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -9,14 +9,16 @@ import { } from '../../types/lexi-version.ts'; import type {PostgresDB} from '../../types/pg.ts'; import type {ShardID} from '../../types/shards.ts'; -import type {Sink, Source} from '../../types/streams.ts'; +import type {Source} from '../../types/streams.ts'; import {Subscription} from '../../types/subscription.ts'; +import type { + ChangeSource, + ChangeStream, +} from '../change-source/change-source.ts'; import { type ChangeStreamControl, type ChangeStreamData, - type ChangeStreamMessage, } from '../change-source/protocol/current/downstream.ts'; -import type {ChangeSourceUpstream} from '../change-source/protocol/current/upstream.ts'; import {publishReplicationError} from '../replicator/replication-status.ts'; import type {SubscriptionState} from '../replicator/schema/replication-state.ts'; import { @@ -94,26 +96,6 @@ export async function initializeStreamer( */ export type WatermarkedChange = [watermark: string, ChangeStreamData]; -export type ChangeStream = { - changes: Source; - - /** - * A Sink to push the {@link StatusMessage}s that reflect Commits - * that have been successfully stored by the {@link Storer}, or - * downstream {@link StatusMessage}s henceforth. - */ - acks: Sink; -}; - -/** Encapsulates an upstream-specific implementation of a stream of Changes. */ -export interface ChangeSource { - /** - * Starts a stream of changes starting after the specific watermark, - * with a corresponding sink for upstream acknowledgements. - */ - startStream(afterWatermark: string): Promise; -} - /** * Upstream-agnostic dispatch of messages in a {@link ChangeStreamMessage} to a * {@link Forwarder} and {@link Storer} to execute the forward-store-ack From 388e959b7b7d2d3bc718e73a15efbf280a78e404 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Fri, 30 Jan 2026 14:59:43 -0500 Subject: [PATCH 003/495] chore(terabugs): allow generating more data after the fact (#5496) We need more data in the terabugs DB (we're at 120GB or 300GB depending on how you count. CSV vs PG DB sizes). --- apps/zbugs/SYNTHETIC_DATA.md | 65 +++++++++++++++----- apps/zbugs/scripts/generate-synthetic.ts | 76 ++++++++++++++++-------- apps/zbugs/scripts/seed.ts | 19 ++++-- 3 files changed, 115 insertions(+), 45 deletions(-) diff --git a/apps/zbugs/SYNTHETIC_DATA.md b/apps/zbugs/SYNTHETIC_DATA.md index 4abfc565b1..3d8b4c6cd4 100644 --- a/apps/zbugs/SYNTHETIC_DATA.md +++ b/apps/zbugs/SYNTHETIC_DATA.md @@ -39,16 +39,17 @@ Output: sharded CSV files in `db/seed-data/synthetic/` named `{table}_{shard}.cs Tables generated: `user`, `project`, `label`, `issue`, `comment`, `issueLabel`. -| Env Var | Default | Description | -| -------------------- | ------------------------- | -------------------------------- | -| `NUM_ISSUES` | `1000000` | Total issues to generate | -| `NUM_PROJECTS` | `100` | Total projects | -| `NUM_USERS` | `100` | Total users | -| `COMMENTS_PER_ISSUE` | `3.0` | Average comments per issue | -| `LABELS_PER_ISSUE` | `1.5` | Average labels per issue | -| `SHARD_SIZE` | `500000` | Rows per CSV shard file | -| `OUTPUT_DIR` | `db/seed-data/synthetic/` | Output directory | -| `SEED` | `42` | RNG seed for reproducible output | +| Env Var | Default | Description | +| -------------------- | ------------------------- | ----------------------------------------- | +| `NUM_ISSUES` | `1000000` | Total issues to generate | +| `NUM_PROJECTS` | `100` | Total projects | +| `NUM_USERS` | `100` | Total users | +| `COMMENTS_PER_ISSUE` | `3.0` | Average comments per issue | +| `LABELS_PER_ISSUE` | `1.5` | Average labels per issue | +| `SHARD_SIZE` | `500000` | Rows per CSV shard file | +| `OUTPUT_DIR` | `db/seed-data/synthetic/` | Output directory | +| `SEED` | `42` | RNG seed for reproducible output | +| `SKIP_USERS` | `false` | Skip user CSV generation (for batch mode) | ### Distribution Strategy @@ -115,12 +116,44 @@ To force re-seeding an already-seeded database: ZERO_SEED_FORCE=true npm run db-seed-synthetic ``` -| Env Var | Default | Description | -| -------------------- | ----------------- | -------------------------------------------- | -| `ZERO_UPSTREAM_DB` | _(from `.env`)_ | PostgreSQL connection string | -| `ZERO_SEED_BULK` | _(set by script)_ | Enables bulk load optimizations | -| `ZERO_SEED_DATA_DIR` | _(set by script)_ | Directory containing CSV shards | -| `ZERO_SEED_FORCE` | _(unset)_ | Set to `true` to re-seed even if data exists | +| Env Var | Default | Description | +| -------------------- | ----------------- | ----------------------------------------------- | +| `ZERO_UPSTREAM_DB` | _(from `.env`)_ | PostgreSQL connection string | +| `ZERO_SEED_BULK` | _(set by script)_ | Enables bulk load optimizations | +| `ZERO_SEED_DATA_DIR` | _(set by script)_ | Directory containing CSV shards | +| `ZERO_SEED_FORCE` | _(unset)_ | Set to `true` to re-seed even if data exists | +| `ZERO_SEED_APPEND` | _(unset)_ | Set to `true` to append data without truncating | + +## Generating Additional Batches + +You can generate multiple batches of data that coexist in the same database without ID collisions. Non-user entity IDs use seeded nanoid, so different seeds produce globally unique IDs. + +### Batch Workflow + +```bash +# Batch 1: generate and load the initial dataset +NUM_ISSUES=100000000 NUM_PROJECTS=100 SEED=42 npm run generate-synthetic +npm run db-seed-synthetic + +# Batch 2: generate additional data with a different seed +NUM_ISSUES=100000000 NUM_PROJECTS=1000 \ + SKIP_USERS=true \ + SEED=99 \ + OUTPUT_DIR=db/seed-data/synthetic-batch-2/ \ + npm run generate-synthetic + +# Load batch 2 in append mode +ZERO_SEED_APPEND=true \ + ZERO_SEED_DATA_DIR=db/seed-data/synthetic-batch-2/ \ + npm run db-seed-synthetic +``` + +### Key points + +- **Different `SEED` per batch** — each seed produces a different RNG sequence, yielding unique nanoid IDs and different content. +- **`SKIP_USERS=true`** — skips writing the user CSV since users are shared across batches. User IDs are sequential (`usr_0000`, `usr_0001`, ...) and are always the same regardless of `SEED`. +- **`ZERO_SEED_APPEND=true`** — tells the seeder to skip the "already seeded" check and skip truncation, appending data to existing tables. Bulk optimizations (drop indexes, COPY, recreate indexes, ANALYZE) still run. +- **`OUTPUT_DIR`** — point each batch at a separate directory so CSVs don't overwrite each other. ## Verification diff --git a/apps/zbugs/scripts/generate-synthetic.ts b/apps/zbugs/scripts/generate-synthetic.ts index 0e596a751f..50d501de81 100644 --- a/apps/zbugs/scripts/generate-synthetic.ts +++ b/apps/zbugs/scripts/generate-synthetic.ts @@ -16,6 +16,7 @@ * SHARD_SIZE - rows per CSV shard (default 500000) * OUTPUT_DIR - output directory (default db/seed-data/synthetic/) * SEED - RNG seed for reproducibility (default 42) + * SKIP_USERS - when "true", skip user CSV generation (default false) */ import * as fs from 'fs'; @@ -35,6 +36,7 @@ const OUTPUT_DIR = path.resolve( process.env.OUTPUT_DIR ?? path.join(__dirname, '../db/seed-data/synthetic/'), ); const SEED = parseInt(process.env.SEED ?? '42', 10); +const SKIP_USERS = process.env.SKIP_USERS === 'true'; const TEMPLATES_DIR = path.join(__dirname, '../db/seed-data/templates'); // --- Seeded PRNG (mulberry32) --- @@ -61,6 +63,18 @@ function pick(arr: readonly T[]): T { return arr[Math.floor(rng() * arr.length)]; } +// --- Seeded nanoid --- +const NANOID_ALPHABET = + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-'; + +function seededNanoid(size = 21): string { + let id = ''; + for (let i = 0; i < size; i++) { + id += NANOID_ALPHABET[Math.floor(rng() * NANOID_ALPHABET.length)]; + } + return id; +} + // --- Pareto/Power-law distribution helpers --- /** * Assigns numItems to buckets using power-law distribution. @@ -439,12 +453,12 @@ async function main() { for (let pi = 0; pi < projectCount; pi++) { if (allProjects.length >= NUM_PROJECTS) break; const proj = cat.projects[pi]; - const projectID = `proj_${String(allProjects.length).padStart(3, '0')}`; + const projectID = seededNanoid(); const labelIDs: string[] = []; // Generate labels for this project for (let li = 0; li < cat.labels.length; li++) { - const labelID = `lbl_${projectID}_${String(li).padStart(2, '0')}`; + const labelID = seededNanoid(); allLabels.push({ id: labelID, name: cat.labels[li], @@ -491,27 +505,32 @@ async function main() { }); } - // Write users CSV - const userWriter = new ShardedCSVWriter( - OUTPUT_DIR, - 'user', - 'id,login,name,avatar,role,githubID,email', - SHARD_SIZE, - ); - for (const u of users) { - await userWriter.writeRow( - [ - u.id, - u.login, - escapeCSV(u.name), - u.avatar, - u.role, - String(u.githubID), - u.email, - ].join(','), + // Write users CSV (skip if SKIP_USERS=true, e.g. when appending a batch) + if (SKIP_USERS) { + // oxlint-disable-next-line no-console + console.log(' Skipping user CSV generation (SKIP_USERS=true)'); + } else { + const userWriter = new ShardedCSVWriter( + OUTPUT_DIR, + 'user', + 'id,login,name,avatar,role,githubID,email', + SHARD_SIZE, ); + for (const u of users) { + await userWriter.writeRow( + [ + u.id, + u.login, + escapeCSV(u.name), + u.avatar, + u.role, + String(u.githubID), + u.email, + ].join(','), + ); + } + await userWriter.close(); } - await userWriter.close(); // Write projects CSV // oxlint-disable-next-line no-console @@ -578,6 +597,12 @@ async function main() { endDate.getDate(), ); + // Pre-generate all issue IDs so comments and labels can reference them + const issueIDs = new Array(NUM_ISSUES); + for (let i = 0; i < NUM_ISSUES; i++) { + issueIDs[i] = seededNanoid(); + } + for (let i = 0; i < NUM_ISSUES; i++) { if (i % 100000 === 0) { // oxlint-disable-next-line no-console @@ -586,7 +611,7 @@ async function main() { ); } - const issueID = `iss_${String(i).padStart(9, '0')}`; + const issueID = issueIDs[i]; const projectIdx = issueProjects[i]; const project = allProjects[projectIdx]; const cat = categories[project.categoryIndex]; @@ -657,7 +682,7 @@ async function main() { ); } - const issueID = `iss_${String(issueIdx).padStart(9, '0')}`; + const issueID = issueIDs[issueIdx]; const projectIdx = issueProjects[issueIdx]; const project = allProjects[projectIdx]; const cat = categories[project.categoryIndex]; @@ -670,7 +695,8 @@ async function main() { .getTime(); for (let c = 0; c < numComments; c++) { - const commentID = `cmt_${String(commentIdx++).padStart(9, '0')}`; + const commentID = seededNanoid(); + commentIdx++; // Generate body from template const bodyTemplate = @@ -716,7 +742,7 @@ async function main() { ); } - const issueID = `iss_${String(issueIdx).padStart(9, '0')}`; + const issueID = issueIDs[issueIdx]; const projectIdx = issueProjects[issueIdx]; const project = allProjects[projectIdx]; diff --git a/apps/zbugs/scripts/seed.ts b/apps/zbugs/scripts/seed.ts index c464177085..03318903ba 100644 --- a/apps/zbugs/scripts/seed.ts +++ b/apps/zbugs/scripts/seed.ts @@ -136,6 +136,12 @@ async function seed() { process.env.ZERO_SEED_FORCE.toLocaleLowerCase().trim(), ) !== -1; + const appendMode = + process.env.ZERO_SEED_APPEND !== undefined && + ['t', 'true', '1', ''].indexOf( + process.env.ZERO_SEED_APPEND.toLocaleLowerCase().trim(), + ) !== -1; + // oxlint-disable-next-line no-console console.log(process.env.ZERO_UPSTREAM_DB); @@ -161,8 +167,8 @@ async function seed() { process.exit(0); } - // Check if already seeded - if (!forceSeed) { + // Check if already seeded (skip in append mode) + if (!forceSeed && !appendMode) { const result = await sql`select 1 from "user" limit 1`; if (result.length === 1) { // oxlint-disable-next-line no-console @@ -171,8 +177,8 @@ async function seed() { } } - // If forcing, truncate existing data - if (forceSeed) { + // If forcing (not appending), truncate existing data + if (forceSeed && !appendMode) { // oxlint-disable-next-line no-console console.log('Force mode: truncating existing data...'); // Truncate in reverse order to respect foreign key dependencies @@ -181,6 +187,11 @@ async function seed() { } } + if (appendMode) { + // oxlint-disable-next-line no-console + console.log('Append mode: adding data to existing tables...'); + } + // Discover all tables in public schema for comprehensive discovery const allTablesResult = await sql<{tablename: string}[]>` SELECT tablename FROM pg_tables WHERE schemaname = 'public' From 53f6b8f31f0d8b657f649c019edc31b024a097ca Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 30 Jan 2026 17:16:07 -0800 Subject: [PATCH 004/495] chore(zero-cache): define backfill metadata and track in change-db (#5498) Defines the `BackfillID` type in the change protocol used to signal when columns need to be backfilled. Implements the metadata-state-tracking responsibility of the change-streamer to track these IDs, and the table metadata, such that it always has a consistent (with the replica) view of the metadata associated with the backfilling columns. The information is presented to the change-source when a stream is started in order to resume any backfills that did not complete on the previous session. This is akin to the contract of browsers and HTTP cookie, except in this case the change-stream has special logic for updating the state that it stores. (Note that actual implementation of backfill is yet to be implemented) Upcoming: * Similar state tracking in the replica * Additionally, hiding of the columns based on the backfilling metadata in the replica --- .../services/change-source/change-source.ts | 6 +- .../change-source/custom/change-source.ts | 15 +- .../change-source/pg/change-source.ts | 10 +- .../change-source/protocol/current/data.ts | 36 +- .../protocol/current/upstream.ts | 30 +- .../change-source/protocol/version.test.ts | 4 +- .../change-streamer-service.ts | 8 +- .../services/change-streamer/schema/init.ts | 8 + .../change-streamer/schema/tables.pg.test.ts | 70 +- .../services/change-streamer/schema/tables.ts | 43 +- .../change-streamer/storer.pg.test.ts | 616 ++++++++++++++++++ .../src/services/change-streamer/storer.ts | 180 ++++- 12 files changed, 985 insertions(+), 41 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/change-source.ts b/packages/zero-cache/src/services/change-source/change-source.ts index b8df8a9637..1f8a0c5282 100644 --- a/packages/zero-cache/src/services/change-source/change-source.ts +++ b/packages/zero-cache/src/services/change-source/change-source.ts @@ -1,5 +1,6 @@ import type {Sink, Source} from '../../types/streams.ts'; import type { + BackfillRequest, ChangeSourceUpstream, ChangeStreamMessage, } from './protocol/current.ts'; @@ -20,5 +21,8 @@ export interface ChangeSource { * Starts a stream of changes starting after the specific watermark, * with a corresponding sink for upstream acknowledgements. */ - startStream(afterWatermark: string): Promise; + startStream( + afterWatermark: string, + backfillRequests?: BackfillRequest[], + ): Promise; } diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.ts b/packages/zero-cache/src/services/change-source/custom/change-source.ts index 92a1cb5bae..7dc1a27f22 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.ts @@ -22,7 +22,10 @@ import { } from '../../replicator/schema/replication-state.ts'; import type {ChangeSource, ChangeStream} from '../change-source.ts'; import {changeStreamMessageSchema} from '../protocol/current/downstream.ts'; -import {type ChangeSourceUpstream} from '../protocol/current/upstream.ts'; +import { + type BackfillRequest, + type ChangeSourceUpstream, +} from '../protocol/current/upstream.ts'; import {initSyncSchema} from './sync-schema.ts'; /** @@ -90,7 +93,15 @@ class CustomChangeSource implements ChangeSource { return this.#startStream(); } - startStream(clientWatermark: string): Promise { + startStream( + clientWatermark: string, + backfillRequests: BackfillRequest[] = [], + ): Promise { + if (backfillRequests?.length) { + throw new Error( + 'backfill is yet not supported for custom change sources', + ); + } return Promise.resolve(this.#startStream(clientWatermark)); } diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 6402d1b414..68ee034cd4 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -42,7 +42,7 @@ import { type SubscriptionState, } from '../../replicator/schema/replication-state.ts'; import type {ChangeSource, ChangeStream} from '../change-source.ts'; -import type {JSONObject} from '../protocol/current.ts'; +import type {BackfillRequest, JSONObject} from '../protocol/current.ts'; import type { DataChange, Identifier, @@ -228,7 +228,13 @@ class PostgresChangeSource implements ChangeSource { this.#replica = replica; } - async startStream(clientWatermark: string): Promise { + async startStream( + clientWatermark: string, + backfillRequests: BackfillRequest[] = [], + ): Promise { + if (backfillRequests.length) { + throw new Error('not implemented yet'); + } const db = pgClient(this.#lc, this.#upstreamUri, {}, 'json-as-string'); const {slot} = this.#replica; diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.ts index f73a2c721b..e9b450a7ce 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/data.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.ts @@ -122,13 +122,25 @@ export const truncateSchema = v.object({ relations: v.array(relationSchema), }); -const identifierSchema = v.object({ +export const identifierSchema = v.object({ schema: v.string(), name: v.string(), }); export type Identifier = v.Infer; +// A BackfillID is an upstream specific stable identifier for a column +// that needs backfilling. This id is used to ensure that the schema, table, +// and column names of a requested backfill still match the original +// underlying upstream ID. +// +// The change-streamer stores these IDs as opaque values while a column is +// being backfilled, and initiates new change-source streams with the IDs +// in order to restart backfills that did not complete in previous sessions. +export const backfillIDSchema = v.record(v.union(v.number(), v.string())); + +export type BackfillID = v.Infer; + export const createTableSchema = v.object({ tag: v.literal('create-table'), spec: tableSpec, @@ -138,6 +150,25 @@ export const createTableSchema = v.object({ // // TODO: to simplify the protocol, see if we can make this required metadata: tableMetadataSchema.optional(), + + // Indicate that columns of the table require backfilling. These columns + // should be created on the replica but not yet synced the clients. + // + // ## State Persistence + // + // To obviate the need for change-source implementations to persist state + // related to backfill progress, the change-source only tracks backfills + // **for the current session**. In the event that the session is interrupted + // before columns have been fully backfilled, it is the responsibility of the + // change-streamer to send {@link BackfillRequest}s when it reconnects. + // + // This means that the change-streamer must track and persist: + // * the backfill IDs of the columns requiring backfilling + // * the most current table metadata of the associated table(s) + // + // The change-streamer then uses this information to send backfill requests + // when it reconnects. + backfill: v.record(backfillIDSchema).optional(), }); export const renameTableSchema = v.object({ @@ -168,6 +199,9 @@ export const addColumnSchema = v.object({ // // TODO: to simplify the protocol, see if we can make this required tableMetadata: tableMetadataSchema.optional(), + + // See documentation for the `backfill` field of the `create-table` change. + backfill: backfillIDSchema.optional(), }); export const updateColumnSchema = v.object({ diff --git a/packages/zero-cache/src/services/change-source/protocol/current/upstream.ts b/packages/zero-cache/src/services/change-source/protocol/current/upstream.ts index ff7b45b48d..293c580e17 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/upstream.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/upstream.ts @@ -1,6 +1,34 @@ -import type * as v from '../../../../../../shared/src/valita.ts'; +import * as v from '../../../../../../shared/src/valita.ts'; +import { + backfillIDSchema, + identifierSchema, + tableMetadataSchema, +} from './data.ts'; import {statusMessageSchema} from './status.ts'; /** At the moment, the only upstream messages are status messages. */ export const changeSourceUpstreamSchema = statusMessageSchema; export type ChangeSourceUpstream = v.Infer; + +/** + * Contains the information for requesting a backfill of columns in a table. + * Backfills are automatically started for new tables and columns in a given + * change stream session; however, if the session is terminated before the + * backfill completes, it must be restarted with appropriate + * {@link BackfillRequest}s when creating a new session. + * + * The `change-streamer` is responsible for tracking any changes to the table + * name, column names, or table metadata, and constructing a BackfillRequest + * based on the current values (which may be different from when the + * tables/columns were originally added). + */ +export const backfillRequestSchema = v.object({ + table: identifierSchema.extend({ + // The table metadata is set to null if it is never specified by the + // change-source. + metadata: tableMetadataSchema.nullable(), + }), + columns: v.record(backfillIDSchema), +}); + +export type BackfillRequest = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index 668784040d..c1b869d68c 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '3uab2fcgb4oxj', '/changes/v0/stream'); + t(current, '4zimue6d5cl1', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '3uab2fcgb4oxj', '/changes/v0/stream'); + t(v0, '4zimue6d5cl1', '/changes/v0/stream'); }); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 47fb22a2cc..f4321858f2 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -319,8 +319,12 @@ class ChangeStreamerImpl implements ChangeStreamerService { let err: unknown; let watermark: string | null = null; try { - const startAfter = await this.#storer.getLastWatermarkToStartStream(); - const stream = await this.#source.startStream(startAfter); + const {lastWatermark, backfillRequests} = + await this.#storer.getStartStreamInitializationParameters(); + const stream = await this.#source.startStream( + lastWatermark, + backfillRequests, + ); this.#stream = stream; this.#state.resetBackoff(); watermark = null; diff --git a/packages/zero-cache/src/services/change-streamer/schema/init.ts b/packages/zero-cache/src/services/change-streamer/schema/init.ts index 01c381cab5..67a98b1d03 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/init.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/init.ts @@ -7,6 +7,7 @@ import { import type {PostgresDB, PostgresTransaction} from '../../../types/pg.ts'; import {cdcSchema, type ShardID} from '../../../types/shards.ts'; import { + createBackfillTables, createReplicationStateTable, setupCDCTables, type ReplicationState, @@ -91,11 +92,18 @@ export async function initChangeStreamerSchema( }, }; + const migrateV5ToV6 = { + migrateSchema: async (_: LogContext, db: PostgresTransaction) => { + await db.unsafe(createBackfillTables(shard)); + }, + }; + const schemaVersionMigrationMap: IncrementalMigrationMap = { 2: {migrateSchema: migrateV1toV2}, 3: migrateV2ToV3, 4: migrateV3ToV4, 5: migrateV4ToV5, + 6: migrateV5ToV6, }; await runSchemaMigrations( diff --git a/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts b/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts index fafc2a3975..499c29f40c 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts @@ -13,17 +13,17 @@ import { describe('change-streamer/schema/tables', () => { const lc = createSilentLogContext(); - let db: PostgresDB; + let sql: PostgresDB; const APP_ID = 'rezo'; const SHARD_NUM = 8; const shard = {appID: APP_ID, shardNum: SHARD_NUM}; beforeEach(async ({testDBs}) => { - db = await testDBs.create('change_streamer_schema_tables'); - await db.begin(tx => setupCDCTables(lc, tx, shard)); + sql = await testDBs.create('change_streamer_schema_tables'); + await sql.begin(tx => setupCDCTables(lc, tx, shard)); - return () => testDBs.drop(db); + return () => testDBs.drop(sql); }); test('ensureReplicationConfig', async () => { @@ -32,7 +32,7 @@ describe('change-streamer/schema/tables', () => { await ensureReplicationConfig( lc, - db, + sql, { replicaVersion: '183', publications: ['zero_data', 'zero_metadata'], @@ -42,7 +42,7 @@ describe('change-streamer/schema/tables', () => { true, ); - await expectTables(db, { + await expectTables(sql, { ['rezo_8/cdc.replicationConfig']: [ { replicaVersion: '183', @@ -62,17 +62,21 @@ describe('change-streamer/schema/tables', () => { ['rezo_8/cdc.changeLog']: [], }); - await db` + await sql` INSERT INTO "rezo_8/cdc"."changeLog" (watermark, pos, change) - values ('184', 1, JSONB('{"foo":"bar"}')); + VALUES ('184', 1, JSONB('{"foo":"bar"}')); UPDATE "rezo_8/cdc"."replicationState" SET "lastWatermark" = '184', owner = 'my-task'; + INSERT INTO "rezo_8/cdc"."tableMetadata" (schema, "table", metadata) + VALUES ('public', 'foo', '{"foo":"bar"}'); + INSERT INTO "rezo_8/cdc"."backfilling" (schema, "table", "column", backfill) + VALUES ('public', 'foo', 'boo', '{"id":123}'); `.simple(); // Should be a no-op. await ensureReplicationConfig( lc, - db, + sql, { replicaVersion: '183', publications: ['zero_metadata', 'zero_data'], @@ -82,7 +86,7 @@ describe('change-streamer/schema/tables', () => { true, ); - await expectTables(db, { + await expectTables(sql, { ['rezo_8/cdc.replicationConfig']: [ { replicaVersion: '183', @@ -107,10 +111,25 @@ describe('change-streamer/schema/tables', () => { precommit: null, }, ], + ['rezo_8/cdc.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + metadata: {foo: 'bar'}, + }, + ], + ['rezo_8/cdc.backfilling']: [ + { + schema: 'public', + table: 'foo', + column: 'boo', + backfill: {id: 123}, + }, + ], }); - await markResetRequired(db, shard); - await expectTables(db, { + await markResetRequired(sql, shard); + await expectTables(sql, { ['rezo_8/cdc.replicationConfig']: [ { replicaVersion: '183', @@ -127,12 +146,27 @@ describe('change-streamer/schema/tables', () => { lock: 1, }, ], + ['rezo_8/cdc.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + metadata: {foo: 'bar'}, + }, + ], + ['rezo_8/cdc.backfilling']: [ + { + schema: 'public', + table: 'foo', + column: 'boo', + backfill: {id: 123}, + }, + ], }); // Should not affect auto-reset = false (i.e. no-op). await ensureReplicationConfig( lc, - db, + sql, { replicaVersion: '183', publications: ['zero_metadata', 'zero_data'], @@ -146,7 +180,7 @@ describe('change-streamer/schema/tables', () => { await expect( ensureReplicationConfig( lc, - db, + sql, { replicaVersion: '183', publications: ['zero_metadata', 'zero_data'], @@ -160,7 +194,7 @@ describe('change-streamer/schema/tables', () => { // Different replica version should wipe the tables. await ensureReplicationConfig( lc, - db, + sql, { replicaVersion: '1g8', publications: ['zero_data', 'zero_metadata'], @@ -170,7 +204,7 @@ describe('change-streamer/schema/tables', () => { true, ); - await expectTables(db, { + await expectTables(sql, { ['rezo_8/cdc.replicationConfig']: [ { replicaVersion: '1g8', @@ -188,6 +222,8 @@ describe('change-streamer/schema/tables', () => { }, ], ['rezo_8/cdc.changeLog']: [], + ['rezo_8/cdc.tableMetadata']: [], + ['rezo_8/cdc.backfilling']: [], }); // Different replica version at a non-initial watermark @@ -195,7 +231,7 @@ describe('change-streamer/schema/tables', () => { await expect( ensureReplicationConfig( lc, - db, + sql, { replicaVersion: '1gg', publications: ['zero_data', 'zero_metadata'], diff --git a/packages/zero-cache/src/services/change-streamer/schema/tables.ts b/packages/zero-cache/src/services/change-streamer/schema/tables.ts index b8e8a7fa55..fc041880cc 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/tables.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/tables.ts @@ -6,7 +6,11 @@ import {AbortError} from '../../../../../shared/src/abort-error.ts'; import {equals} from '../../../../../shared/src/set-utils.ts'; import {disableStatementTimeout, type PostgresDB} from '../../../types/pg.ts'; import {cdcSchema, type ShardID} from '../../../types/shards.ts'; -import type {Change} from '../../change-source/protocol/current/data.ts'; +import type { + BackfillID, + Change, + TableMetadata, +} from '../../change-source/protocol/current/data.ts'; import type {SubscriptionState} from '../../replicator/schema/replication-state.ts'; // For readability in the sql statements. @@ -94,12 +98,45 @@ function createReplicationConfigTable(shard: ShardID) { `; } +export function createBackfillTables(shard: ShardID) { + return /*sql*/ ` + CREATE TABLE ${schema(shard)}."tableMetadata" ( + "schema" TEXT NOT NULL, + "table" TEXT NOT NULL, + "metadata" JSONB NOT NULL, + PRIMARY KEY("schema", "table") + ); + + CREATE TABLE ${schema(shard)}."backfilling" ( + "schema" TEXT NOT NULL, + "table" TEXT NOT NULL, + "column" TEXT NOT NULL, + "backfill" JSONB NOT NULL, + PRIMARY KEY("schema", "table", "column") + ); + `; +} + +export type TableMetadataRow = { + schema: string; + table: string; + metadata: TableMetadata; +}; + +export type BackfillingColumn = { + schema: string; + table: string; + column: string; + backfill: BackfillID; +}; + function createTables(shard: ShardID) { return ( createSchema(shard) + createChangeLogTable(shard) + createReplicationStateTable(shard) + - createReplicationConfigTable(shard) + createReplicationConfigTable(shard) + + createBackfillTables(shard) ); } @@ -176,6 +213,8 @@ export async function ensureReplicationConfig( stmts.push( sql`TRUNCATE TABLE ${sql(schema)}."changeLog"`, sql`TRUNCATE TABLE ${sql(schema)}."replicationConfig"`, + sql`TRUNCATE TABLE ${sql(schema)}."tableMetadata"`, + sql`TRUNCATE TABLE ${sql(schema)}."backfilling"`, ); } } diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 202bb971b2..261d1dc7cd 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -154,6 +154,622 @@ describe('change-streamer/storer', () => { ]); }); + test('backfill metadata tracking', async () => { + expect( + await storer.getStartStreamInitializationParameters(), + ).toMatchObject({lastWatermark: '06', backfillRequests: []}); + + storer.store([ + '08', + ['begin', messages.begin(), {commitWatermark: '08'}], + ]); + storer.store(['08', ['commit', messages.commit(), {watermark: '08'}]]); + + expect( + await storer.getStartStreamInitializationParameters(), + ).toMatchObject({lastWatermark: '08', backfillRequests: []}); + + // Add table metadata. This should be stored, but not returned in + // initialization parameters without any backfill data. + storer.store([ + '09', + ['begin', messages.begin(), {commitWatermark: '09'}], + ]); + storer.store([ + '09', + [ + 'data', + { + tag: 'create-table', + spec: { + schema: 'my', + name: 'foo', + columns: {}, + }, + metadata: { + rowKey: {type: 'index', columns: ['a', 'b']}, + }, + }, + ], + ]); + storer.store(['09', ['commit', messages.commit(), {watermark: '09'}]]); + + // No backfillRequests should be present. + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [], + "lastWatermark": "09", + } + `); + + // Add a different table with backfill metadata only. + storer.store([ + '0a', + ['begin', messages.begin(), {commitWatermark: '0a'}], + ]); + storer.store([ + '0a', + [ + 'data', + { + tag: 'create-table', + spec: { + schema: 'your', + name: 'bar', + columns: {}, + }, + backfill: { + a: {fooID: 987, barID: 'zoo'}, + b: {fooID: 843, barID: 'ozz'}, + }, + }, + ], + ]); + storer.store(['0a', ['commit', messages.commit(), {watermark: '0a'}]]); + + // The table should appear in the backfillRequests, with null metadata + // since none was ever specified. + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [ + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "b": { + "barID": "ozz", + "fooID": 843, + }, + }, + "metadata": null, + "name": "bar", + "schema": "your", + }, + ], + "lastWatermark": "0a", + } + `); + + // Add a column to the original table backfill metadata. + storer.store([ + '0b', + ['begin', messages.begin(), {commitWatermark: '0a'}], + ]); + storer.store([ + '0b', + [ + 'data', + { + tag: 'add-column', + table: { + schema: 'my', + name: 'foo', + }, + column: {name: 'c', spec: {pos: 3, dataType: 'text'}}, + backfill: {fooID: 123, barID: 'baz'}, + }, + ], + ]); + storer.store(['0b', ['commit', messages.commit(), {watermark: '0b'}]]); + + // Now the original table shows up in the backfillRequests, with its + // table metadata. + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [ + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "b": { + "barID": "ozz", + "fooID": 843, + }, + }, + "metadata": null, + "name": "bar", + "schema": "your", + }, + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "a", + "b", + ], + "type": "index", + }, + }, + "name": "foo", + "schema": "my", + }, + ], + "lastWatermark": "0b", + } + `); + + // Add another column to the same table with new table metadata. + storer.store([ + '0c', + ['begin', messages.begin(), {commitWatermark: '0b'}], + ]); + storer.store([ + '0c', + [ + 'data', + { + tag: 'add-column', + table: { + schema: 'my', + name: 'foo', + }, + tableMetadata: { + rowKey: {type: 'default', columns: ['b']}, + }, + column: {name: 'd', spec: {pos: 4, dataType: 'text'}}, + backfill: {fooID: 456, barID: 'boo'}, + }, + ], + ]); + storer.store(['0c', ['commit', messages.commit(), {watermark: '0c'}]]); + + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", + }, + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "b": { + "barID": "ozz", + "fooID": 843, + }, + }, + "metadata": null, + "name": "bar", + "schema": "your", + }, + ], + "lastWatermark": "0c", + } + `); + + // Update the table metadata of the new table. + storer.store([ + '0d', + ['begin', messages.begin(), {commitWatermark: '0c'}], + ]); + storer.store([ + '0d', + [ + 'data', + { + tag: 'update-table-metadata', + table: { + schema: 'your', + name: 'bar', + }, + old: { + rowKey: {type: 'full', columns: ['a', 'b']}, + }, + new: { + rowKey: {type: 'default', columns: ['a']}, + }, + }, + ], + ]); + storer.store(['0d', ['commit', messages.commit(), {watermark: '0d'}]]); + + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", + }, + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "b": { + "barID": "ozz", + "fooID": 843, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "a", + ], + "type": "default", + }, + }, + "name": "bar", + "schema": "your", + }, + ], + "lastWatermark": "0d", + } + `); + + // Rename one of the backfilling columns + storer.store([ + '0e', + ['begin', messages.begin(), {commitWatermark: '0e'}], + ]); + storer.store([ + '0e', + [ + 'data', + { + tag: 'update-column', + table: { + schema: 'your', + name: 'bar', + }, + old: { + name: 'b', + spec: {pos: 2, dataType: 'text'}, + }, + new: { + name: 'newName', + spec: {pos: 2, dataType: 'text'}, + }, + }, + ], + ]); + storer.store(['0e', ['commit', messages.commit(), {watermark: '0e'}]]); + + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", + }, + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "newName": { + "barID": "ozz", + "fooID": 843, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "a", + ], + "type": "default", + }, + }, + "name": "bar", + "schema": "your", + }, + ], + "lastWatermark": "0e", + } + `); + + // Drop a backfilling column. + storer.store([ + '0f', + ['begin', messages.begin(), {commitWatermark: '0f'}], + ]); + storer.store([ + '0f', + [ + 'data', + { + tag: 'drop-column', + table: { + schema: 'your', + name: 'bar', + }, + column: 'newName', + }, + ], + ]); + storer.store(['0f', ['commit', messages.commit(), {watermark: '0f'}]]); + + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", + }, + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "a", + ], + "type": "default", + }, + }, + "name": "bar", + "schema": "your", + }, + ], + "lastWatermark": "0f", + } + `); + + // Drop the other backfilling column. + storer.store([ + '110', + ['begin', messages.begin(), {commitWatermark: '110'}], + ]); + storer.store([ + '110', + [ + 'data', + { + tag: 'drop-column', + table: { + schema: 'your', + name: 'bar', + }, + column: 'a', + }, + ], + ]); + storer.store(['110', ['commit', messages.commit(), {watermark: '110'}]]); + + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", + }, + ], + "lastWatermark": "110", + } + `); + + // Rename the backfilling table, and a contained column in the same tx. + storer.store([ + '111', + ['begin', messages.begin(), {commitWatermark: '111'}], + ]); + storer.store([ + '111', + [ + 'data', + { + tag: 'rename-table', + old: {schema: 'my', name: 'foo'}, + new: {schema: 'your', name: 'bloo'}, + }, + ], + ]); + storer.store([ + '111', + [ + 'data', + { + tag: 'update-column', + table: { + schema: 'your', + name: 'bloo', + }, + old: { + name: 'd', + spec: {pos: 2, dataType: 'text'}, + }, + new: { + name: 'deez', + spec: {pos: 2, dataType: 'text'}, + }, + }, + ], + ]); + storer.store(['111', ['commit', messages.commit(), {watermark: '111'}]]); + + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "deez": { + "barID": "boo", + "fooID": 456, + }, + }, + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "bloo", + "schema": "your", + }, + ], + "lastWatermark": "111", + } + `); + + // Drop the backfilling table + storer.store([ + '112', + ['begin', messages.begin(), {commitWatermark: '112'}], + ]); + storer.store([ + '112', + [ + 'data', + { + tag: 'drop-table', + id: {schema: 'your', name: 'bloo'}, + }, + ], + ]); + storer.store(['112', ['commit', messages.commit(), {watermark: '112'}]]); + + expect(await storer.getStartStreamInitializationParameters()) + .toMatchInlineSnapshot(` + { + "backfillRequests": Result [], + "lastWatermark": "112", + } + `); + }); + test('non-owner purge prevented', async () => { await db`UPDATE "xero_5/cdc"."replicationState" SET owner = 'different-task-id'`; diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 56ecc108f2..aab01e5a91 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -1,16 +1,26 @@ import {PG_SERIALIZATION_FAILURE} from '@drdgvhbh/postgres-error-codes'; import type {LogContext} from '@rocicorp/logger'; import {resolver, type Resolver} from '@rocicorp/resolver'; -import postgres from 'postgres'; +import postgres, {type PendingQuery, type Row} from 'postgres'; import {AbortError} from '../../../../shared/src/abort-error.ts'; import {assert} from '../../../../shared/src/asserts.ts'; -import {type JSONValue} from '../../../../shared/src/bigint-json.ts'; import {Queue} from '../../../../shared/src/queue.ts'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; import * as Mode from '../../db/mode-enum.ts'; import {TransactionPool} from '../../db/transaction-pool.ts'; -import {disableStatementTimeout, type PostgresDB} from '../../types/pg.ts'; +import { + disableStatementTimeout, + type PostgresDB, + type PostgresTransaction, +} from '../../types/pg.ts'; import {cdcSchema, type ShardID} from '../../types/shards.ts'; +import type { + BackfillID, + BackfillRequest, + DataChange, + Identifier, + TableMetadata, +} from '../change-source/protocol/current.ts'; import {type Commit} from '../change-source/protocol/current/downstream.ts'; import type {StatusMessage} from '../change-source/protocol/current/status.ts'; import type {ReplicatorMode} from '../replicator/replicator.ts'; @@ -21,7 +31,9 @@ import * as ErrorType from './error-type-enum.ts'; import { AutoResetSignal, markResetRequired, + type BackfillingColumn, type ReplicationState, + type TableMetadataRow, } from './schema/tables.ts'; import type {Subscriber} from './subscriber.ts'; @@ -134,7 +146,10 @@ export class Storer implements Service { this.#lc.info?.(`assumed ownership at ${addressWithProtocol}`); } - async getLastWatermarkToStartStream(): Promise { + async getStartStreamInitializationParameters(): Promise<{ + lastWatermark: string; + backfillRequests: BackfillRequest[]; + }> { // Before starting or restarting a stream from the change source, // wait for all queued changes to be processed so that we pick up // from the right spot. @@ -142,9 +157,27 @@ export class Storer implements Service { this.#queue.enqueue(['ready', resolve]); await ready; - const [{lastWatermark}] = await this.#db<{lastWatermark: string}[]>` - SELECT "lastWatermark" FROM ${this.#cdc('replicationState')}`; - return lastWatermark; + const [[{lastWatermark}], backfillRequests] = await this.#db.begin( + Mode.READONLY, + sql => [ + sql<{lastWatermark: string}[]>` + SELECT "lastWatermark" FROM ${this.#cdc('replicationState')}`, + + // Formats a BackfillRequest using json_object_agg() to construct the + // `columns` object. It is LEFT JOIN'ed with the `tableMetadata` table + // to make it optional and possibly `null`. + sql` + SELECT b."schema", b."table" as name, t."metadata", + json_object_agg(b."column", b."backfill") as columns + FROM ${this.#cdc('backfilling')} as b + LEFT JOIN ${this.#cdc('tableMetadata')} as t + ON (b."schema" = t."schema" AND b."table" = t."table") + GROUP BY b."schema", b."table", t."metadata" + `, + ], + ); + + return {lastWatermark, backfillRequests}; } async getMinWatermarkForCatchup(): Promise { @@ -319,12 +352,12 @@ export class Storer implements Service { watermark: tag === 'commit' ? watermark : tx.preCommitWatermark, precommit: tag === 'commit' ? tx.preCommitWatermark : null, pos: tx.pos, - change: change as unknown as JSONValue, + change, }; - const processed = tx.pool.process(tx => [ - tx` - INSERT INTO ${this.#cdc('changeLog')} ${tx(entry)}`, + const processed = tx.pool.process(sql => [ + sql`INSERT INTO ${this.#cdc('changeLog')} ${sql(entry)}`, + ...(tag === 'data' ? this.#trackBackfillMetadata(sql, change) : []), ]); if (tag === 'data' && tx.pos % 10_000 === 0) { @@ -491,6 +524,131 @@ export class Storer implements Service { } } + /** + * Returns the db statements necessary to track backfill and table metadata + * presented in the `change`, if any. + */ + #trackBackfillMetadata(sql: PostgresTransaction, change: DataChange) { + const stmts: PendingQuery[] = []; + + switch (change.tag) { + case 'update-table-metadata': { + const {table, new: metadata} = change; + stmts.push(this.#upsertTableMetadataStmt(sql, table, metadata)); + break; + } + + case 'create-table': { + const {spec, metadata, backfill} = change; + if (metadata) { + stmts.push(this.#upsertTableMetadataStmt(sql, spec, metadata)); + } + if (backfill) { + Object.entries(backfill).forEach(([col, backfill]) => { + stmts.push( + this.#upsertColumnBackfillStmt(sql, spec, col, backfill), + ); + }); + } + break; + } + + case 'rename-table': { + const {old} = change; + const row = {schema: change.new.schema, table: change.new.name}; + stmts.push( + sql`UPDATE ${this.#cdc('tableMetadata')} SET ${sql(row)} + WHERE "schema" = ${old.schema} AND "table" = ${old.name}`, + sql`UPDATE ${this.#cdc('backfilling')} SET ${sql(row)} + WHERE "schema" = ${old.schema} AND "table" = ${old.name}`, + ); + break; + } + + case 'drop-table': { + const { + id: {schema, name}, + } = change; + stmts.push( + sql`DELETE FROM ${this.#cdc('tableMetadata')} + WHERE "schema" = ${schema} AND "table" = ${name}`, + sql`DELETE FROM ${this.#cdc('backfilling')} + WHERE "schema" = ${schema} AND "table" = ${name}`, + ); + break; + } + + case 'add-column': { + const {table, tableMetadata, column, backfill} = change; + if (tableMetadata) { + stmts.push(this.#upsertTableMetadataStmt(sql, table, tableMetadata)); + } + if (backfill) { + stmts.push( + this.#upsertColumnBackfillStmt(sql, table, column.name, backfill), + ); + } + break; + } + + case 'update-column': { + const { + table: {schema, name: table}, + old: {name: oldName}, + new: {name: newName}, + } = change; + if (oldName !== newName) { + stmts.push( + sql`UPDATE ${this.#cdc('backfilling')} SET "column" = ${newName} + WHERE "schema" = ${schema} AND "table" = ${table} AND "column" = ${oldName}`, + ); + } + break; + } + + case 'drop-column': { + const { + table: {schema, name}, + column, + } = change; + stmts.push( + sql`DELETE FROM ${this.#cdc('backfilling')} + WHERE "schema" = ${schema} AND "table" = ${name} AND "column" = ${column}`, + ); + break; + break; + } + } + return stmts; + } + + #upsertTableMetadataStmt( + sql: PostgresTransaction, + {schema, name: table}: Identifier, + metadata: TableMetadata, + ) { + const row: TableMetadataRow = {schema, table, metadata}; + return sql` + INSERT INTO ${this.#cdc('tableMetadata')} ${sql(row)} + ON CONFLICT ("schema", "table") + DO UPDATE SET ${sql(row)}; + `; + } + + #upsertColumnBackfillStmt( + sql: PostgresTransaction, + {schema, name: table}: Identifier, + column: string, + backfill: BackfillID, + ) { + const row: BackfillingColumn = {schema, table, column, backfill}; + return sql` + INSERT INTO ${this.#cdc('backfilling')} ${sql(row)} + ON CONFLICT ("schema", "table", "column") + DO UPDATE SET ${sql(row)}; + `; + } + stop() { this.#queue.enqueue('stop'); return promiseVoid; From 8d35019139acf92836898000463eb4bef5243779 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sun, 1 Feb 2026 10:54:35 -0800 Subject: [PATCH 005/495] chore(zero-cache): track backfill metadata in the replica (#5501) This is the replica-level analog of https://github.com/rocicorp/mono/pull/5498, whereby the table metadata and backfill column IDs are tracked in the replica. The former (table metadata) is not actually used at the replica level, but is tracked for the purpose of supporting ephemeral Change DBs in the future (whereby the change db is initialized by data in the replica) The latter (backfill column IDs) is similarly tracked for the backfill protocol, but will also be used in an upcoming change. Upcoming: * update sync and replication behavior for backfilling columns --- packages/zero-cache/src/db/lite-tables.ts | 11 +- .../custom/change-source.test.ts | 13 + .../change-source/custom/change-source.ts | 9 +- .../change-source/pg/sync-schema.pg.test.ts | 4 +- .../change-source/replica-schema.test.ts | 181 +++++++--- .../services/change-source/replica-schema.ts | 65 +++- .../replicator/change-processor.test.ts | 317 ++++++++++++++++-- .../services/replicator/change-processor.ts | 34 +- .../replicator/incremental-sync.test.ts | 11 +- .../replicator/schema/change-log.test.ts | 111 +++++- .../services/replicator/schema/change-log.ts | 24 +- .../replicator/schema/column-metadata.test.ts | 131 ++++++-- .../replicator/schema/column-metadata.ts | 85 +++-- .../replicator/schema/replication-state.ts | 18 +- .../replicator/schema/table-metadata.test.ts | 80 +++++ .../replicator/schema/table-metadata.ts | 64 ++++ .../src/services/replicator/test-utils.ts | 8 +- .../src/services/view-syncer/snapshotter.ts | 5 +- 18 files changed, 1019 insertions(+), 152 deletions(-) create mode 100644 packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts create mode 100644 packages/zero-cache/src/services/replicator/schema/table-metadata.ts diff --git a/packages/zero-cache/src/db/lite-tables.ts b/packages/zero-cache/src/db/lite-tables.ts index a6cdb0f0a7..11dcb73af4 100644 --- a/packages/zero-cache/src/db/lite-tables.ts +++ b/packages/zero-cache/src/db/lite-tables.ts @@ -33,9 +33,10 @@ type ColumnInfo = { keyPos: number; }; -export function listTables(db: Database): LiteTableSpec[] { - const metadataStore = ColumnMetadataStore.getInstance(db); - +export function listTables( + db: Database, + useColumnMetadata = true, +): LiteTableSpec[] { const columns = db .prepare( ` @@ -76,7 +77,9 @@ export function listTables(db: Database): LiteTableSpec[] { | typeof PostgresTypeClass.Enum | null; - const metadata = metadataStore?.getColumn(col.table, col.name); + const metadata = useColumnMetadata + ? ColumnMetadataStore.getInstance(db)?.getColumn(col.table, col.name) + : undefined; if (metadata) { // Read from metadata table and convert to pipe notation dataType = metadataToLiteTypeString(metadata); diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.test.ts b/packages/zero-cache/src/services/change-source/custom/change-source.test.ts index dfb738afcb..ce51ca9628 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.test.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.test.ts @@ -253,6 +253,7 @@ describe('change-source/custom', () => { is_not_null: 1, table_name: 'foo', upstream_type: 'text', + backfill: null, }, { character_max_length: null, @@ -262,6 +263,7 @@ describe('change-source/custom', () => { is_not_null: 0, table_name: 'foo', upstream_type: 'text', + backfill: null, }, { character_max_length: null, @@ -271,6 +273,7 @@ describe('change-source/custom', () => { is_not_null: 1, table_name: 'bongo_0.clients', upstream_type: 'text', + backfill: null, }, { character_max_length: null, @@ -280,6 +283,7 @@ describe('change-source/custom', () => { is_not_null: 1, table_name: 'bongo_0.clients', upstream_type: 'text', + backfill: null, }, { character_max_length: null, @@ -289,6 +293,7 @@ describe('change-source/custom', () => { is_not_null: 0, table_name: 'bongo_0.clients', upstream_type: 'bigint', + backfill: null, }, { character_max_length: null, @@ -298,6 +303,7 @@ describe('change-source/custom', () => { is_not_null: 0, table_name: 'bongo_0.clients', upstream_type: 'text', + backfill: null, }, { character_max_length: null, @@ -307,6 +313,7 @@ describe('change-source/custom', () => { is_not_null: 1, table_name: 'bongo_0.mutations', upstream_type: 'text', + backfill: null, }, { character_max_length: null, @@ -316,6 +323,7 @@ describe('change-source/custom', () => { is_not_null: 1, table_name: 'bongo_0.mutations', upstream_type: 'text', + backfill: null, }, { character_max_length: null, @@ -325,6 +333,7 @@ describe('change-source/custom', () => { is_not_null: 1, table_name: 'bongo_0.mutations', upstream_type: 'bigint', + backfill: null, }, { character_max_length: null, @@ -334,6 +343,7 @@ describe('change-source/custom', () => { is_not_null: 0, table_name: 'bongo_0.mutations', upstream_type: 'json', + backfill: null, }, { character_max_length: null, @@ -343,6 +353,7 @@ describe('change-source/custom', () => { is_not_null: 1, table_name: 'bongo.permissions', upstream_type: 'bool', + backfill: null, }, { character_max_length: null, @@ -352,6 +363,7 @@ describe('change-source/custom', () => { is_not_null: 0, table_name: 'bongo.permissions', upstream_type: 'json', + backfill: null, }, { character_max_length: null, @@ -361,6 +373,7 @@ describe('change-source/custom', () => { is_not_null: 0, table_name: 'bongo.permissions', upstream_type: 'text', + backfill: null, }, ], }); diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.ts b/packages/zero-cache/src/services/change-source/custom/change-source.ts index 7dc1a27f22..b39c905fb3 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.ts @@ -16,6 +16,7 @@ import { import {ChangeProcessor} from '../../replicator/change-processor.ts'; import {ReplicationStatusPublisher} from '../../replicator/replication-status.ts'; import { + createReplicationStateTables, getSubscriptionState, initReplicationState, type SubscriptionState, @@ -160,6 +161,7 @@ export async function initialSync( }); const {changes} = changeSource.initialSync(); + createReplicationStateTables(tx); const processor = new ChangeProcessor( new StatementRunner(tx), 'initial-sync', @@ -185,7 +187,12 @@ export async function initialSync( `Copying upstream tables at version ${commitWatermark}`, 5000, ); - initReplicationState(tx, [...publications].sort(), commitWatermark); + initReplicationState( + tx, + [...publications].sort(), + commitWatermark, + false, + ); processor.processMessage(lc, change); break; } diff --git a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts index 2cc06884ca..cf24920bb0 100644 --- a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts @@ -22,8 +22,8 @@ const SHARD_NUM = 9; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 8, - schemaVersion: 8, + dataVersion: 9, + schemaVersion: 9, minSafeVersion: 1, lock: 1, // Internal column, always 1 }; diff --git a/packages/zero-cache/src/services/change-source/replica-schema.test.ts b/packages/zero-cache/src/services/change-source/replica-schema.test.ts index 41ba05cb7c..91ded78038 100644 --- a/packages/zero-cache/src/services/change-source/replica-schema.test.ts +++ b/packages/zero-cache/src/services/change-source/replica-schema.test.ts @@ -5,21 +5,33 @@ import { expectMatchingObjectsInTables, initDB as initLiteDB, } from '../../test/lite.ts'; -import {CREATE_COLUMN_METADATA_TABLE} from '../replicator/schema/column-metadata.ts'; -import {initReplica} from './replica-schema.ts'; +import { + CREATE_V6_COLUMN_METADATA_TABLE, + CREATE_V7_CHANGE_LOG, + initReplica, +} from './replica-schema.ts'; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 8, - schemaVersion: 8, + dataVersion: 9, + schemaVersion: 9, minSafeVersion: 1, lock: 1, // Internal column, always 1 }; +const CREATE_VERSION_HISTORY = /*sql*/ ` + CREATE TABLE "_zero.versionHistory" ( + dataVersion INTEGER NOT NULL, + schemaVersion INTEGER NOT NULL, + minSafeVersion INTEGER NOT NULL, + lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) + ); +`; + describe('replica-schema-migrations', () => { type Case = { - name: string; - + fromVersion: number; + desc: string; replicaSetup?: string; replicaPreState?: Record; replicaPostState: Record; @@ -27,29 +39,29 @@ describe('replica-schema-migrations', () => { const cases: Case[] = [ { - name: 'v6 to v8: re-populate column metadata', + fromVersion: 6, + desc: 're-populate column metadata', replicaSetup: ` CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); CREATE TABLE "_zero.changeLog" ( old_legacy_table TEXT ); - CREATE TABLE "_zero.versionHistory" ( - dataVersion INTEGER NOT NULL, - schemaVersion INTEGER NOT NULL, - minSafeVersion INTEGER NOT NULL, - lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) - ); - ` + CREATE_COLUMN_METADATA_TABLE, + ` + CREATE_V6_COLUMN_METADATA_TABLE, replicaPreState: { - ['_zero.versionHistory']: [ + ['_zero.column_metadata']: [ { - dataVersion: 6, - schemaVersion: 6, - minSafeVersion: 1, - lock: 1, // Internal column, always 1 + character_max_length: null, + column_name: 'userID', + is_array: 0, + is_enum: 0, + is_not_null: 1, + table_name: 'users', + upstream_type: 'this should be overwritten', }, ], + }, + replicaPostState: { ['_zero.column_metadata']: [ { character_max_length: null, @@ -58,12 +70,43 @@ describe('replica-schema-migrations', () => { is_enum: 0, is_not_null: 1, table_name: 'users', - upstream_type: 'this should be overwritten', + upstream_type: 'INTEGER', + backfill: null, + }, + { + character_max_length: null, + column_name: 'password', + is_array: 0, + is_enum: 0, + is_not_null: 0, + table_name: 'users', + upstream_type: 'TEXT', + backfill: null, + }, + { + character_max_length: null, + column_name: 'handle', + is_array: 0, + is_enum: 0, + is_not_null: 0, + table_name: 'users', + upstream_type: 'TEXT', + backfill: null, }, ], + ['_zero.tableMetadata']: [], }, + }, + { + fromVersion: 7, + desc: 'create column metadata', + replicaSetup: + ` + CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); + ` + + CREATE_V6_COLUMN_METADATA_TABLE + + CREATE_V7_CHANGE_LOG, replicaPostState: { - ['_zero.versionHistory']: [CURRENT_SCHEMA_VERSIONS], ['_zero.column_metadata']: [ { character_max_length: null, @@ -73,6 +116,7 @@ describe('replica-schema-migrations', () => { is_not_null: 1, table_name: 'users', upstream_type: 'INTEGER', + backfill: null, }, { character_max_length: null, @@ -82,6 +126,7 @@ describe('replica-schema-migrations', () => { is_not_null: 0, table_name: 'users', upstream_type: 'TEXT', + backfill: null, }, { character_max_length: null, @@ -91,36 +136,72 @@ describe('replica-schema-migrations', () => { is_not_null: 0, table_name: 'users', upstream_type: 'TEXT', + backfill: null, }, ], + ['_zero.tableMetadata']: [], }, }, { - name: 'v7 to v8: create column metadata', - replicaSetup: ` + fromVersion: 8, + desc: 'add backfill metadata', + replicaSetup: + ` CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); - CREATE TABLE "_zero.changeLog" ( - old_legacy_table TEXT - ); - CREATE TABLE "_zero.versionHistory" ( - dataVersion INTEGER NOT NULL, - schemaVersion INTEGER NOT NULL, - minSafeVersion INTEGER NOT NULL, - lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) - ); - `, + ` + + CREATE_V6_COLUMN_METADATA_TABLE + + CREATE_V7_CHANGE_LOG, replicaPreState: { - ['_zero.versionHistory']: [ + ['_zero.changeLog2']: [ { - dataVersion: 7, - schemaVersion: 7, - minSafeVersion: 1, - lock: 1, // Internal column, always 1 + stateVersion: '123', + pos: 0, + table: 'users', + rowKey: '{"userID":1}', + op: 's', + }, + ], + ['_zero.column_metadata']: [ + { + character_max_length: null, + column_name: 'userID', + is_array: 0, + is_enum: 0, + is_not_null: 1, + table_name: 'users', + upstream_type: 'INTEGER', + }, + { + character_max_length: null, + column_name: 'password', + is_array: 0, + is_enum: 0, + is_not_null: 0, + table_name: 'users', + upstream_type: 'TEXT', + }, + { + character_max_length: null, + column_name: 'handle', + is_array: 0, + is_enum: 0, + is_not_null: 0, + table_name: 'users', + upstream_type: 'TEXT', }, ], }, replicaPostState: { - ['_zero.versionHistory']: [CURRENT_SCHEMA_VERSIONS], + ['_zero.changeLog2']: [ + { + stateVersion: '123', + pos: 0, + table: 'users', + rowKey: '{"userID":1}', + op: 's', + backfillingColumnVersions: '{}', + }, + ], ['_zero.column_metadata']: [ { character_max_length: null, @@ -130,6 +211,7 @@ describe('replica-schema-migrations', () => { is_not_null: 1, table_name: 'users', upstream_type: 'INTEGER', + backfill: null, }, { character_max_length: null, @@ -139,6 +221,7 @@ describe('replica-schema-migrations', () => { is_not_null: 0, table_name: 'users', upstream_type: 'TEXT', + backfill: null, }, { character_max_length: null, @@ -148,8 +231,10 @@ describe('replica-schema-migrations', () => { is_not_null: 0, table_name: 'users', upstream_type: 'TEXT', + backfill: null, }, ], + ['_zero.tableMetadata']: [], }, }, ]; @@ -164,13 +249,25 @@ describe('replica-schema-migrations', () => { const lc = createSilentLogContext(); for (const c of cases) { - test(c.name, async () => { + test(`from v${c.fromVersion}: ${c.desc}`, async () => { const replica = replicaFile.connect(lc); - initLiteDB(replica, c.replicaSetup, c.replicaPreState); + initLiteDB(replica, c.replicaSetup + CREATE_VERSION_HISTORY, { + ['_zero.versionHistory']: [ + { + dataVersion: c.fromVersion, + schemaVersion: c.fromVersion, + minSafeVersion: 1, + }, + ], + ...c.replicaPreState, + }); await initReplica(lc, 'test', replicaFile.path, async () => {}); - expectMatchingObjectsInTables(replica, c.replicaPostState); + expectMatchingObjectsInTables(replica, { + ['_zero.versionHistory']: [CURRENT_SCHEMA_VERSIONS], + ...c.replicaPostState, + }); }); } }); diff --git a/packages/zero-cache/src/services/change-source/replica-schema.ts b/packages/zero-cache/src/services/change-source/replica-schema.ts index 2223cfd767..6a239581c0 100644 --- a/packages/zero-cache/src/services/change-source/replica-schema.ts +++ b/packages/zero-cache/src/services/change-source/replica-schema.ts @@ -1,6 +1,5 @@ import type {LogContext} from '@rocicorp/logger'; import {SqliteError} from '@rocicorp/zero-sqlite3'; -import {must} from '../../../../shared/src/must.ts'; import type {Database} from '../../../../zqlite/src/db.ts'; import {listTables} from '../../db/lite-tables.ts'; import { @@ -9,15 +8,12 @@ import { type Migration, } from '../../db/migration-lite.ts'; import {AutoResetSignal} from '../change-streamer/schema/tables.ts'; -import {CREATE_CHANGELOG_SCHEMA} from '../replicator/schema/change-log.ts'; -import { - ColumnMetadataStore, - CREATE_COLUMN_METADATA_TABLE, -} from '../replicator/schema/column-metadata.ts'; +import {populateFromExistingTables} from '../replicator/schema/column-metadata.ts'; import { CREATE_RUNTIME_EVENTS_TABLE, recordEvent, } from '../replicator/schema/replication-state.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../replicator/schema/table-metadata.ts'; export async function initReplica( log: LogContext, @@ -67,6 +63,31 @@ export async function upgradeReplica( ); } +export const CREATE_V6_COLUMN_METADATA_TABLE = /*sql*/ ` + CREATE TABLE "_zero.column_metadata" ( + table_name TEXT NOT NULL, + column_name TEXT NOT NULL, + upstream_type TEXT NOT NULL, + is_not_null INTEGER NOT NULL, + is_enum INTEGER NOT NULL, + is_array INTEGER NOT NULL, + character_max_length INTEGER, + PRIMARY KEY (table_name, column_name) + ); +`; + +export const CREATE_V7_CHANGE_LOG = /*sql*/ ` + CREATE TABLE "_zero.changeLog2" ( + "stateVersion" TEXT NOT NULL, + "pos" INT NOT NULL, + "table" TEXT NOT NULL, + "rowKey" TEXT NOT NULL, + "op" TEXT NOT NULL, + PRIMARY KEY("stateVersion", "pos"), + UNIQUE("table", "rowKey") + ); +`; + export const schemaVersionMigrationMap: IncrementalMigrationMap = { // There's no incremental migration from v1. Just reset the replica. 4: { @@ -94,15 +115,21 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { // is compatible with older zero-caches. However, it is truncated for // space savings (since historic changes were never read). db.exec(`DELETE FROM "_zero.changeLog"`); - db.exec(CREATE_CHANGELOG_SCHEMA); // Creates _zero.changeLog2 + // First version of changeLog2 + db.exec(CREATE_V7_CHANGE_LOG); }, }, 8: { migrateSchema: (_, db) => { - let store = ColumnMetadataStore.getInstance(db); - if (!store) { - db.exec(CREATE_COLUMN_METADATA_TABLE); + const tableExists = db + .prepare( + `SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = '_zero.column_metadata'`, + ) + .get(); + + if (!tableExists) { + db.exec(CREATE_V6_COLUMN_METADATA_TABLE); } }, migrateData: (_, db) => { @@ -111,9 +138,21 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { // versions but did not initialize the table for new replicas. db.exec(/*sql*/ `DELETE FROM "_zero.column_metadata"`); - const store = ColumnMetadataStore.getInstance(db); - const tables = listTables(db); - must(store).populateFromExistingTables(tables); + const tables = listTables(db, false); + populateFromExistingTables(db, tables); + }, + }, + + 9: { + migrateSchema: (_, db) => { + db.exec( + /*sql*/ ` + ALTER TABLE "_zero.changeLog2" + ADD COLUMN "backfillingColumnVersions" TEXT DEFAULT '{}'; + ALTER TABLE "_zero.column_metadata" + ADD COLUMN backfill TEXT; + ` + CREATE_TABLE_METADATA_TABLE, + ); }, }, }; diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index c10ff3fbc2..0362d3764e 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -27,6 +27,7 @@ describe('replicator/incremental-sync', () => { beforeEach(() => { lc = createSilentLogContext(); servingReplica = new Database(lc, ':memory:'); + initReplicationState(servingReplica, ['zero_data'], '02'); servingProcessor = new ChangeProcessor( new StatementRunner(servingReplica), 'serving', @@ -35,6 +36,7 @@ describe('replicator/incremental-sync', () => { }, ); backupReplica = new Database(lc, ':memory:'); + initReplicationState(backupReplica, ['zero_data'], '02'); backupProcessor = new ChangeProcessor( new StatementRunner(backupReplica), 'backup', @@ -186,6 +188,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":123}', + backfillingColumnVersions: '{}', }, { stateVersion: '06', @@ -193,6 +196,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":0,"issueID":456}', + backfillingColumnVersions: '{}', }, { stateVersion: '0b', @@ -200,6 +204,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":789}', + backfillingColumnVersions: '{}', }, { stateVersion: '0b', @@ -207,6 +212,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":987}', + backfillingColumnVersions: '{}', }, { stateVersion: '0b', @@ -214,6 +220,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":0,"issueID":234}', + backfillingColumnVersions: '{}', }, ], }, @@ -273,6 +280,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":123}', + backfillingColumnVersions: '{}', }, ], }, @@ -361,6 +369,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":789,"orgID":2}', + backfillingColumnVersions: '{}', }, { stateVersion: '0a', @@ -368,6 +377,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":456,"orgID":1}', + backfillingColumnVersions: '{}', }, { stateVersion: '0a', @@ -375,6 +385,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 'd', rowKey: '{"bool":1,"issueID":123,"orgID":1}', + backfillingColumnVersions: '{}', }, { stateVersion: '0a', @@ -382,6 +393,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":0,"issueID":123,"orgID":2}', + backfillingColumnVersions: '{}', }, ], }, @@ -450,6 +462,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":0,"issueID":789,"orgID":2}', + backfillingColumnVersions: '{}', }, { stateVersion: '0c', @@ -457,6 +470,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 'd', rowKey: '{"bool":1,"issueID":123,"orgID":1}', + backfillingColumnVersions: '{}', }, { stateVersion: '0c', @@ -464,6 +478,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 'd', rowKey: '{"bool":0,"issueID":456,"orgID":1}', + backfillingColumnVersions: '{}', }, { stateVersion: '0c', @@ -471,6 +486,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 'd', rowKey: '{"bool":1,"issueID":987,"orgID":2}', + backfillingColumnVersions: '{}', }, ], }, @@ -517,6 +533,7 @@ describe('replicator/incremental-sync', () => { table: 'bar', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -524,6 +541,7 @@ describe('replicator/incremental-sync', () => { table: 'bar', op: 's', rowKey: '{"id":5}', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -531,6 +549,7 @@ describe('replicator/incremental-sync', () => { table: 'bar', op: 's', rowKey: '{"id":6}', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -538,6 +557,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 't', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0i', @@ -545,6 +565,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 't', rowKey: '0i', + backfillingColumnVersions: '{}', }, { stateVersion: '0i', @@ -552,6 +573,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":101}', + backfillingColumnVersions: '{}', }, ], }, @@ -606,6 +628,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '0b', pos: 1n, table: 'full', + backfillingColumnVersions: '{}', }, { op: 'd', @@ -613,6 +636,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '0b', pos: 2n, table: 'full', + backfillingColumnVersions: '{}', }, { op: 's', @@ -620,6 +644,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '0b', pos: 3n, table: 'full', + backfillingColumnVersions: '{}', }, { op: 'd', @@ -627,6 +652,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '0b', pos: 4n, table: 'full', + backfillingColumnVersions: '{}', }, ], }, @@ -699,6 +725,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 0n, table: 'foo', + backfillingColumnVersions: '{}', }, { op: 's', @@ -706,6 +733,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 1n, table: 'foo', + backfillingColumnVersions: '{}', }, { op: 'd', @@ -713,6 +741,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 2n, table: 'foo', + backfillingColumnVersions: '{}', }, { op: 's', @@ -720,6 +749,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 3n, table: 'foo', + backfillingColumnVersions: '{}', }, { op: 'd', @@ -727,6 +757,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 4n, table: 'foo', + backfillingColumnVersions: '{}', }, { op: 's', @@ -734,6 +765,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 5n, table: 'full', + backfillingColumnVersions: '{}', }, { op: 'd', @@ -741,6 +773,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 6n, table: 'full', + backfillingColumnVersions: '{}', }, { op: 's', @@ -748,6 +781,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 7n, table: 'full', + backfillingColumnVersions: '{}', }, { op: 's', @@ -755,6 +789,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 9n, table: 'full', + backfillingColumnVersions: '{}', }, { op: 'd', @@ -762,6 +797,7 @@ describe('replicator/incremental-sync', () => { stateVersion: '06', pos: 10n, table: 'full', + backfillingColumnVersions: '{}', }, ], }, @@ -803,6 +839,7 @@ describe('replicator/incremental-sync', () => { table: 'transaction', op: 't', rowKey: '07', + backfillingColumnVersions: '{}', }, { stateVersion: '07', @@ -810,6 +847,7 @@ describe('replicator/incremental-sync', () => { table: 'transaction', op: 'd', rowKey: '{"column":1}', + backfillingColumnVersions: '{}', }, { stateVersion: '07', @@ -817,6 +855,7 @@ describe('replicator/incremental-sync', () => { table: 'transaction', op: 'd', rowKey: '{"column":2}', + backfillingColumnVersions: '{}', }, ], }, @@ -883,6 +922,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 'd', rowKey: '{"bool":1,"issueID":123,"orgID":1}', + backfillingColumnVersions: '{}', }, { stateVersion: '08', @@ -890,6 +930,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 'd', rowKey: '{"bool":0,"issueID":789,"orgID":2}', + backfillingColumnVersions: '{}', }, { stateVersion: '08', @@ -897,6 +938,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":0,"issueID":456,"orgID":1}', + backfillingColumnVersions: '{}', }, ], }, @@ -908,22 +950,35 @@ describe('replicator/incremental-sync', () => { ['begin', fooBarBaz.begin(), {commitWatermark: '0e'}], [ 'data', - fooBarBaz.createTable({ - schema: 'public', - name: 'foo', - columns: { - id: {pos: 0, dataType: 'varchar'}, - count: {pos: 1, dataType: 'int8'}, - bool: {pos: 3, dataType: 'bool'}, - serial: { - pos: 4, - dataType: 'int4', - dflt: "nextval('issues_serial_seq'::regclass)", - notNull: true, + fooBarBaz.createTable( + { + schema: 'public', + name: 'foo', + columns: { + id: {pos: 0, dataType: 'varchar'}, + count: {pos: 1, dataType: 'int8'}, + bool: {pos: 3, dataType: 'bool'}, + serial: { + pos: 4, + dataType: 'int4', + dflt: "nextval('issues_serial_seq'::regclass)", + notNull: true, + }, }, + primaryKey: ['id'], }, - primaryKey: ['id'], - }), + { + metadata: { + rowKey: { + type: 'index', + columns: ['id', 'serial'], + }, + }, + backfill: { + serial: {upstreamID: 123}, + }, + }, + ), ], [ 'data', @@ -952,6 +1007,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -959,6 +1015,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":"bar"}', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -966,6 +1023,56 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":"baz"}', + backfillingColumnVersions: '{}', + }, + ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + metadata: '{"rowKey":{"type":"index","columns":["id","serial"]}}', + }, + ], + ['_zero.column_metadata']: [ + { + backfill: null, + character_max_length: null, + column_name: 'id', + is_array: 0n, + is_enum: 0n, + is_not_null: 0n, + table_name: 'foo', + upstream_type: 'varchar', + }, + { + backfill: null, + character_max_length: null, + column_name: 'count', + is_array: 0n, + is_enum: 0n, + is_not_null: 0n, + table_name: 'foo', + upstream_type: 'int8', + }, + { + backfill: null, + character_max_length: null, + column_name: 'bool', + is_array: 0n, + is_enum: 0n, + is_not_null: 0n, + table_name: 'foo', + upstream_type: 'bool', + }, + { + backfill: '{"upstreamID":123}', + character_max_length: null, + column_name: 'serial', + is_array: 0n, + is_enum: 0n, + is_not_null: 1n, + table_name: 'foo', + upstream_type: 'int4', }, ], }, @@ -1025,6 +1132,9 @@ describe('replicator/incremental-sync', () => { INSERT INTO foo(id, _0_version) VALUES (1, '00'); INSERT INTO foo(id, _0_version) VALUES (2, '00'); INSERT INTO foo(id, _0_version) VALUES (3, '00'); + + INSERT INTO "_zero.tableMetadata" ("schema", "table", "metadata") + VALUES ('public', 'foo', '{"rowKey":{"columns":["id"]}}'); `, downstream: [ ['begin', fooBarBaz.begin(), {commitWatermark: '0e'}], @@ -1046,6 +1156,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1053,6 +1164,14 @@ describe('replicator/incremental-sync', () => { table: 'bar', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', + }, + ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'bar', + metadata: '{"rowKey":{"columns":["id"]}}', }, ], }, @@ -1109,10 +1228,18 @@ describe('replicator/incremental-sync', () => { ], [ 'data', - fooBarBaz.addColumn('foo', 'newJSON', { - pos: 10, - dataType: 'json', - }), + fooBarBaz.addColumn( + 'foo', + 'newJSON', + { + pos: 10, + dataType: 'json', + }, + { + tableMetadata: {rowKey: {columns: ['id']}}, + backfill: {upstreamID: 988}, + }, + ), ], [ 'data', @@ -1163,6 +1290,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1170,6 +1298,46 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', + }, + ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + metadata: '{"rowKey":{"columns":["id"]}}', + }, + ], + ['_zero.column_metadata']: [ + { + backfill: null, + character_max_length: null, + column_name: 'newInt', + is_array: 0n, + is_enum: 0n, + is_not_null: 0n, + table_name: 'foo', + upstream_type: 'int8', + }, + { + backfill: null, + character_max_length: null, + column_name: 'newBool', + is_array: 0n, + is_enum: 0n, + is_not_null: 0n, + table_name: 'foo', + upstream_type: 'bool', + }, + { + backfill: '{"upstreamID":988}', + character_max_length: null, + column_name: 'newJSON', + is_array: 0n, + is_enum: 0n, + is_not_null: 0n, + table_name: 'foo', + upstream_type: 'json', }, ], }, @@ -1251,6 +1419,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1258,6 +1427,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, ], }, @@ -1323,6 +1493,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1330,6 +1501,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, ], }, @@ -1410,6 +1582,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1417,6 +1590,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, ], }, @@ -1500,6 +1674,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1507,6 +1682,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, ], }, @@ -1588,6 +1764,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1595,6 +1772,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, ], }, @@ -1681,6 +1859,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1688,6 +1867,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, ], }, @@ -1770,6 +1950,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1777,6 +1958,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, ], }, @@ -1869,6 +2051,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, { stateVersion: '0e', @@ -1876,6 +2059,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', + backfillingColumnVersions: '{}', }, ], }, @@ -1926,6 +2110,10 @@ describe('replicator/incremental-sync', () => { INSERT INTO foo(id, _0_version) VALUES (1, '00'); INSERT INTO foo(id, _0_version) VALUES (2, '00'); INSERT INTO foo(id, _0_version) VALUES (3, '00'); + + INSERT INTO "_zero.tableMetadata" ("schema", "table", "metadata") VALUES + ('public', 'foo', '{"rowKey":{"columns":["id"]}}'), + ('public', 'bar', '{"rowKey":{"columns":["id"]}}'); `, downstream: [ ['begin', fooBarBaz.begin(), {commitWatermark: '0e'}], @@ -1941,12 +2129,89 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', + }, + ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'bar', + metadata: '{"rowKey":{"columns":["id"]}}', }, ], }, tableSpecs: [], indexSpecs: [], }, + { + name: 'update table metadata', + setup: ` + CREATE TABLE foo(id INT8, id2 INT8, _0_version TEXT); + + INSERT INTO "_zero.tableMetadata" ("schema", "table", "metadata") VALUES + ('public', 'foo', '{"rowKey":{"columns":["id"]}}'), + ('public', 'bar', '{"rowKey":{"columns":["id"]}}'); + `, + downstream: [ + ['begin', fooBarBaz.begin(), {commitWatermark: '0e'}], + [ + 'data', + { + tag: 'update-table-metadata', + table: {schema: 'public', name: 'foo'}, + old: {rowKey: {columns: []}}, + new: {rowKey: {type: 'index', columns: ['id2']}}, + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '0e'}], + ], + data: { + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + metadata: '{"rowKey":{"type":"index","columns":["id2"]}}', + }, + { + schema: 'public', + table: 'bar', + metadata: '{"rowKey":{"columns":["id"]}}', + }, + ], + }, + tableSpecs: [ + { + name: 'foo', + columns: { + id: { + characterMaximumLength: null, + dataType: 'INT8', + dflt: null, + notNull: false, + elemPgTypeClass: null, + pos: 1, + }, + id2: { + characterMaximumLength: null, + dataType: 'INT8', + dflt: null, + notNull: false, + elemPgTypeClass: null, + pos: 2, + }, + ['_0_version']: { + characterMaximumLength: null, + dataType: 'TEXT', + dflt: null, + notNull: false, + elemPgTypeClass: null, + pos: 3, + }, + }, + }, + ], + indexSpecs: [], + }, { name: 'create index', setup: ` @@ -1976,6 +2241,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 'r', rowKey: '0e', + backfillingColumnVersions: '{}', }, ], }, @@ -2079,6 +2345,7 @@ describe('replicator/incremental-sync', () => { table: 'transaction', op: 'r', rowKey: '07', + backfillingColumnVersions: '{}', }, ], }, @@ -2123,7 +2390,6 @@ describe('replicator/incremental-sync', () => { [backupReplica, backupProcessor, false], ] satisfies [Database, ChangeProcessor, boolean][]) { initDB(replica, c.setup); - initReplicationState(replica, ['zero_data'], '02'); for (const change of c.downstream) { processor.processMessage(lc, change); @@ -2321,6 +2587,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); const nameMetadata = must(store).getColumn('foo', 'name'); @@ -2330,6 +2597,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: 255, + isBackfilling: false, }); const activeMetadata = must(store).getColumn('foo', 'active'); @@ -2339,6 +2607,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); }); @@ -2396,6 +2665,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); expect(must(store).getColumn('bar', 'value')).toEqual({ @@ -2404,6 +2674,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); }); @@ -2464,6 +2735,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); }); @@ -2527,6 +2799,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); }); @@ -2587,6 +2860,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); }); @@ -2744,6 +3018,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); const statusMetadata = must(store).getColumn('foo', 'status'); @@ -2753,6 +3028,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: true, isArray: false, characterMaxLength: null, + isBackfilling: false, }); }); @@ -2795,6 +3071,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); expect(tableMetadata.get('email')).toEqual({ @@ -2803,6 +3080,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: 255, + isBackfilling: false, }); expect(tableMetadata.get('isActive')).toEqual({ @@ -2811,6 +3089,7 @@ describe('replicator/column-metadata-integration', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); }); }); diff --git a/packages/zero-cache/src/services/replicator/change-processor.ts b/packages/zero-cache/src/services/replicator/change-processor.ts index 7a1a1c1808..4fdb85b03f 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.ts @@ -48,6 +48,7 @@ import type { TableCreate, TableDrop, TableRename, + TableUpdateMetadata, } from '../change-source/protocol/current/data.ts'; import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import type {ReplicatorMode} from './replicator.ts'; @@ -62,6 +63,7 @@ import { ZERO_VERSION_COLUMN_NAME, updateReplicationWatermark, } from './schema/replication-state.ts'; +import {TableMetadataTracker} from './schema/table-metadata.ts'; export type ChangeProcessorMode = ReplicatorMode | 'initial-sync'; @@ -83,6 +85,7 @@ export type CommitResult = { */ export class ChangeProcessor { readonly #db: StatementRunner; + readonly #tableMetadata: TableMetadataTracker; readonly #mode: ChangeProcessorMode; readonly #failService: (lc: LogContext, err: unknown) => void; @@ -101,6 +104,7 @@ export class ChangeProcessor { failService: (lc: LogContext, err: unknown) => void, ) { this.#db = db; + this.#tableMetadata = new TableMetadataTracker(db.db); this.#mode = mode; this.#failService = failService; } @@ -167,6 +171,7 @@ export class ChangeProcessor { lc, this.#db, this.#mode, + this.#tableMetadata, this.#tableSpecs, commitVersion, jsonFormat, @@ -247,8 +252,7 @@ export class ChangeProcessor { tx.processRenameTable(msg); break; case 'update-table-metadata': - // TODO: Process this appropriately when backfill logic is added - lc.info?.(`Received table metadata update`, msg); + tx.processTableMetadata(msg); break; case 'add-column': tx.processAddColumn(msg); @@ -303,6 +307,7 @@ class TransactionProcessor { readonly #db: StatementRunner; readonly #mode: ChangeProcessorMode; readonly #version: LexiVersion; + readonly #tableMetadata: TableMetadataTracker; readonly #tableSpecs: Map; readonly #jsonFormat: JSONFormat; readonly #columnMetadata: ColumnMetadataStore; @@ -314,6 +319,7 @@ class TransactionProcessor { lc: LogContext, db: StatementRunner, mode: ChangeProcessorMode, + tableMetadata: TableMetadataTracker, tableSpecs: Map, commitVersion: LexiVersion, jsonFormat: JSONFormat, @@ -350,6 +356,7 @@ class TransactionProcessor { this.#db = db; this.#version = commitVersion; this.#lc = lc.withContext('version', commitVersion); + this.#tableMetadata = tableMetadata; this.#tableSpecs = tableSpecs; // The column_metadata table is guaranteed to exist since the // replica-schema.ts migration to v8. @@ -535,19 +542,33 @@ class TransactionProcessor { } } processCreateTable(create: TableCreate) { + if (create.metadata) { + this.#tableMetadata.set(create.spec, create.metadata); + } const table = mapPostgresToLite(create.spec); this.#db.db.exec(createLiteTableStatement(table)); // Write to metadata table for (const [colName, colSpec] of Object.entries(create.spec.columns)) { - this.#columnMetadata.insert(table.name, colName, colSpec); + this.#columnMetadata.insert( + table.name, + colName, + colSpec, + create.backfill?.[colName], + ); } this.#logResetOp(table.name); this.#lc.info?.(create.tag, table.name); } + processTableMetadata(msg: TableUpdateMetadata) { + this.#tableMetadata.set(msg.table, msg.new); + } + processRenameTable(rename: TableRename) { + this.#tableMetadata.rename(rename.old, rename.new); + const oldName = liteTableName(rename.old); const newName = liteTableName(rename.new); this.#db.db.exec(`ALTER TABLE ${id(oldName)} RENAME TO ${id(newName)}`); @@ -561,6 +582,9 @@ class TransactionProcessor { } processAddColumn(msg: ColumnAdd) { + if (msg.tableMetadata) { + this.#tableMetadata.set(msg.table, msg.tableMetadata); + } const table = liteTableName(msg.table); const {name} = msg.column; const spec = mapPostgresToLiteColumn(table, msg.column); @@ -569,7 +593,7 @@ class TransactionProcessor { ); // Write to metadata table - this.#columnMetadata.insert(table, name, msg.column.spec); + this.#columnMetadata.insert(table, name, msg.column.spec, msg.backfill); this.#bumpVersions(table); this.#lc.info?.(msg.tag, table, msg.column); @@ -652,6 +676,8 @@ class TransactionProcessor { } processDropTable(drop: TableDrop) { + this.#tableMetadata.drop(drop.id); + const name = liteTableName(drop.id); this.#db.db.exec(`DROP TABLE IF EXISTS ${id(name)}`); diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index a47d145dcc..677019db20 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -212,6 +212,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":123}', + backfillingColumnVersions: '{}', }, { stateVersion: '06', @@ -219,6 +220,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":0,"issueID":456}', + backfillingColumnVersions: '{}', }, { stateVersion: '0b', @@ -226,6 +228,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":789}', + backfillingColumnVersions: '{}', }, { stateVersion: '0b', @@ -233,6 +236,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":1,"issueID":987}', + backfillingColumnVersions: '{}', }, { stateVersion: '0b', @@ -240,6 +244,7 @@ describe('replicator/incremental-sync', () => { table: 'issues', op: 's', rowKey: '{"bool":0,"issueID":234}', + backfillingColumnVersions: '{}', }, ], }, @@ -269,7 +274,7 @@ describe('replicator/incremental-sync', () => { "unique": true, }, ], - "replicaSize": 49152, + "replicaSize": 57344, "tables": [ { "columns": [ @@ -411,7 +416,7 @@ describe('replicator/incremental-sync', () => { "unique": true, }, ], - "replicaSize": 49152, + "replicaSize": 57344, "tables": [ { "columns": [ @@ -465,7 +470,7 @@ describe('replicator/incremental-sync', () => { "unique": true, }, ], - "replicaSize": 57344, + "replicaSize": 65536, "tables": [ { "columns": [ diff --git a/packages/zero-cache/src/services/replicator/schema/change-log.test.ts b/packages/zero-cache/src/services/replicator/schema/change-log.test.ts index 22cb91c2f3..cb1dbbcf23 100644 --- a/packages/zero-cache/src/services/replicator/schema/change-log.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/change-log.test.ts @@ -54,6 +54,7 @@ describe('replicator/schema/change-log', () => { table: 'foo', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', }, { stateVersion: '01', @@ -61,6 +62,7 @@ describe('replicator/schema/change-log', () => { table: 'foo', rowKey: '{"a":2,"b":3}', op: 's', + backfillingColumnVersions: '{}', }, { stateVersion: '01', @@ -68,6 +70,7 @@ describe('replicator/schema/change-log', () => { table: 'bar', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', }, { stateVersion: '01', @@ -75,6 +78,7 @@ describe('replicator/schema/change-log', () => { table: 'bar', rowKey: '{"a":2,"b":3}', op: 's', + backfillingColumnVersions: '{}', }, ); @@ -89,6 +93,7 @@ describe('replicator/schema/change-log', () => { table: 'foo', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', }, { stateVersion: '01', @@ -96,6 +101,7 @@ describe('replicator/schema/change-log', () => { table: 'foo', rowKey: '{"a":2,"b":3}', op: 's', + backfillingColumnVersions: '{}', }, { stateVersion: '01', @@ -103,6 +109,7 @@ describe('replicator/schema/change-log', () => { table: 'bar', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', }, { stateVersion: '02', @@ -110,6 +117,7 @@ describe('replicator/schema/change-log', () => { table: 'bar', rowKey: '{"a":2,"b":3}', op: 'd', + backfillingColumnVersions: '{}', }, ); @@ -131,6 +139,7 @@ describe('replicator/schema/change-log', () => { table: 'foo', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', }, { stateVersion: '01', @@ -138,6 +147,7 @@ describe('replicator/schema/change-log', () => { table: 'bar', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', }, { stateVersion: '02', @@ -145,14 +155,23 @@ describe('replicator/schema/change-log', () => { table: 'bar', rowKey: '{"a":2,"b":3}', op: 'd', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '03', + pos: -1, + table: 'foo', + rowKey: '03', + op: 't', + backfillingColumnVersions: '{}', }, - {stateVersion: '03', pos: -1, table: 'foo', rowKey: '03', op: 't'}, { stateVersion: '03', pos: 2, table: 'foo', rowKey: '{"a":8,"b":9}', op: 's', + backfillingColumnVersions: '{}', }, ); @@ -174,22 +193,39 @@ describe('replicator/schema/change-log', () => { table: 'foo', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '03', + pos: -1, + table: 'foo', + rowKey: '03', + op: 't', + backfillingColumnVersions: '{}', }, - {stateVersion: '03', pos: -1, table: 'foo', rowKey: '03', op: 't'}, { stateVersion: '03', pos: 2, table: 'foo', rowKey: '{"a":8,"b":9}', op: 's', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '04', + pos: -1, + table: 'bar', + rowKey: '04', + op: 'r', + backfillingColumnVersions: '{}', }, - {stateVersion: '04', pos: -1, table: 'bar', rowKey: '04', op: 'r'}, { stateVersion: '04', pos: 2, table: 'bar', rowKey: '{"a":7,"b":9}', op: 's', + backfillingColumnVersions: '{}', }, ); @@ -206,24 +242,48 @@ describe('replicator/schema/change-log', () => { table: 'foo', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '03', + pos: -1, + table: 'foo', + rowKey: '03', + op: 't', + backfillingColumnVersions: '{}', }, - {stateVersion: '03', pos: -1, table: 'foo', rowKey: '03', op: 't'}, { stateVersion: '03', pos: 2, table: 'foo', rowKey: '{"a":8,"b":9}', op: 's', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '04', + pos: -1, + table: 'bar', + rowKey: '04', + op: 'r', + backfillingColumnVersions: '{}', }, - {stateVersion: '04', pos: -1, table: 'bar', rowKey: '04', op: 'r'}, { stateVersion: '04', pos: 2, table: 'bar', rowKey: '{"a":7,"b":9}', op: 's', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '05', + pos: -1, + table: 'baz', + rowKey: '05', + op: 'r', + backfillingColumnVersions: '{}', }, - {stateVersion: '05', pos: -1, table: 'baz', rowKey: '05', op: 'r'}, ); logResetOp(db, '06', 'baz'); @@ -238,25 +298,56 @@ describe('replicator/schema/change-log', () => { table: 'foo', rowKey: '{"a":1,"b":2}', op: 's', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '03', + pos: -1, + table: 'foo', + rowKey: '03', + op: 't', + backfillingColumnVersions: '{}', }, - {stateVersion: '03', pos: -1, table: 'foo', rowKey: '03', op: 't'}, { stateVersion: '03', pos: 2, table: 'foo', rowKey: '{"a":8,"b":9}', op: 's', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '04', + pos: -1, + table: 'bar', + rowKey: '04', + op: 'r', + backfillingColumnVersions: '{}', }, - {stateVersion: '04', pos: -1, table: 'bar', rowKey: '04', op: 'r'}, { stateVersion: '04', pos: 2, table: 'bar', rowKey: '{"a":7,"b":9}', op: 's', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '05', + pos: -1, + table: 'baz', + rowKey: '05', + op: 'r', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '06', + pos: -1, + table: 'baz', + rowKey: '06', + op: 't', + backfillingColumnVersions: '{}', }, - {stateVersion: '05', pos: -1, table: 'baz', rowKey: '05', op: 'r'}, - {stateVersion: '06', pos: -1, table: 'baz', rowKey: '06', op: 't'}, ); }); }); diff --git a/packages/zero-cache/src/services/replicator/schema/change-log.ts b/packages/zero-cache/src/services/replicator/schema/change-log.ts index da6b2dadd4..94fec66e90 100644 --- a/packages/zero-cache/src/services/replicator/schema/change-log.ts +++ b/packages/zero-cache/src/services/replicator/schema/change-log.ts @@ -60,26 +60,38 @@ export const CREATE_CHANGELOG_SCHEMA = // : 'd' for delete // : 'r' for table reset (schema change) // : 't' for table truncation (which also resets the pipeline) + // backfillingColumnVersions + // : A JSON mapping from column name to stateVersion tracked + // for replicated writes of columns that are being backfilled. + // This is used to prevent backfill data, which is at a + // fixed snapshot/version outside of the replication stream, + // from overwriting newer column values. // // Naming note: To maintain compatibility between a new replication-manager // and old view-syncers, the previous _zero.changeLog table is preserved // and its replacement given a new name "changeLog2". ` CREATE TABLE "_zero.changeLog2" ( - "stateVersion" TEXT NOT NULL, - "pos" INT NOT NULL, - "table" TEXT NOT NULL, - "rowKey" TEXT NOT NULL, - "op" TEXT NOT NULL, + "stateVersion" TEXT NOT NULL, + "pos" INT NOT NULL, + "table" TEXT NOT NULL, + "rowKey" TEXT NOT NULL, + "op" TEXT NOT NULL, + "backfillingColumnVersions" TEXT DEFAULT '{}', PRIMARY KEY("stateVersion", "pos"), UNIQUE("table", "rowKey") ); `; +/** + * Contains the changeLog fields relevant for computing the diff between + * two snapshots of a replica. The `pos` and `backfillingColumnVersions` + * fields are excluded, though the query should be ordered by + * ``. + */ export const changeLogEntrySchema = v .object({ stateVersion: v.string(), - pos: v.number(), table: v.string(), rowKey: v.string(), op: v.literalUnion(SET_OP, DEL_OP, TRUNCATE_OP, RESET_OP), diff --git a/packages/zero-cache/src/services/replicator/schema/column-metadata.test.ts b/packages/zero-cache/src/services/replicator/schema/column-metadata.test.ts index 427568e589..f45de9f29a 100644 --- a/packages/zero-cache/src/services/replicator/schema/column-metadata.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/column-metadata.test.ts @@ -1,5 +1,6 @@ import {describe, expect, test} from 'vitest'; import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import {must} from '../../../../../shared/src/must.ts'; import {Database} from '../../../../../zqlite/src/db.ts'; import type {LiteTableSpec} from '../../../db/specs.ts'; import { @@ -7,6 +8,8 @@ import { CREATE_COLUMN_METADATA_TABLE, liteTypeStringToMetadata, metadataToLiteTypeString, + populateFromExistingTables, + type ColumnMetadata, } from './column-metadata.ts'; function createTestDb(): Database { @@ -15,18 +18,15 @@ function createTestDb(): Database { return db; } -function createTestStore(): ColumnMetadataStore { +function createTestStore(): {store: ColumnMetadataStore; db: Database} { const db = createTestDb(); - const store = ColumnMetadataStore.getInstance(db); - if (!store) { - throw new Error('Failed to create metadata store - table should exist'); - } - return store; + const store = must(ColumnMetadataStore.getInstance(db)); + return {store, db}; } describe('column-metadata', () => { test('creates table and enforces primary key', () => { - const store = createTestStore(); + const {store} = createTestStore(); expect(store.hasTable()).toBe(true); @@ -46,7 +46,7 @@ describe('column-metadata', () => { }); test('insert and read metadata', () => { - const store = createTestStore(); + const {store} = createTestStore(); store.insert('users', 'id', { pos: 0, @@ -60,11 +60,33 @@ describe('column-metadata', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, + }); + + // backfilling + store.insert( + 'users', + 'value', + { + pos: 1, + dataType: 'text', + notNull: false, + }, + {backfill: 123}, + ); + + expect(store.getColumn('users', 'value')).toEqual({ + upstreamType: 'text', + isNotNull: false, + isEnum: false, + isArray: false, + characterMaxLength: null, + isBackfilling: true, }); }); test('update column metadata', () => { - const store = createTestStore(); + const {store} = createTestStore(); store.insert('users', 'name', { pos: 0, dataType: 'varchar', @@ -81,6 +103,7 @@ describe('column-metadata', () => { { "characterMaxLength": 200, "isArray": false, + "isBackfilling": false, "isEnum": false, "isNotNull": true, "upstreamType": "varchar", @@ -88,8 +111,50 @@ describe('column-metadata', () => { `); }); + test('clear column backfilling', () => { + const {store} = createTestStore(); + store.insert('users', 'id', {pos: 0, dataType: 'int8'}, {backfill: 'boo'}); + store.insert('users', 'val', {pos: 1, dataType: 'text'}, {backfill: 'boo'}); + + expect(store.getColumn('users', 'id')).toEqual({ + upstreamType: 'int8', + isNotNull: false, + isEnum: false, + isArray: false, + characterMaxLength: null, + isBackfilling: true, + }); + expect(store.getColumn('users', 'val')).toEqual({ + upstreamType: 'text', + isNotNull: false, + isEnum: false, + isArray: false, + characterMaxLength: null, + isBackfilling: true, + }); + + store.clearBackfilling('users', 'val'); + + expect(store.getColumn('users', 'id')).toEqual({ + upstreamType: 'int8', + isNotNull: false, + isEnum: false, + isArray: false, + characterMaxLength: null, + isBackfilling: true, + }); + expect(store.getColumn('users', 'val')).toEqual({ + upstreamType: 'text', + isNotNull: false, + isEnum: false, + isArray: false, + characterMaxLength: null, + isBackfilling: false, + }); + }); + test('delete column metadata', () => { - const store = createTestStore(); + const {store} = createTestStore(); store.insert('users', 'id', { pos: 0, dataType: 'int8', @@ -105,7 +170,7 @@ describe('column-metadata', () => { }); test('delete and rename table metadata', () => { - const store = createTestStore(); + const {store} = createTestStore(); store.insert('users', 'id', { pos: 0, dataType: 'int8', @@ -131,6 +196,7 @@ describe('column-metadata', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); expect(liteTypeStringToMetadata('varchar|NOT_NULL', 255)).toEqual({ @@ -139,6 +205,7 @@ describe('column-metadata', () => { isEnum: false, isArray: false, characterMaxLength: 255, + isBackfilling: false, }); // Enum types @@ -148,6 +215,7 @@ describe('column-metadata', () => { isEnum: true, isArray: false, characterMaxLength: null, + isBackfilling: false, }); // Old-style array format (backward compatibility) @@ -157,6 +225,7 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); expect(liteTypeStringToMetadata('int4|NOT_NULL[]')).toEqual({ @@ -165,6 +234,7 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); // New-style array format with |TEXT_ARRAY @@ -174,6 +244,7 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); expect(liteTypeStringToMetadata('int4[]|NOT_NULL|TEXT_ARRAY')).toEqual({ @@ -182,6 +253,7 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); // Array of enums with both flags @@ -193,12 +265,13 @@ describe('column-metadata', () => { isEnum: true, isArray: true, characterMaxLength: null, + isBackfilling: false, }); }); describe('populateFromExistingTables', () => { test('populates metadata from LiteTableSpec array', () => { - const store = createTestStore(); + const {store, db} = createTestStore(); const tables: LiteTableSpec[] = [ { @@ -255,7 +328,7 @@ describe('column-metadata', () => { }, ]; - store.populateFromExistingTables(tables); + populateFromExistingTables(db, tables); expect(store.getColumn('posts', 'id')).toEqual({ upstreamType: 'int8', @@ -263,6 +336,7 @@ describe('column-metadata', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); expect(store.getColumn('posts', 'status')).toEqual({ @@ -271,6 +345,7 @@ describe('column-metadata', () => { isEnum: true, isArray: false, characterMaxLength: null, + isBackfilling: false, }); expect(store.getColumn('users', 'email')).toEqual({ @@ -279,6 +354,7 @@ describe('column-metadata', () => { isEnum: false, isArray: false, characterMaxLength: 255, + isBackfilling: false, }); expect(store.getColumn('users', 'id')).toEqual({ @@ -287,6 +363,7 @@ describe('column-metadata', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }); expect(store.getColumn('users', 'tags')).toEqual({ @@ -295,19 +372,20 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); }); test('handles empty table list', () => { - const store = createTestStore(); + const {store, db} = createTestStore(); - store.populateFromExistingTables([]); + populateFromExistingTables(db, []); expect(store.getTable('users').size).toBe(0); }); test('handles table with no columns', () => { - const store = createTestStore(); + const {store, db} = createTestStore(); const tables: LiteTableSpec[] = [ { @@ -316,7 +394,7 @@ describe('column-metadata', () => { }, ]; - store.populateFromExistingTables(tables); + populateFromExistingTables(db, tables); expect(store.getTable('empty_table').size).toBe(0); }); @@ -333,6 +411,7 @@ describe('column-metadata', () => { isEnum: true, isArray: true, characterMaxLength: null, + isBackfilling: false, }); }); @@ -346,6 +425,7 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); }); @@ -359,6 +439,7 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); }); @@ -372,6 +453,7 @@ describe('column-metadata', () => { isEnum: true, isArray: true, characterMaxLength: null, + isBackfilling: false, }); }); @@ -385,6 +467,7 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }); }); }); @@ -491,6 +574,7 @@ describe('column-metadata', () => { isEnum: true, isArray: true, characterMaxLength: null, + isBackfilling: false, }); // Verify round-trip produces the normalized format with |TEXT_ARRAY @@ -515,13 +599,7 @@ describe('column-metadata', () => { input: string; expectedOutput?: string; characterMaxLength?: number; - expectedMetadata: { - upstreamType: string; - isNotNull: boolean; - isEnum: boolean; - isArray: boolean; - characterMaxLength: number | null; - }; + expectedMetadata: ColumnMetadata; }> = [ { input: 'int8', @@ -531,6 +609,7 @@ describe('column-metadata', () => { isEnum: false, isArray: false, characterMaxLength: null, + isBackfilling: false, }, }, { @@ -542,6 +621,7 @@ describe('column-metadata', () => { isEnum: false, isArray: false, characterMaxLength: 200, + isBackfilling: false, }, }, { @@ -552,6 +632,7 @@ describe('column-metadata', () => { isEnum: true, isArray: false, characterMaxLength: null, + isBackfilling: false, }, }, { @@ -563,6 +644,7 @@ describe('column-metadata', () => { isEnum: false, isArray: true, characterMaxLength: null, + isBackfilling: false, }, }, { @@ -574,6 +656,7 @@ describe('column-metadata', () => { isEnum: true, isArray: true, characterMaxLength: null, + isBackfilling: false, }, }, ]; diff --git a/packages/zero-cache/src/services/replicator/schema/column-metadata.ts b/packages/zero-cache/src/services/replicator/schema/column-metadata.ts index 8e8f6096c6..540ab13418 100644 --- a/packages/zero-cache/src/services/replicator/schema/column-metadata.ts +++ b/packages/zero-cache/src/services/replicator/schema/column-metadata.ts @@ -19,6 +19,7 @@ import { nullableUpstream, upstreamDataType, } from '../../../types/lite.ts'; +import type {BackfillID} from '../../change-source/protocol/current.ts'; /** * Structured column metadata, replacing the old pipe-delimited string format. @@ -31,6 +32,7 @@ export interface ColumnMetadata { isArray: boolean; /** Maximum character length for varchar/char types */ characterMaxLength?: number | null; + isBackfilling: boolean; } type ColumnMetadataRow = { @@ -39,6 +41,7 @@ type ColumnMetadataRow = { is_enum: number; is_array: number; character_max_length: number | null; + backfill: string | null; }; export const CREATE_COLUMN_METADATA_TABLE = ` @@ -50,6 +53,7 @@ export const CREATE_COLUMN_METADATA_TABLE = ` is_enum INTEGER NOT NULL, is_array INTEGER NOT NULL, character_max_length INTEGER, + backfill TEXT, PRIMARY KEY (table_name, column_name) ); `; @@ -66,6 +70,7 @@ export class ColumnMetadataStore { readonly #insertStmt: Statement; readonly #updateStmt: Statement; + readonly #clearBackfillStmt: Statement; readonly #deleteColumnStmt: Statement; readonly #deleteTableStmt: Statement; readonly #renameTableStmt: Statement; @@ -76,8 +81,8 @@ export class ColumnMetadataStore { private constructor(db: Database) { this.#insertStmt = db.prepare(` INSERT INTO "_zero.column_metadata" - (table_name, column_name, upstream_type, is_not_null, is_enum, is_array, character_max_length) - VALUES (?, ?, ?, ?, ?, ?, ?) + (table_name, column_name, upstream_type, is_not_null, is_enum, is_array, character_max_length, backfill) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) `); this.#updateStmt = db.prepare(` @@ -91,6 +96,12 @@ export class ColumnMetadataStore { WHERE table_name = ? AND column_name = ? `); + this.#clearBackfillStmt = db.prepare(/*sql*/ ` + UPDATE "_zero.column_metadata" + SET backfill = NULL + WHERE table_name = ? AND column_name = ? + `); + this.#deleteColumnStmt = db.prepare(` DELETE FROM "_zero.column_metadata" WHERE table_name = ? AND column_name = ? @@ -108,13 +119,13 @@ export class ColumnMetadataStore { `); this.#getColumnStmt = db.prepare(` - SELECT upstream_type, is_not_null, is_enum, is_array, character_max_length + SELECT upstream_type, is_not_null, is_enum, is_array, character_max_length, backfill FROM "_zero.column_metadata" WHERE table_name = ? AND column_name = ? `); this.#getTableStmt = db.prepare(` - SELECT column_name, upstream_type, is_not_null, is_enum, is_array, character_max_length + SELECT column_name, upstream_type, is_not_null, is_enum, is_array, character_max_length, backfill FROM "_zero.column_metadata" WHERE table_name = ? ORDER BY column_name @@ -150,15 +161,21 @@ export class ColumnMetadataStore { return instance; } - insert(tableName: string, columnName: string, spec: ColumnSpec): void { + insert( + tableName: string, + columnName: string, + spec: ColumnSpec, + backfill?: BackfillID | undefined, + ): void { const metadata = pgColumnSpecToMetadata(spec); - this.#insertMetadata(tableName, columnName, metadata); + this.#insertMetadata(tableName, columnName, metadata, backfill); } #insertMetadata( tableName: string, columnName: string, - metadata: ColumnMetadata, + metadata: Omit, + backfill?: BackfillID | undefined, ): void { this.#insertStmt.run( tableName, @@ -168,6 +185,7 @@ export class ColumnMetadataStore { metadata.isEnum ? 1 : 0, metadata.isArray ? 1 : 0, metadata.characterMaxLength ?? null, + backfill ? JSON.stringify(backfill) : null, ); } @@ -190,6 +208,10 @@ export class ColumnMetadataStore { ); } + clearBackfilling(tableName: string, columnName: string): void { + this.#clearBackfillStmt.run(tableName, columnName); + } + deleteColumn(tableName: string, columnName: string): void { this.#deleteColumnStmt.run(tableName, columnName); } @@ -217,6 +239,7 @@ export class ColumnMetadataStore { isEnum: row.is_enum !== 0, isArray: row.is_array !== 0, characterMaxLength: row.character_max_length, + isBackfilling: row.backfill !== null, }; } @@ -233,6 +256,7 @@ export class ColumnMetadataStore { isEnum: row.is_enum !== 0, isArray: row.is_array !== 0, characterMaxLength: row.character_max_length, + isBackfilling: row.backfill !== null, }); } @@ -243,20 +267,39 @@ export class ColumnMetadataStore { const result = this.#hasTableStmt.get(); return result !== undefined; } +} - /** - * Populates metadata table from existing tables that use pipe notation. - * This is used during migration v8 to backfill the metadata table. - */ - populateFromExistingTables(tables: LiteTableSpec[]): void { - for (const table of tables) { - for (const [columnName, columnSpec] of Object.entries(table.columns)) { - const metadata = liteTypeStringToMetadata( - columnSpec.dataType, - columnSpec.characterMaximumLength, - ); - this.#insertMetadata(table.name, columnName, metadata); - } +/** + * Populates metadata table from existing tables that use pipe notation. + * This is used during migration v8 to backfill the metadata table. + */ +export function populateFromExistingTables( + db: Database, + tables: LiteTableSpec[], +): void { + // The backfill column is not relevant here, and does not exist on + // older versions of the replica. + const legacyInsertStmt = db.prepare(` + INSERT INTO "_zero.column_metadata" + (table_name, column_name, upstream_type, is_not_null, is_enum, is_array, character_max_length) + VALUES (?, ?, ?, ?, ?, ?, ?) + `); + + for (const table of tables) { + for (const [columnName, columnSpec] of Object.entries(table.columns)) { + const metadata = liteTypeStringToMetadata( + columnSpec.dataType, + columnSpec.characterMaximumLength, + ); + legacyInsertStmt.run( + table.name, + columnName, + metadata.upstreamType, + metadata.isNotNull ? 1 : 0, + metadata.isEnum ? 1 : 0, + metadata.isArray ? 1 : 0, + metadata.characterMaxLength ?? null, + ); } } } @@ -284,6 +327,7 @@ export function liteTypeStringToMetadata( isEnum: checkIsEnum(liteTypeString), isArray: isArrayType, characterMaxLength: characterMaxLength ?? null, + isBackfilling: false, }; } @@ -313,5 +357,6 @@ export function pgColumnSpecToMetadata(spec: ColumnSpec): ColumnMetadata { isEnum: isEnumColumn(spec), isArray: isArrayColumn(spec), characterMaxLength: spec.characterMaximumLength ?? null, + isBackfilling: false, }; } diff --git a/packages/zero-cache/src/services/replicator/schema/replication-state.ts b/packages/zero-cache/src/services/replicator/schema/replication-state.ts index d1fd6582f1..291219d042 100644 --- a/packages/zero-cache/src/services/replicator/schema/replication-state.ts +++ b/packages/zero-cache/src/services/replicator/schema/replication-state.ts @@ -11,6 +11,7 @@ import type {StatementRunner} from '../../../db/statements.ts'; import {CREATE_CHANGELOG_SCHEMA} from './change-log.ts'; import {CREATE_COLUMN_METADATA_TABLE} from './column-metadata.ts'; import {ZERO_VERSION_COLUMN_NAME} from './constants.ts'; +import {CREATE_TABLE_METADATA_TABLE} from './table-metadata.ts'; export {ZERO_VERSION_COLUMN_NAME}; @@ -54,7 +55,8 @@ const CREATE_REPLICATION_STATE_SCHEMA = ` + CREATE_CHANGELOG_SCHEMA + CREATE_RUNTIME_EVENTS_TABLE + - CREATE_COLUMN_METADATA_TABLE; + CREATE_COLUMN_METADATA_TABLE + + CREATE_TABLE_METADATA_TABLE; const stringArray = v.array(v.string()); @@ -81,8 +83,11 @@ export function initReplicationState( db: Database, publications: string[], watermark: string, + createTables = true, ) { - db.exec(CREATE_REPLICATION_STATE_SCHEMA); + if (createTables) { + createReplicationStateTables(db); + } db.prepare( ` INSERT INTO "_zero.replicationConfig" @@ -97,6 +102,15 @@ export function initReplicationState( recordEvent(db, 'sync'); } +/** + * Exposed as a separate function for the custom change source, + * which needs the tables to be created in order to construct + * ChangeProcessor before it knows the initial watermark. + */ +export function createReplicationStateTables(db: Database) { + db.exec(CREATE_REPLICATION_STATE_SCHEMA); +} + export function recordEvent(db: Database, event: RuntimeEvent) { db.prepare( ` diff --git a/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts b/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts new file mode 100644 index 0000000000..bda89acadc --- /dev/null +++ b/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts @@ -0,0 +1,80 @@ +import {beforeEach, describe, expect, test} from 'vitest'; +import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import {Database} from '../../../../../zqlite/src/db.ts'; +import { + CREATE_TABLE_METADATA_TABLE, + TableMetadataTracker, +} from './table-metadata.ts'; + +describe('table-metadata', () => { + let db: Database; + let tracker: TableMetadataTracker; + + beforeEach(() => { + db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); + + tracker = new TableMetadataTracker(db); + }); + + function dumpTable() { + return db + .prepare( + /*sql*/ `SELECT * FROM "_zero.tableMetadata" ORDER BY "schema", "table"`, + ) + .all(); + } + + test('set, rename, drop', () => { + tracker.set({schema: 'public', name: 'foo'}, {rowKey: {columns: ['id']}}); + tracker.set( + {schema: 'internal', name: 'bar'}, + {rowKey: {columns: ['a', 'b']}}, + ); + + expect(dumpTable()).toMatchInlineSnapshot(` + [ + { + "metadata": "{"rowKey":{"columns":["a","b"]}}", + "schema": "internal", + "table": "bar", + }, + { + "metadata": "{"rowKey":{"columns":["id"]}}", + "schema": "public", + "table": "foo", + }, + ] + `); + + tracker.rename( + {schema: 'internal', name: 'bar'}, + {schema: 'public', name: 'boo'}, + ); + expect(dumpTable()).toMatchInlineSnapshot(` + [ + { + "metadata": "{"rowKey":{"columns":["a","b"]}}", + "schema": "public", + "table": "boo", + }, + { + "metadata": "{"rowKey":{"columns":["id"]}}", + "schema": "public", + "table": "foo", + }, + ] + `); + + tracker.drop({schema: 'public', name: 'foo'}); + expect(dumpTable()).toMatchInlineSnapshot(` + [ + { + "metadata": "{"rowKey":{"columns":["a","b"]}}", + "schema": "public", + "table": "boo", + }, + ] + `); + }); +}); diff --git a/packages/zero-cache/src/services/replicator/schema/table-metadata.ts b/packages/zero-cache/src/services/replicator/schema/table-metadata.ts new file mode 100644 index 0000000000..f247fa807c --- /dev/null +++ b/packages/zero-cache/src/services/replicator/schema/table-metadata.ts @@ -0,0 +1,64 @@ +import type {Database, Statement} from '../../../../../zqlite/src/db.ts'; +import type { + Identifier, + TableMetadata, +} from '../../change-source/protocol/current.ts'; + +/** + * Replica-level analog of tableMetadata in change-streamer/schema. + * Per the requirement of the backfill protocol, backfill metadata + * must be tracked outside of the change source (otherwise the change + * source would have to be able to compute the state of the metadata at + * arbitrary points in the past). + * + * This tracking is done: + * 1. at the Change DB level, by the change-streamer + * 2. at the replica level, in order to support the eventual configuration + * of ephemeral Change DBs (on SQLite) that are initialized from data + * in the replica. + */ +export const CREATE_TABLE_METADATA_TABLE = /*sql*/ ` + CREATE TABLE "_zero.tableMetadata" ( + "schema" TEXT NOT NULL, + "table" TEXT NOT NULL, + "metadata" TEXT NOT NULL, + PRIMARY KEY ("schema", "table") + ); +`; + +export class TableMetadataTracker { + readonly #set: Statement; + readonly #rename: Statement; + readonly #drop: Statement; + + constructor(db: Database) { + this.#set = db.prepare(/*sql*/ ` + INSERT OR REPLACE INTO "_zero.tableMetadata" + ("schema", "table", "metadata") VALUES (?, ?, ?); + `); + this.#rename = db.prepare(/*sql*/ ` + UPDATE "_zero.tableMetadata" SET "schema" = ?, "table" = ? + WHERE "schema" = ? AND "table" = ? + `); + this.#drop = db.prepare(/*sql*/ ` + DELETE FROM "_zero.tableMetadata" WHERE "schema" = ? AND "table" = ? + `); + } + + set({schema, name}: Identifier, metadata: TableMetadata) { + this.#set.run(schema, name, JSON.stringify(metadata)); + } + + rename(oldTable: Identifier, newTable: Identifier) { + this.#rename.run( + newTable.schema, + newTable.name, + oldTable.schema, + oldTable.name, + ); + } + + drop({schema, name}: Identifier) { + this.#drop.run(schema, name); + } +} diff --git a/packages/zero-cache/src/services/replicator/test-utils.ts b/packages/zero-cache/src/services/replicator/test-utils.ts index eb1f61312f..b973d84bf7 100644 --- a/packages/zero-cache/src/services/replicator/test-utils.ts +++ b/packages/zero-cache/src/services/replicator/test-utils.ts @@ -137,7 +137,10 @@ export class ReplicationMessages< }; } - createTable(spec: TableSpec): TableCreate { + createTable( + spec: TableSpec, + tableCreate?: Pick, + ): TableCreate { return { tag: 'create-table', spec, @@ -147,6 +150,7 @@ export class ReplicationMessages< type: 'default', }, }, + ...tableCreate, }; } @@ -165,6 +169,7 @@ export class ReplicationMessages< table: TableName, column: string, spec: ColumnSpec, + columnAdd?: Pick, ): ColumnAdd { return { tag: 'add-column', @@ -175,6 +180,7 @@ export class ReplicationMessages< columns: ['not-mocked-for-the-test'], }, }, + ...columnAdd, }; } diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.ts index 1156205510..4c6f34c32b 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.ts @@ -310,8 +310,11 @@ class Snapshot { } changesSince(prevVersion: string) { + // Note: The queried fields are constrained to only those that are relevant + // to the snapshot diff, i.e. those defined in the changeLogEntrySchema. const cached = this.db.statementCache.get( - 'SELECT * FROM "_zero.changeLog2" WHERE stateVersion > ? ORDER BY stateVersion ASC, pos ASC', + `SELECT "stateVersion", "table", "rowKey", "op" FROM "_zero.changeLog2" + WHERE "stateVersion" > ? ORDER BY "stateVersion" ASC, "pos" ASC`, ); return { changes: cached.statement.iterate(prevVersion), From e109f7c0ba8b9cc6b3dfa17154651d0bdfa24a91 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sun, 1 Feb 2026 16:02:32 -0800 Subject: [PATCH 006/495] chore(zero-cache): detect backfill-relevant index changes when replica identity = "full" (#5502) Change the semantics of the `TableMetadata` object when `rowKey.type` === "full". Instead of setting the `rowKey.columns` to all of the table's columns (which is technically what replica identity full means, but is redundant information), set it to the key columns that would ultimately be used in the replication logic, i.e. the shortest, lexicographically earliest suitable index that zql picks as the primary key. This fills a hole in the detection of backfill-invalidating schema changes; namely, for a table that is set to replica identity "full", we can now detect when underlying index changes would alter the row key used to map changes in the changeLog, and thus correctly invalidate and restart a backfill. --- packages/zero-cache/src/db/lite-tables.ts | 52 ++++++----- .../pg/change-source.end-to-mid.pg.test.ts | 19 ++-- .../pg/schema/published.pg.test.ts | 44 +++++++--- .../change-source/pg/schema/published.ts | 87 ++++++++++++------- 4 files changed, 129 insertions(+), 73 deletions(-) diff --git a/packages/zero-cache/src/db/lite-tables.ts b/packages/zero-cache/src/db/lite-tables.ts index 11dcb73af4..58ba634d5a 100644 --- a/packages/zero-cache/src/db/lite-tables.ts +++ b/packages/zero-cache/src/db/lite-tables.ts @@ -181,21 +181,35 @@ export function computeZqlSpecs( replica: Database, tableSpecs: Map = new Map(), fullTables?: Map, +): Map { + return computeZqlSpecsFromLiteSpecs( + listTables(replica), + listIndexes(replica), + tableSpecs, + fullTables, + lc, + ); +} + +export function computeZqlSpecsFromLiteSpecs( + tables: LiteTableSpec[], + indexes: LiteIndexSpec[], + tableSpecs: Map = new Map(), + fullTables?: Map, + lc?: LogContext, ): Map { tableSpecs.clear(); fullTables?.clear(); - const uniqueColumns = new Map(); - for (const {tableName, columns} of listIndexes(replica).filter( - idx => idx.unique, - )) { - if (!uniqueColumns.has(tableName)) { - uniqueColumns.set(tableName, []); + const uniqueIndexColumns = new Map(); + for (const {tableName, columns} of indexes.filter(idx => idx.unique)) { + if (!uniqueIndexColumns.has(tableName)) { + uniqueIndexColumns.set(tableName, []); } - uniqueColumns.get(tableName)?.push(Object.keys(columns)); + uniqueIndexColumns.get(tableName)?.push(Object.keys(columns)); } - listTables(replica).forEach(fullTable => { + tables.forEach(fullTable => { fullTables?.set(fullTable.name, fullTable); // Only include columns for which the mapped ZQL Value is defined. @@ -211,23 +225,15 @@ export function computeZqlSpecs( .map(([col]) => col), ); - // Collect all columns that are part of a unique index. - const allKeyColumns = new Set(); - - const uniqueKeys = uniqueColumns.get(fullTable.name) ?? []; - // Examine all column combinations that can serve as a primary key. - const keys = uniqueKeys.filter(key => { - if (difference(new Set(key), notNullColumns).size > 0) { - return false; // Exclude indexes over non-visible columns. - } - for (const col of key) { - allKeyColumns.add(col); - } - return true; - }); + const uniqueKeys = uniqueIndexColumns.get(fullTable.name) ?? []; + // Examine all column combinations that can serve as a primary key, + // i.e. excluding indexes over nullable or unsynced columns. + const keys = uniqueKeys.filter( + key => difference(new Set(key), notNullColumns).size === 0, + ); if (keys.length === 0) { // Only include tables with a row key. - lc.debug?.( + lc?.debug?.( `not syncing table ${fullTable.name} because it has no primary key`, ); return; diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index 17484f747c..55245be083 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -1467,7 +1467,11 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'resumptive replication', ` - CREATE TABLE existing (a TEXT PRIMARY KEY, b TEXT); + CREATE TABLE existing ( + a TEXT UNIQUE NOT NULL, + b TEXT NOT NULL, + PRIMARY KEY (a, b) + ); INSERT INTO existing (a, b) VALUES ('c', 'd'); INSERT INTO existing (a, b) VALUES ('e', 'f'); @@ -1486,17 +1490,18 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { tag: 'create-table', metadata: { rowKey: { - columns: ['a'], + columns: ['a', 'b'], type: 'default', }, }, }, {tag: 'create-index'}, + {tag: 'create-index'}, { tag: 'create-table', metadata: { rowKey: { - columns: ['a', 'b'], + columns: ['a'], // computes the shortest eligible key type: 'full', }, }, @@ -1531,7 +1536,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { }, b: { characterMaximumLength: null, - dataType: 'text', + dataType: 'text|NOT_NULL', elemPgTypeClass: null, dflt: null, notNull: false, @@ -1579,7 +1584,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tableName: 'existing', name: 'existing_pkey', - columns: {a: 'ASC'}, + columns: {a: 'ASC', b: 'ASC'}, unique: true, }, { @@ -1601,13 +1606,13 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { table: {schema: 'public', name: 'existing'}, old: { rowKey: { - columns: ['a'], + columns: ['a', 'b'], type: 'default', }, }, new: { rowKey: { - columns: ['a', 'b'], + columns: ['a'], // computes the shortest eligible key type: 'full', }, }, diff --git a/packages/zero-cache/src/services/change-source/pg/schema/published.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/published.pg.test.ts index fd5fedb9cb..00612c333e 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/published.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/published.pg.test.ts @@ -1460,10 +1460,11 @@ describe('tables/published', () => { ` CREATE SCHEMA test; CREATE TABLE test.issues ( - issue_id INTEGER NOT NULL, + issue_id INTEGER UNIQUE NOT NULL, org_id INTEGER NOT NULL, component_id INTEGER, - foo_bar TEXT + foo_bar TEXT, + PRIMARY KEY(org_id, issue_id) ); ALTER TABLE test.issues REPLICA IDENTITY FULL; CREATE PUBLICATION zero_data FOR TABLE test.issues;`, @@ -1484,12 +1485,7 @@ describe('tables/published', () => { schemaOID: expect.any(Number), name: 'issues', replicaIdentity: 'f', - replicaIdentityColumns: [ - 'component_id', - 'foo_bar', - 'issue_id', - 'org_id', - ], + replicaIdentityColumns: ['issue_id'], columns: { ['issue_id']: { pos: 1, @@ -1528,13 +1524,41 @@ describe('tables/published', () => { dflt: null, }, }, - primaryKey: [], + primaryKey: ['org_id', 'issue_id'], publications: {['zero_data']: {rowFilter: null}}, }, ], }, ) - ).toMatchInlineSnapshot(`"[]"`); + ).toMatchInlineSnapshot(` + "[ + { + "schema": "test", + "tableName": "issues", + "name": "issues_issue_id_key", + "unique": true, + "isPrimaryKey": false, + "isReplicaIdentity": false, + "isImmediate": true, + "columns": { + "issue_id": "ASC" + } + }, + { + "schema": "test", + "tableName": "issues", + "name": "issues_pkey", + "unique": true, + "isPrimaryKey": true, + "isReplicaIdentity": false, + "isImmediate": true, + "columns": { + "org_id": "ASC", + "issue_id": "ASC" + } + } + ]" + `); }); test('compound indexes', async () => { diff --git a/packages/zero-cache/src/services/change-source/pg/schema/published.ts b/packages/zero-cache/src/services/change-source/pg/schema/published.ts index 3615f3511d..c623ac0326 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/published.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/published.ts @@ -2,7 +2,13 @@ import {literal} from 'pg-format'; import type postgres from 'postgres'; import {equals} from '../../../../../../shared/src/set-utils.ts'; import * as v from '../../../../../../shared/src/valita.ts'; +import {computeZqlSpecsFromLiteSpecs} from '../../../../db/lite-tables.ts'; +import { + mapPostgresToLite, + mapPostgresToLiteIndex, +} from '../../../../db/pg-to-lite.ts'; import {publishedIndexSpec, publishedTableSpec} from '../../../../db/specs.ts'; +import {liteTableName} from '../../../../types/names.ts'; export function publishedTableQuery(publications: readonly string[]) { // Notes: @@ -173,40 +179,55 @@ export const publishedSchema = v tables: v.array(publishedTableSpec), indexes: v.array(publishedIndexSpec), }) - .map(({tables, indexes}) => ({ - indexes, + .map(({tables, indexes}) => { + const zqlSpecs = computeZqlSpecsFromLiteSpecs( + tables.map(t => mapPostgresToLite(t)), + indexes.map(mapPostgresToLiteIndex), + ); + return { + indexes, - // Denormalize the schema such that each `table` includes the - // `replicaIdentityColumns` corresponding to the table's - // replica identity and associated primary key or index. - tables: tables.map(table => { - const replicaIdentityColumns: string[] = []; - switch (table.replicaIdentity) { - case 'd': - replicaIdentityColumns.push(...(table.primaryKey ?? [])); - break; - case 'i': - replicaIdentityColumns.push( - ...Object.keys( - indexes.find( - ind => - ind.schema === table.schema && - ind.tableName === table.name && - ind.isReplicaIdentity, - )?.columns ?? {}, - ), - ); - break; - case 'f': - replicaIdentityColumns.push(...Object.keys(table.columns)); - break; - } - return { - ...table, - replicaIdentityColumns, - }; - }), - })); + // Denormalize the schema such that each `table` includes the + // `replicaIdentityColumns` corresponding to the table's + // replica identity and associated primary key or index. + tables: tables.map(table => { + const replicaIdentityColumns: string[] = []; + switch (table.replicaIdentity) { + case 'd': + replicaIdentityColumns.push(...(table.primaryKey ?? [])); + break; + case 'i': + replicaIdentityColumns.push( + ...Object.keys( + indexes.find( + ind => + ind.schema === table.schema && + ind.tableName === table.name && + ind.isReplicaIdentity, + )?.columns ?? {}, + ), + ); + break; + case 'f': { + // For the key columns of replica identity "full", use the columns + // that the replicator/change-processor will end up using + // (in #getKey()) as the row key. + const zqlTable = zqlSpecs.get(liteTableName(table)); + // Note: There zql spec will be absent if the table is not synced, + // e.g. if it has no suitable unique indexes. + if (zqlTable) { + replicaIdentityColumns.push(...zqlTable.tableSpec.primaryKey); + } + break; + } + } + return { + ...table, + replicaIdentityColumns, + }; + }), + }; + }); export type PublishedSchema = v.Infer; From d531c4095da7c4f3252e277a4fe121142545b8ff Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Mon, 2 Feb 2026 10:48:57 -0700 Subject: [PATCH 007/495] fix(zero-client): do not auto-transition to connecting when in terminal state (#5504) This fixes an issue where an auth error immediately followed by a server socket close has a race condition that incorrectly keeps retrying to connect before hitting another needs-auth error. Related bug report: https://discord.com/channels/830183651022471199/1467142316069224579 --- .../src/client/zero.connection.test.ts | 48 +++++++++++++++++-- packages/zero-client/src/client/zero.ts | 6 ++- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/packages/zero-client/src/client/zero.connection.test.ts b/packages/zero-client/src/client/zero.connection.test.ts index 2b7a002f3f..aa288fd832 100644 --- a/packages/zero-client/src/client/zero.connection.test.ts +++ b/packages/zero-client/src/client/zero.connection.test.ts @@ -1,9 +1,12 @@ import {afterEach, beforeEach, expect, test, vi} from 'vitest'; -import {MockSocket, zeroForTest} from './test-utils.ts'; -import {ConnectionStatus} from './connection-status.ts'; +import {decodeSecProtocols} from '../../../zero-protocol/src/connect.ts'; import {ErrorKind} from '../../../zero-protocol/src/error-kind.ts'; import {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts'; -import {decodeSecProtocols} from '../../../zero-protocol/src/connect.ts'; +import {ProtocolError} from '../../../zero-protocol/src/error.ts'; +import {ClientErrorKind} from './client-error-kind.ts'; +import {ConnectionStatus} from './connection-status.ts'; +import {ClientError} from './error.ts'; +import {MockSocket, zeroForTest} from './test-utils.ts'; beforeEach(() => { vi.stubGlobal('WebSocket', MockSocket as unknown as typeof WebSocket); @@ -123,6 +126,45 @@ test('run-loop needs-auth->connect race using state.subscribe', async () => { await z.waitForConnectionStatus(ConnectionStatus.Connected); }); +test('close after needs-auth does not restart connecting', async () => { + const z = zeroForTest({auth: 'initial-token'}); + + await z.triggerConnected(); + await z.waitForConnectionStatus(ConnectionStatus.Connected); + + // close event races needs auth w/o closing the socket + z.connectionManager.needsAuth( + new ProtocolError({ + kind: ErrorKind.AuthInvalidated, + message: 'auth invalidated', + origin: ErrorOrigin.ZeroCache, + }), + ); + await z.waitForConnectionStatus(ConnectionStatus.NeedsAuth); + + await z.triggerClose(); + + expect(z.connectionStatus).toBe(ConnectionStatus.NeedsAuth); +}); + +test('close after error does not restart connecting', async () => { + const z = zeroForTest({auth: 'initial-token'}); + + await z.triggerConnected(); + await z.waitForConnectionStatus(ConnectionStatus.Connected); + + // close event races error w/o closing the socket + z.connectionManager.error( + new ClientError({ + kind: ClientErrorKind.Internal, + message: 'internal error', + }), + ); + await z.waitForConnectionStatus(ConnectionStatus.Error); + await z.triggerClose(); + expect(z.connectionStatus).toBe(ConnectionStatus.Error); +}); + test('connect without auth then auth before needs-auth', async () => { const z = zeroForTest({auth: undefined}); diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index da4a2e5f57..a223dcf708 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -19,6 +19,7 @@ import type { MutatorDefs, UpdateNeededReason as ReplicacheUpdateNeededReason, } from '../../../replicache/src/types.ts'; +import {AbortError} from '../../../shared/src/abort-error.ts'; import {assert, unreachable} from '../../../shared/src/asserts.ts'; import { getBrowserGlobal, @@ -179,7 +180,6 @@ import { fromReplicacheAuthToken, toReplicacheAuthToken, } from './zero-rep.ts'; -import {AbortError} from '../../../shared/src/abort-error.ts'; export type NoRelations = Record; @@ -1733,7 +1733,9 @@ export class Zero< this.#connectionManager.closed(); break; case NO_STATUS_TRANSITION: - this.#connectionManager.connecting(transition.reason); + if (!this.#connectionManager.isInTerminalState()) { + this.#connectionManager.connecting(transition.reason); + } break; default: unreachable(transition); From abbbfde03c5dbcaa8b6e50eebbe29666da0356d9 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 2 Feb 2026 12:45:26 -0800 Subject: [PATCH 008/495] chore(zero-cache): exclude backfilling cols from sync, track versions in changeLog (#5505) Follow the directives of the [backfill metadata tracked in the replica](https://github.com/rocicorp/mono/pull/5501) to fulfill the replication and sync-level portions of the backfill algorithm: * Exclude backfilling columns from being synced to the client. This includes: * exclusion from the ClientSchema used in the initial connection handshake * exclusion from the pipeline and TableSource * Track the versions of inserted or updated values, for columns being backfilled, in the changeLog The changeLog format / protocol is modified to: * Track / accumulate the `backfillingColumnVersions` for columns being backfilled (and resetting it for non-backfilling tables) * Avoid clearing changeLog entries on TRUNCATE or schema changes (a.k.a. "table-wide ops"). * This was "needed" in the original implementation whereby the handling of TRUNCATE was followed by incremental processing of the remainder of the transaction. However, that implementation didn't work and the new implementation simply resets the pipelines: (https://github.com/rocicorp/mono/pull/3461) * Therefore, it is fine to keep change-log entries in transactions with a reset, and in the case of backfill, needed in order to track column version information. * Relatedly, the ChangeProcessor is modified to write changeLog entries in the replication-manager for tables being backfilled. Although the replication-manager otherwise does not use the changeLog (i.e. because there's no IVM), it will need it for looking up column versions when handling `backfill` messages (upcoming). --- packages/analyze-query/src/bin-analyze.ts | 2 +- packages/zero-cache/bench/benchmark.ts | 4 +- .../zero-cache/src/auth/load-permissions.ts | 4 +- .../zero-cache/src/auth/write-authorizer.ts | 4 +- packages/zero-cache/src/db/create.pg.test.ts | 14 +- .../zero-cache/src/db/lite-tables.test.ts | 315 +++++++++++++++++- packages/zero-cache/src/db/lite-tables.ts | 48 ++- packages/zero-cache/src/services/analyze.ts | 10 +- .../change-source/custom/change-source.ts | 2 +- .../change-source/pg/schema/published.ts | 1 + .../replicator/change-processor.test.ts | 174 +++++++++- .../services/replicator/change-processor.ts | 95 ++++-- .../services/replicator/replication-status.ts | 3 + .../replicator/schema/change-log.test.ts | 284 +++++++++++++--- .../services/replicator/schema/change-log.ts | 177 ++++++---- .../view-syncer/client-schema.test.ts | 8 +- .../view-syncer/pipeline-driver.test.ts | 15 + .../services/view-syncer/pipeline-driver.ts | 8 +- .../services/view-syncer/snapshotter.test.ts | 59 +++- .../zql-benchmarks/src/planner-cost.bench.ts | 13 +- .../src/planner-hydration.bench.ts | 7 +- packages/zql-benchmarks/src/zbugs.bench.ts | 7 +- .../src/chinook/planner.pg.test.ts | 7 +- .../src/helpers/planner-exec.ts | 16 +- packages/zqlite/src/sqlite-cost-model.test.ts | 8 +- 25 files changed, 1066 insertions(+), 219 deletions(-) diff --git a/packages/analyze-query/src/bin-analyze.ts b/packages/analyze-query/src/bin-analyze.ts index 10c3651d39..f63b9f79df 100644 --- a/packages/analyze-query/src/bin-analyze.ts +++ b/packages/analyze-query/src/bin-analyze.ts @@ -200,7 +200,7 @@ const clientSchema = clientSchemaFrom(schema).clientSchema; const sources = new Map(); const clientToServerMapper = clientToServer(schema.tables); const debug = new Debug(); -const tableSpecs = computeZqlSpecs(lc, db); +const tableSpecs = computeZqlSpecs(lc, db, {includeBackfillingColumns: false}); class AnalyzeQueryDelegate extends QueryDelegateBase { readonly debug = debug; diff --git a/packages/zero-cache/bench/benchmark.ts b/packages/zero-cache/bench/benchmark.ts index 93f957681b..154212f4bf 100644 --- a/packages/zero-cache/bench/benchmark.ts +++ b/packages/zero-cache/bench/benchmark.ts @@ -22,7 +22,9 @@ export function bench(opts: Options) { const lc = createSilentLogContext(); const db = new Database(lc, dbFile); const sources = new Map(); - const tableSpecs = computeZqlSpecs(lc, db); + const tableSpecs = computeZqlSpecs(lc, db, { + includeBackfillingColumns: true, + }); class BenchmarkQueryDelegate extends QueryDelegateBase { readonly defaultQueryComplete = true; diff --git a/packages/zero-cache/src/auth/load-permissions.ts b/packages/zero-cache/src/auth/load-permissions.ts index 94129dc75d..2c274efe38 100644 --- a/packages/zero-cache/src/auth/load-permissions.ts +++ b/packages/zero-cache/src/auth/load-permissions.ts @@ -81,7 +81,9 @@ export function reloadPermissionsIfChanged( } export function getSchema(lc: LogContext, replica: Database): Schema { - const specs = computeZqlSpecs(lc, replica); + const specs = computeZqlSpecs(lc, replica, { + includeBackfillingColumns: false, + }); const tables = Object.fromEntries( [...specs.values()].map(table => { const { diff --git a/packages/zero-cache/src/auth/write-authorizer.ts b/packages/zero-cache/src/auth/write-authorizer.ts index 19186fc7e6..09e31110fc 100644 --- a/packages/zero-cache/src/auth/write-authorizer.ts +++ b/packages/zero-cache/src/auth/write-authorizer.ts @@ -110,7 +110,9 @@ export class WriteAuthorizerImpl implements WriteAuthorizer { addEdge() {}, decorateFilterInput: input => input, }; - this.#tableSpecs = computeZqlSpecs(this.#lc, replica); + this.#tableSpecs = computeZqlSpecs(this.#lc, replica, { + includeBackfillingColumns: false, + }); this.#statementRunner = new StatementRunner(replica); this.reloadPermissions(); } diff --git a/packages/zero-cache/src/db/create.pg.test.ts b/packages/zero-cache/src/db/create.pg.test.ts index d67035fbb1..6009efac88 100644 --- a/packages/zero-cache/src/db/create.pg.test.ts +++ b/packages/zero-cache/src/db/create.pg.test.ts @@ -3,16 +3,19 @@ import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts' import {Database} from '../../../zqlite/src/db.ts'; import {test} from '../test/db.ts'; import {createLiteTableStatement} from './create.ts'; -import {listTables} from './lite-tables.ts'; +import { + listTables, + type LiteTableSpecWithReplicationStatus, +} from './lite-tables.ts'; import {mapPostgresToLite} from './pg-to-lite.ts'; import * as PostgresTypeClass from './postgres-type-class-enum.ts'; -import {type LiteTableSpec, type TableSpec} from './specs.ts'; +import {type TableSpec} from './specs.ts'; describe('tables/create', () => { type Case = { name: string; createStatement: string; - liteTableSpec: LiteTableSpec; + liteTableSpec: LiteTableSpecWithReplicationStatus; dstTableSpec: TableSpec; }; @@ -76,6 +79,7 @@ describe('tables/create', () => { elemPgTypeClass: null, }, }, + backfilling: [], }, }, { @@ -137,6 +141,7 @@ describe('tables/create', () => { pos: 3, }, }, + backfilling: [], }, }, { @@ -267,6 +272,7 @@ describe('tables/create', () => { pos: 7, }, }, + backfilling: [], }, }, { @@ -362,6 +368,7 @@ describe('tables/create', () => { elemPgTypeClass: null, }, }, + backfilling: [], }, }, { @@ -457,6 +464,7 @@ describe('tables/create', () => { elemPgTypeClass: null, }, }, + backfilling: [], }, }, ]; diff --git a/packages/zero-cache/src/db/lite-tables.test.ts b/packages/zero-cache/src/db/lite-tables.test.ts index 2e55586ab7..aa3c29183f 100644 --- a/packages/zero-cache/src/db/lite-tables.test.ts +++ b/packages/zero-cache/src/db/lite-tables.test.ts @@ -6,14 +6,19 @@ import { ColumnMetadataStore, CREATE_COLUMN_METADATA_TABLE, } from '../services/replicator/schema/column-metadata.ts'; -import {computeZqlSpecs, listIndexes, listTables} from './lite-tables.ts'; -import type {LiteIndexSpec, LiteTableSpec} from './specs.ts'; +import { + computeZqlSpecs, + listIndexes, + listTables, + type LiteTableSpecWithReplicationStatus, +} from './lite-tables.ts'; +import type {LiteIndexSpec} from './specs.ts'; describe('lite/tables', () => { type Case = { name: string; setupQuery: string; - expectedResult: LiteTableSpec[]; + expectedResult: LiteTableSpecWithReplicationStatus[]; }; const cases: Case[] = [ @@ -52,6 +57,7 @@ describe('lite/tables', () => { }, }, primaryKey: ['clientID'], + backfilling: [], }, ], }, @@ -157,6 +163,7 @@ describe('lite/tables', () => { }, }, primaryKey: ['user_id'], + backfilling: [], }, ], }, @@ -209,6 +216,7 @@ describe('lite/tables', () => { }, }, primaryKey: ['org_id', 'component_id', 'issue_id'], + backfilling: [], }, ], }, @@ -325,7 +333,11 @@ describe('computeZqlSpec', () => { function t(setup: string) { const db = new Database(createSilentLogContext(), ':memory:'); db.exec(setup); - return [...computeZqlSpecs(createSilentLogContext(), db).values()]; + return [ + ...computeZqlSpecs(createSilentLogContext(), db, { + includeBackfillingColumns: false, + }).values(), + ]; } test('plain primary key', () => { @@ -344,6 +356,7 @@ describe('computeZqlSpec', () => { "b", ], ], + "backfilling": [], "columns": { "a": { "characterMaximumLength": null, @@ -422,6 +435,7 @@ describe('computeZqlSpec', () => { "b", ], ], + "backfilling": [], "columns": { "a": { "characterMaximumLength": null, @@ -481,6 +495,7 @@ describe('computeZqlSpec', () => { "d", ], ], + "backfilling": [], "columns": { "a": { "characterMaximumLength": null, @@ -559,6 +574,7 @@ describe('computeZqlSpec', () => { "d", ], ], + "backfilling": [], "columns": { "a": { "characterMaximumLength": null, @@ -647,6 +663,7 @@ describe('computeZqlSpec', () => { "d", ], ], + "backfilling": [], "columns": { "a": { "characterMaximumLength": null, @@ -734,6 +751,7 @@ describe('computeZqlSpec', () => { "c", ], ], + "backfilling": [], "columns": { "a": { "characterMaximumLength": null, @@ -821,6 +839,7 @@ describe('computeZqlSpec', () => { "d", ], ], + "backfilling": [], "columns": { "a": { "characterMaximumLength": null, @@ -920,6 +939,7 @@ describe('computeZqlSpec', () => { "order", ], ], + "backfilling": [], "columns": { "createdAt": { "characterMaximumLength": null, @@ -1099,6 +1119,293 @@ describe('metadata table integration', () => { expect(tables[0].columns.status.elemPgTypeClass).toBe(null); }); + test('exclude backfilling columns from zqlspecs', () => { + const db = new Database(createSilentLogContext(), ':memory:'); + + // Create metadata table + db.exec(CREATE_COLUMN_METADATA_TABLE); + + // Create table with plain SQLite types (no pipe notation) + db.exec(` + CREATE TABLE users ( + id INTEGER PRIMARY KEY, + name TEXT, + blob TEXT + ); + CREATE UNIQUE INDEX users_pk ON users (id); + `); + + // Populate metadata table + const store = ColumnMetadataStore.getInstance(db); + expect(store).toBeDefined(); + + must(store).insert('users', 'id', { + pos: 0, + dataType: 'int8', + notNull: true, + }); + + must(store).insert('users', 'name', { + pos: 1, + dataType: 'varchar', + }); + + must(store).insert( + 'users', + 'blob', + { + pos: 2, + dataType: 'text', + }, + {backfillID: 123}, + ); + + expect( + computeZqlSpecs(createSilentLogContext(), db, { + includeBackfillingColumns: false, + }).get('users'), + ).toMatchInlineSnapshot(` + { + "tableSpec": { + "allPotentialPrimaryKeys": [ + [ + "id", + ], + ], + "backfilling": [ + "blob", + ], + "columns": { + "id": { + "characterMaximumLength": null, + "dataType": "int8|NOT_NULL", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 1, + }, + "name": { + "characterMaximumLength": null, + "dataType": "varchar", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 2, + }, + }, + "name": "users", + "primaryKey": [ + "id", + ], + "uniqueKeys": [ + [ + "id", + ], + ], + }, + "zqlSpec": { + "id": { + "type": "number", + }, + "name": { + "type": "string", + }, + }, + } + `); + + expect( + computeZqlSpecs(createSilentLogContext(), db, { + includeBackfillingColumns: true, + }).get('users'), + ).toMatchInlineSnapshot(` + { + "tableSpec": { + "allPotentialPrimaryKeys": [ + [ + "id", + ], + ], + "backfilling": [ + "blob", + ], + "columns": { + "blob": { + "characterMaximumLength": null, + "dataType": "text", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 3, + }, + "id": { + "characterMaximumLength": null, + "dataType": "int8|NOT_NULL", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 1, + }, + "name": { + "characterMaximumLength": null, + "dataType": "varchar", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 2, + }, + }, + "name": "users", + "primaryKey": [ + "id", + ], + "uniqueKeys": [ + [ + "id", + ], + ], + }, + "zqlSpec": { + "blob": { + "type": "string", + }, + "id": { + "type": "number", + }, + "name": { + "type": "string", + }, + }, + } + `); + }); + + test('exclude backfilling table from zqlspecs', () => { + const db = new Database(createSilentLogContext(), ':memory:'); + + // Create metadata table + db.exec(CREATE_COLUMN_METADATA_TABLE); + + // Create table with plain SQLite types (no pipe notation) + db.exec(` + CREATE TABLE users ( + id INTEGER PRIMARY KEY, + name TEXT, + blob TEXT + ); + CREATE UNIQUE INDEX users_pk ON users (id); + `); + + // Populate metadata table + const store = ColumnMetadataStore.getInstance(db); + expect(store).toBeDefined(); + + must(store).insert( + 'users', + 'id', + { + pos: 0, + dataType: 'int8', + notNull: true, + }, + {backfillID: 123}, + ); + + must(store).insert( + 'users', + 'name', + { + pos: 1, + dataType: 'varchar', + }, + {backfillID: 456}, + ); + + must(store).insert( + 'users', + 'blob', + { + pos: 2, + dataType: 'text', + }, + {backfillID: 789}, + ); + + // The entire table is excluded from syncing. + expect( + computeZqlSpecs(createSilentLogContext(), db, { + includeBackfillingColumns: false, + }).get('users'), + ).toBeUndefined(); + + expect( + computeZqlSpecs(createSilentLogContext(), db, { + includeBackfillingColumns: true, + }).get('users'), + ).toMatchInlineSnapshot(` + { + "tableSpec": { + "allPotentialPrimaryKeys": [ + [ + "id", + ], + ], + "backfilling": [ + "id", + "name", + "blob", + ], + "columns": { + "blob": { + "characterMaximumLength": null, + "dataType": "text", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 3, + }, + "id": { + "characterMaximumLength": null, + "dataType": "int8|NOT_NULL", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 1, + }, + "name": { + "characterMaximumLength": null, + "dataType": "varchar", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 2, + }, + }, + "name": "users", + "primaryKey": [ + "id", + ], + "uniqueKeys": [ + [ + "id", + ], + ], + }, + "zqlSpec": { + "blob": { + "type": "string", + }, + "id": { + "type": "number", + }, + "name": { + "type": "string", + }, + }, + } + `); + }); + test('partial metadata: reads from metadata table for some columns, fallback for others', () => { const db = new Database(createSilentLogContext(), ':memory:'); diff --git a/packages/zero-cache/src/db/lite-tables.ts b/packages/zero-cache/src/db/lite-tables.ts index 58ba634d5a..05837df55b 100644 --- a/packages/zero-cache/src/db/lite-tables.ts +++ b/packages/zero-cache/src/db/lite-tables.ts @@ -33,10 +33,18 @@ type ColumnInfo = { keyPos: number; }; +export type LiteTableSpecWithReplicationStatus = LiteTableSpec & { + readonly backfilling?: string[]; +}; + +type MutableLiteTableSpecWithReplicationStatus = MutableLiteTableSpec & { + backfilling: string[]; +}; + export function listTables( db: Database, useColumnMetadata = true, -): LiteTableSpec[] { +): LiteTableSpecWithReplicationStatus[] { const columns = db .prepare( ` @@ -58,7 +66,7 @@ export function listTables( .all() as ColumnInfo[]; const tables: LiteTableSpec[] = []; - let table: MutableLiteTableSpec | undefined; + let table: MutableLiteTableSpecWithReplicationStatus | undefined; columns.forEach(col => { if (col.table !== table?.name) { @@ -66,6 +74,7 @@ export function listTables( table = { name: col.table, columns: {}, + backfilling: [], }; tables.push(table); } @@ -106,6 +115,9 @@ export function listTables( dflt: col.dflt, elemPgTypeClass, }; + if (metadata?.isBackfilling) { + table.backfilling.push(col.name); + } if (col.keyPos) { table.primaryKey ??= []; while (table.primaryKey.length < col.keyPos) { @@ -161,6 +173,17 @@ export function listIndexes(db: Database): LiteIndexSpec[] { return ret; } +export type ZqlSpecOptions = { + /** + * Controls whether to include backfilling columns in the computed + * LiteAndZqlSpec. In general, backfilling columns should be include + * in "replication" logic (copying data from upstream to the replica), + * and excluded from "sync" logic (sending data from the replica to + * clients). + */ + includeBackfillingColumns: boolean; +}; + /** * Computes a TableSpec "view" of the replicated data that is * suitable for processing / consumption for the client. This @@ -179,12 +202,14 @@ export function listIndexes(db: Database): LiteIndexSpec[] { export function computeZqlSpecs( lc: LogContext, replica: Database, + opts: ZqlSpecOptions, tableSpecs: Map = new Map(), fullTables?: Map, ): Map { return computeZqlSpecsFromLiteSpecs( listTables(replica), listIndexes(replica), + opts, tableSpecs, fullTables, lc, @@ -192,8 +217,9 @@ export function computeZqlSpecs( } export function computeZqlSpecsFromLiteSpecs( - tables: LiteTableSpec[], + tables: LiteTableSpecWithReplicationStatus[], indexes: LiteIndexSpec[], + {includeBackfillingColumns}: ZqlSpecOptions, tableSpecs: Map = new Map(), fullTables?: Map, lc?: LogContext, @@ -212,9 +238,14 @@ export function computeZqlSpecsFromLiteSpecs( tables.forEach(fullTable => { fullTables?.set(fullTable.name, fullTable); - // Only include columns for which the mapped ZQL Value is defined. + const backfilling = new Set(fullTable.backfilling); + // Only include columns that: + // - have a defined ZQL Value + // - aren't backfilling if `includeBackfillingColumns` is false const visibleColumns = Object.entries(fullTable.columns).filter( - ([, {dataType}]) => liteTypeToZqlValueType(dataType), + ([col, {dataType}]) => + liteTypeToZqlValueType(dataType) && + (includeBackfillingColumns || !backfilling.has(col)), ); const notNullColumns = new Set( visibleColumns @@ -233,8 +264,13 @@ export function computeZqlSpecsFromLiteSpecs( ); if (keys.length === 0) { // Only include tables with a row key. + // + // Note that this will automatically exclude tables that are being + // backfilled (when includeBackfillingColumns is `false`) since candidate + // keys only include visible columns. lc?.debug?.( - `not syncing table ${fullTable.name} because it has no primary key`, + `not syncing table ${fullTable.name} because it ` + + (backfilling.size ? 'is being backfilled' : 'has no primary key'), ); return; } diff --git a/packages/zero-cache/src/services/analyze.ts b/packages/zero-cache/src/services/analyze.ts index 48ae848bb2..739d9e44a6 100644 --- a/packages/zero-cache/src/services/analyze.ts +++ b/packages/zero-cache/src/services/analyze.ts @@ -1,6 +1,7 @@ import type {LogContext} from '@rocicorp/logger'; import type {AnalyzeQueryResult} from '../../../zero-protocol/src/analyze-query-result.ts'; import type {AST} from '../../../zero-protocol/src/ast.ts'; +import type {ClientSchema} from '../../../zero-protocol/src/client-schema.ts'; import type {PermissionsConfig} from '../../../zero-schema/src/compiled-permissions.ts'; import {Debug} from '../../../zql/src/builder/debug-delegate.ts'; import {MemoryStorage} from '../../../zql/src/ivm/memory-storage.ts'; @@ -17,7 +18,6 @@ import {computeZqlSpecs, mustGetTableSpec} from '../db/lite-tables.ts'; import type {LiteAndZqlSpec, LiteTableSpec} from '../db/specs.ts'; import {runAst} from './run-ast.ts'; import {TimeSliceTimer, type TokenData} from './view-syncer/view-syncer.ts'; -import type {ClientSchema} from '../../../zero-protocol/src/client-schema.ts'; const TIME_SLICE_LAP_THRESHOLD_MS = 200; @@ -37,7 +37,13 @@ export async function analyzeQuery( const tableSpecs = new Map(); const tables = new Map(); - computeZqlSpecs(lc, db, tableSpecs, fullTables); + computeZqlSpecs( + lc, + db, + {includeBackfillingColumns: false}, + tableSpecs, + fullTables, + ); const planDebugger = joinPlans ? new AccumulatorDebugger() : undefined; const costModel = joinPlans diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.ts b/packages/zero-cache/src/services/change-source/custom/change-source.ts index b39c905fb3..9e66ae4ea0 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.ts @@ -269,7 +269,7 @@ function validateInitiallySyncedData( db: Database, shard: ShardID, ) { - const tables = computeZqlSpecs(lc, db); + const tables = computeZqlSpecs(lc, db, {includeBackfillingColumns: true}); const required = getRequiredTables(shard); for (const [name, columns] of Object.entries(required)) { const table = tables.get(name)?.zqlSpec; diff --git a/packages/zero-cache/src/services/change-source/pg/schema/published.ts b/packages/zero-cache/src/services/change-source/pg/schema/published.ts index c623ac0326..f06bddc135 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/published.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/published.ts @@ -183,6 +183,7 @@ export const publishedSchema = v const zqlSpecs = computeZqlSpecsFromLiteSpecs( tables.map(t => mapPostgresToLite(t)), indexes.map(mapPostgresToLiteIndex), + {includeBackfillingColumns: true}, ); return { indexes, diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index 0362d3764e..2391425be4 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -4,8 +4,12 @@ import type {JSONObject} from '../../../../shared/src/bigint-json.ts'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import {must} from '../../../../shared/src/must.ts'; import {Database} from '../../../../zqlite/src/db.ts'; -import {listIndexes, listTables} from '../../db/lite-tables.ts'; -import type {LiteIndexSpec, LiteTableSpec} from '../../db/specs.ts'; +import { + listIndexes, + listTables, + type LiteTableSpecWithReplicationStatus, +} from '../../db/lite-tables.ts'; +import type {LiteIndexSpec} from '../../db/specs.ts'; import {StatementRunner} from '../../db/statements.ts'; import {expectTables, initDB} from '../../test/lite.ts'; import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; @@ -17,7 +21,7 @@ import { } from './schema/replication-state.ts'; import {createChangeProcessor, ReplicationMessages} from './test-utils.ts'; -describe('replicator/incremental-sync', () => { +describe('replicator/change-processor', () => { let lc: LogContext; let servingReplica: Database; let servingProcessor: ChangeProcessor; @@ -51,7 +55,7 @@ describe('replicator/incremental-sync', () => { setup: string; downstream: ChangeStreamData[]; data: Record[]>; - tableSpecs?: LiteTableSpec[]; + tableSpecs?: LiteTableSpecWithReplicationStatus[]; indexSpecs?: LiteIndexSpec[]; }; @@ -527,6 +531,30 @@ describe('replicator/incremental-sync', () => { ], baz: [], ['_zero.changeLog2']: [ + { + backfillingColumnVersions: '{}', + op: 's', + pos: 0n, + rowKey: '{"id":1}', + stateVersion: '0e', + table: 'foo', + }, + { + backfillingColumnVersions: '{}', + op: 's', + pos: 1n, + rowKey: '{"id":2}', + stateVersion: '0e', + table: 'foo', + }, + { + backfillingColumnVersions: '{}', + op: 's', + pos: 2n, + rowKey: '{"id":3}', + stateVersion: '0e', + table: 'foo', + }, { stateVersion: '0e', pos: 3n, @@ -551,6 +579,30 @@ describe('replicator/incremental-sync', () => { rowKey: '{"id":6}', backfillingColumnVersions: '{}', }, + { + backfillingColumnVersions: '{}', + op: 's', + pos: 6n, + rowKey: '{"id":7}', + stateVersion: '0e', + table: 'baz', + }, + { + backfillingColumnVersions: '{}', + op: 's', + pos: 7n, + rowKey: '{"id":8}', + stateVersion: '0e', + table: 'baz', + }, + { + backfillingColumnVersions: '{}', + op: 's', + pos: 8n, + rowKey: '{"id":9}', + stateVersion: '0e', + table: 'baz', + }, { stateVersion: '0e', pos: -1n, @@ -1015,7 +1067,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":"bar"}', - backfillingColumnVersions: '{}', + backfillingColumnVersions: '{"serial":"0e"}', }, { stateVersion: '0e', @@ -1023,7 +1075,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":"baz"}', - backfillingColumnVersions: '{}', + backfillingColumnVersions: '{"serial":"0e"}', }, ], ['_zero.tableMetadata']: [ @@ -1121,6 +1173,7 @@ describe('replicator/incremental-sync', () => { pos: 5, }, }, + backfilling: ['serial'], }, ], indexSpecs: [], @@ -1196,6 +1249,7 @@ describe('replicator/incremental-sync', () => { pos: 2, }, }, + backfilling: [], }, ], indexSpecs: [], @@ -1298,7 +1352,7 @@ describe('replicator/incremental-sync', () => { table: 'foo', op: 's', rowKey: '{"id":4}', - backfillingColumnVersions: '{}', + backfillingColumnVersions: '{"newJSON":"0e"}', }, ], ['_zero.tableMetadata']: [ @@ -1386,6 +1440,7 @@ describe('replicator/incremental-sync', () => { pos: 5, }, }, + backfilling: ['newJSON'], }, ], indexSpecs: [], @@ -1413,6 +1468,14 @@ describe('replicator/incremental-sync', () => { {id: 4n, ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":3}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -1452,6 +1515,7 @@ describe('replicator/incremental-sync', () => { pos: 2, }, }, + backfilling: [], }, ], indexSpecs: [], @@ -1487,6 +1551,14 @@ describe('replicator/incremental-sync', () => { {id: 4n, newName: 'yay', ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":3}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -1534,6 +1606,7 @@ describe('replicator/incremental-sync', () => { pos: 3, }, }, + backfilling: [], }, ], indexSpecs: [ @@ -1576,6 +1649,14 @@ describe('replicator/incremental-sync', () => { {id: 4n, nolz: 'yay', ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":3}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -1623,6 +1704,7 @@ describe('replicator/incremental-sync', () => { pos: 2, }, }, + backfilling: [], }, ], indexSpecs: [ @@ -1668,6 +1750,14 @@ describe('replicator/incremental-sync', () => { {id: 4n, nolz: 'yay', ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":3}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -1715,6 +1805,7 @@ describe('replicator/incremental-sync', () => { pos: 2, }, }, + backfilling: [], }, ], indexSpecs: [ @@ -1758,6 +1849,14 @@ describe('replicator/incremental-sync', () => { {id: 4n, newName: 'yay', ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":3}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -1805,6 +1904,7 @@ describe('replicator/incremental-sync', () => { pos: 3, }, }, + backfilling: [], }, ], indexSpecs: [ @@ -1853,6 +1953,14 @@ describe('replicator/incremental-sync', () => { {id: 4n, num: 23n, ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":3}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -1900,6 +2008,7 @@ describe('replicator/incremental-sync', () => { pos: 2, }, }, + backfilling: [], }, ], indexSpecs: [ @@ -1944,6 +2053,14 @@ describe('replicator/incremental-sync', () => { {id: 4n, num: 23n, ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":3}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -1991,6 +2108,7 @@ describe('replicator/incremental-sync', () => { pos: 2, }, }, + backfilling: [], }, ], indexSpecs: [ @@ -2045,6 +2163,14 @@ describe('replicator/incremental-sync', () => { {id: 4n, number: 23n, ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":3}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -2092,6 +2218,7 @@ describe('replicator/incremental-sync', () => { pos: 2, }, }, + backfilling: [], }, ], indexSpecs: [ @@ -2123,6 +2250,14 @@ describe('replicator/incremental-sync', () => { ], data: { ['_zero.changeLog2']: [ + { + stateVersion: '0e', + pos: 0n, + table: 'foo', + op: 's', + rowKey: '{"id":4}', + backfillingColumnVersions: '{}', + }, { stateVersion: '0e', pos: -1n, @@ -2208,6 +2343,7 @@ describe('replicator/incremental-sync', () => { pos: 3, }, }, + backfilling: [], }, ], indexSpecs: [], @@ -2378,6 +2514,7 @@ describe('replicator/incremental-sync', () => { pos: 2, }, }, + backfilling: [], }, ], }, @@ -2385,22 +2522,33 @@ describe('replicator/incremental-sync', () => { for (const c of cases) { test(c.name, () => { - for (const [replica, processor, includeChangeLog] of [ - [servingReplica, servingProcessor, true], - [backupReplica, backupProcessor, false], - ] satisfies [Database, ChangeProcessor, boolean][]) { + for (const [replica, processor, log] of [ + [servingReplica, servingProcessor, 'all-entries'], + [backupReplica, backupProcessor, 'only-backfills'], + ] satisfies [ + Database, + ChangeProcessor, + 'all-entries' | 'only-backfills', + ][]) { initDB(replica, c.setup); for (const change of c.downstream) { processor.processMessage(lc, change); } - if (includeChangeLog) { + if (log === 'all-entries') { expectTables(replica, c.data, 'bigint'); } else { + // Only log entries relevant to backfill expectTables( replica, - {...c.data, ['_zero.changeLog2']: []}, + { + ...c.data, + ['_zero.changeLog2']: + c.data['_zero.changeLog2']?.filter( + log => log.backfillingColumnVersions !== '{}', + ) ?? [], + }, 'bigint', ); } diff --git a/packages/zero-cache/src/services/replicator/change-processor.ts b/packages/zero-cache/src/services/replicator/change-processor.ts index 4fdb85b03f..11de710911 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.ts @@ -13,6 +13,7 @@ import { computeZqlSpecs, listIndexes, listTables, + type LiteTableSpecWithReplicationStatus, } from '../../db/lite-tables.ts'; import { mapPostgresToLite, @@ -52,12 +53,7 @@ import type { } from '../change-source/protocol/current/data.ts'; import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import type {ReplicatorMode} from './replicator.ts'; -import { - logDeleteOp, - logResetOp, - logSetOp, - logTruncateOp, -} from './schema/change-log.ts'; +import {ChangeLog} from './schema/change-log.ts'; import {ColumnMetadataStore} from './schema/column-metadata.ts'; import { ZERO_VERSION_COLUMN_NAME, @@ -85,6 +81,7 @@ export type CommitResult = { */ export class ChangeProcessor { readonly #db: StatementRunner; + readonly #changeLog: ChangeLog; readonly #tableMetadata: TableMetadataTracker; readonly #mode: ChangeProcessorMode; readonly #failService: (lc: LogContext, err: unknown) => void; @@ -104,6 +101,7 @@ export class ChangeProcessor { failService: (lc: LogContext, err: unknown) => void, ) { this.#db = db; + this.#changeLog = new ChangeLog(db.db); this.#tableMetadata = new TableMetadataTracker(db.db); this.#mode = mode; this.#failService = failService; @@ -171,6 +169,7 @@ export class ChangeProcessor { lc, this.#db, this.#mode, + this.#changeLog, this.#tableMetadata, this.#tableSpecs, commitVersion, @@ -307,8 +306,9 @@ class TransactionProcessor { readonly #db: StatementRunner; readonly #mode: ChangeProcessorMode; readonly #version: LexiVersion; + readonly #changeLog: ChangeLog; readonly #tableMetadata: TableMetadataTracker; - readonly #tableSpecs: Map; + readonly #tableSpecs: Map; readonly #jsonFormat: JSONFormat; readonly #columnMetadata: ColumnMetadataStore; @@ -319,8 +319,9 @@ class TransactionProcessor { lc: LogContext, db: StatementRunner, mode: ChangeProcessorMode, + changeLog: ChangeLog, tableMetadata: TableMetadataTracker, - tableSpecs: Map, + tableSpecs: Map, commitVersion: LexiVersion, jsonFormat: JSONFormat, ) { @@ -356,6 +357,7 @@ class TransactionProcessor { this.#db = db; this.#version = commitVersion; this.#lc = lc.withContext('version', commitVersion); + this.#changeLog = changeLog; this.#tableMetadata = tableMetadata; this.#tableSpecs = tableSpecs; // The column_metadata table is guaranteed to exist since the @@ -370,7 +372,9 @@ class TransactionProcessor { #reloadTableSpecs() { this.#tableSpecs.clear(); // zqlSpecs include the primary key derived from unique indexes - const zqlSpecs = computeZqlSpecs(this.#lc, this.#db.db); + const zqlSpecs = computeZqlSpecs(this.#lc, this.#db.db, { + includeBackfillingColumns: true, + }); for (let spec of listTables(this.#db.db)) { if (!spec.primaryKey) { spec = { @@ -415,11 +419,8 @@ class TransactionProcessor { processInsert(insert: MessageInsert) { const table = liteTableName(insert.relation); - const newRow = liteRow( - insert.new, - this.#tableSpec(table), - this.#jsonFormat, - ); + const tableSpec = this.#tableSpec(table); + const newRow = liteRow(insert.new, tableSpec, this.#jsonFormat); this.#upsert(table, { ...newRow.row, @@ -437,7 +438,7 @@ class TransactionProcessor { return; } const key = this.#getKey(newRow, insert); - this.#logSetOp(table, key); + this.#logSetOp(table, key, getBackfilledColumns(newRow.row, tableSpec)); } #upsert(table: string, row: LiteRow) { @@ -468,11 +469,8 @@ class TransactionProcessor { // with TOASTed values. processUpdate(update: MessageUpdate) { const table = liteTableName(update.relation); - const newRow = liteRow( - update.new, - this.#tableSpec(table), - this.#jsonFormat, - ); + const tableSpec = this.#tableSpec(table); + const newRow = liteRow(update.new, tableSpec, this.#jsonFormat); const row = {...newRow.row, [ZERO_VERSION_COLUMN_NAME]: this.#version}; // update.key is set with the old values if the key has changed. @@ -485,9 +483,9 @@ class TransactionProcessor { const newKey = this.#getKey(newRow, update); if (oldKey) { - this.#logDeleteOp(table, oldKey); + this.#logDeleteOp(table, oldKey, tableSpec.backfilling); } - this.#logSetOp(table, newKey); + this.#logSetOp(table, newKey, getBackfilledColumns(newRow.row, tableSpec)); const currKey = oldKey ?? newKey; const conds = Object.keys(currKey).map(col => `${id(col)}=?`); @@ -511,16 +509,14 @@ class TransactionProcessor { processDelete(del: MessageDelete) { const table = liteTableName(del.relation); + const tableSpec = this.#tableSpec(table); const rowKey = this.#getKey( - liteRow(del.key, this.#tableSpec(table), this.#jsonFormat), + liteRow(del.key, tableSpec, this.#jsonFormat), del, ); this.#delete(table, rowKey); - - if (this.#mode === 'serving') { - this.#logDeleteOp(table, rowKey); - } + this.#logDeleteOp(table, rowKey, tableSpec.backfilling); } #delete(table: string, rowKey: LiteRowKey) { @@ -712,28 +708,47 @@ class TransactionProcessor { this.#logResetOp(table); } - #logSetOp(table: string, key: LiteRowKey) { - if (this.#mode === 'serving') { - logSetOp(this.#db, this.#version, this.#pos++, table, key); + /** + * @param backfilledColumns `backfilling` columns for which values were set + */ + #logSetOp( + table: string, + key: LiteRowKey, + backfilledColumns: string[] | undefined, + ) { + // The "serving" replicator always writes to the change-log (for IVM). + // The "backup" replicator only needs to write to the change log + // when writing columns that are being backfilled. + if (this.#mode === 'serving' || backfilledColumns !== undefined) { + this.#changeLog.logSetOp( + this.#version, + this.#pos++, + table, + key, + backfilledColumns, + ); } } - #logDeleteOp(table: string, key: LiteRowKey) { - if (this.#mode === 'serving') { - logDeleteOp(this.#db, this.#version, this.#pos++, table, key); + #logDeleteOp(table: string, key: LiteRowKey, backfilling?: string[]) { + // The "serving" replicator always writes to the change-log (for IVM). + // The "backup" replicator only needs to write to the change log + // when writing columns that are being backfilled. + if (this.#mode === 'serving' || backfilling?.length) { + this.#changeLog.logDeleteOp(this.#version, this.#pos++, table, key); } } #logTruncateOp(table: string) { if (this.#mode === 'serving') { - logTruncateOp(this.#db, this.#version, table); + this.#changeLog.logTruncateOp(this.#version, table); } } #logResetOp(table: string) { this.#schemaChanged = true; if (this.#mode === 'serving') { - logResetOp(this.#db, this.#version, table); + this.#changeLog.logResetOp(this.#version, table); } this.#reloadTableSpecs(); } @@ -773,6 +788,16 @@ class TransactionProcessor { } } +function getBackfilledColumns( + row: LiteRow, + {backfilling}: LiteTableSpecWithReplicationStatus, +): string[] | undefined { + if (!backfilling?.length) { + return undefined; // common case + } + return backfilling.filter(col => col in row); +} + function ensureError(err: unknown): Error { if (err instanceof Error) { return err; diff --git a/packages/zero-cache/src/services/replicator/replication-status.ts b/packages/zero-cache/src/services/replicator/replication-status.ts index 7315b39712..a5d503beba 100644 --- a/packages/zero-cache/src/services/replicator/replication-status.ts +++ b/packages/zero-cache/src/services/replicator/replication-status.ts @@ -143,6 +143,9 @@ function getReplicatedTables(db: Database): ReplicatedTable[] { const clientSchema = computeZqlSpecs( createSilentLogContext(), // avoid logging warnings about indexes db, + // TODO: Consider exposing backfilling columns with an indication + // of backfill status. + {includeBackfillingColumns: false}, new Map(), fullTables, ); diff --git a/packages/zero-cache/src/services/replicator/schema/change-log.test.ts b/packages/zero-cache/src/services/replicator/schema/change-log.test.ts index cb1dbbcf23..b20371e498 100644 --- a/packages/zero-cache/src/services/replicator/schema/change-log.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/change-log.test.ts @@ -3,21 +3,17 @@ import {createSilentLogContext} from '../../../../../shared/src/logging-test-uti import {Database} from '../../../../../zqlite/src/db.ts'; import {StatementRunner} from '../../../db/statements.ts'; import {expectTableExact} from '../../../test/lite.ts'; -import { - CREATE_CHANGELOG_SCHEMA, - logDeleteOp, - logResetOp, - logSetOp, - logTruncateOp, -} from './change-log.ts'; +import {ChangeLog, CREATE_CHANGELOG_SCHEMA} from './change-log.ts'; describe('replicator/schema/change-log', () => { let db: StatementRunner; + let changeLog: ChangeLog; beforeEach(() => { const conn = new Database(createSilentLogContext(), ':memory:'); conn.exec(CREATE_CHANGELOG_SCHEMA); db = new StatementRunner(conn); + changeLog = new ChangeLog(conn); }); function expectChangeLog(...entries: unknown[]) { @@ -33,19 +29,19 @@ describe('replicator/schema/change-log', () => { ); } - test('replicator/schema/change-log', () => { - expect(logSetOp(db, '01', 0, 'foo', {a: 1, b: 2})).toMatchInlineSnapshot( - `"{"a":1,"b":2}"`, - ); - expect(logSetOp(db, '01', 1, 'foo', {b: 3, a: 2})).toMatchInlineSnapshot( - `"{"a":2,"b":3}"`, - ); - expect(logSetOp(db, '01', 2, 'bar', {b: 2, a: 1})).toMatchInlineSnapshot( - `"{"a":1,"b":2}"`, - ); - expect(logSetOp(db, '01', 3, 'bar', {a: 2, b: 3})).toMatchInlineSnapshot( - `"{"a":2,"b":3}"`, - ); + test('change-log', () => { + expect( + changeLog.logSetOp('01', 0, 'foo', {a: 1, b: 2}, undefined), + ).toMatchInlineSnapshot(`"{"a":1,"b":2}"`); + expect( + changeLog.logSetOp('01', 1, 'foo', {b: 3, a: 2}, undefined), + ).toMatchInlineSnapshot(`"{"a":2,"b":3}"`); + expect( + changeLog.logSetOp('01', 2, 'bar', {b: 2, a: 1}, undefined), + ).toMatchInlineSnapshot(`"{"a":1,"b":2}"`); + expect( + changeLog.logSetOp('01', 3, 'bar', {a: 2, b: 3}, undefined), + ).toMatchInlineSnapshot(`"{"a":2,"b":3}"`); expectChangeLog( { @@ -82,9 +78,9 @@ describe('replicator/schema/change-log', () => { }, ); - expect(logDeleteOp(db, '02', 0, 'bar', {b: 3, a: 2})).toMatchInlineSnapshot( - `"{"a":2,"b":3}"`, - ); + expect( + changeLog.logDeleteOp('02', 0, 'bar', {b: 3, a: 2}), + ).toMatchInlineSnapshot(`"{"a":2,"b":3}"`); expectChangeLog( { @@ -121,16 +117,16 @@ describe('replicator/schema/change-log', () => { }, ); - expect(logDeleteOp(db, '03', 0, 'foo', {a: 2, b: 3})).toMatchInlineSnapshot( - `"{"a":2,"b":3}"`, - ); - expect(logSetOp(db, '03', 1, 'foo', {b: 4, a: 5})).toMatchInlineSnapshot( - `"{"a":5,"b":4}"`, - ); - logTruncateOp(db, '03', 'foo'); // Clears all "foo" log entries, including the previous two. - expect(logSetOp(db, '03', 2, 'foo', {b: 9, a: 8})).toMatchInlineSnapshot( - `"{"a":8,"b":9}"`, - ); + expect( + changeLog.logDeleteOp('03', 0, 'foo', {a: 2, b: 3}), + ).toMatchInlineSnapshot(`"{"a":2,"b":3}"`); + expect( + changeLog.logSetOp('03', 1, 'foo', {b: 4, a: 5}, undefined), + ).toMatchInlineSnapshot(`"{"a":5,"b":4}"`); + changeLog.logTruncateOp('03', 'foo'); + expect( + changeLog.logSetOp('03', 2, 'foo', {b: 9, a: 8}, undefined), + ).toMatchInlineSnapshot(`"{"a":8,"b":9}"`); expectChangeLog( { @@ -165,6 +161,22 @@ describe('replicator/schema/change-log', () => { op: 't', backfillingColumnVersions: '{}', }, + { + stateVersion: '03', + pos: 0, + table: 'foo', + rowKey: '{"a":2,"b":3}', + op: 'd', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '03', + pos: 1, + table: 'foo', + rowKey: '{"a":5,"b":4}', + op: 's', + backfillingColumnVersions: '{}', + }, { stateVersion: '03', pos: 2, @@ -175,16 +187,16 @@ describe('replicator/schema/change-log', () => { }, ); - expect(logDeleteOp(db, '04', 0, 'bar', {a: 1, b: 2})).toMatchInlineSnapshot( - `"{"a":1,"b":2}"`, - ); - expect(logSetOp(db, '04', 1, 'bar', {b: 3, a: 2})).toMatchInlineSnapshot( - `"{"a":2,"b":3}"`, - ); - logResetOp(db, '04', 'bar'); - expect(logSetOp(db, '04', 2, 'bar', {b: 9, a: 7})).toMatchInlineSnapshot( - `"{"a":7,"b":9}"`, - ); + expect( + changeLog.logDeleteOp('04', 0, 'bar', {a: 1, b: 2}), + ).toMatchInlineSnapshot(`"{"a":1,"b":2}"`); + expect( + changeLog.logSetOp('04', 1, 'bar', {b: 3, a: 2}, undefined), + ).toMatchInlineSnapshot(`"{"a":2,"b":3}"`); + changeLog.logResetOp('04', 'bar'); + expect( + changeLog.logSetOp('04', 2, 'bar', {b: 9, a: 7}, undefined), + ).toMatchInlineSnapshot(`"{"a":7,"b":9}"`); expectChangeLog( { @@ -203,6 +215,22 @@ describe('replicator/schema/change-log', () => { op: 't', backfillingColumnVersions: '{}', }, + { + stateVersion: '03', + pos: 0, + table: 'foo', + rowKey: '{"a":2,"b":3}', + op: 'd', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '03', + pos: 1, + table: 'foo', + rowKey: '{"a":5,"b":4}', + op: 's', + backfillingColumnVersions: '{}', + }, { stateVersion: '03', pos: 2, @@ -219,6 +247,22 @@ describe('replicator/schema/change-log', () => { op: 'r', backfillingColumnVersions: '{}', }, + { + stateVersion: '04', + pos: 0, + table: 'bar', + rowKey: '{"a":1,"b":2}', + op: 'd', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '04', + pos: 1, + table: 'bar', + rowKey: '{"a":2,"b":3}', + op: 's', + backfillingColumnVersions: '{}', + }, { stateVersion: '04', pos: 2, @@ -230,10 +274,10 @@ describe('replicator/schema/change-log', () => { ); // The last table-wide op is the only one that persists. - logTruncateOp(db, '05', 'baz'); - logResetOp(db, '05', 'baz'); - logResetOp(db, '05', 'baz'); - logResetOp(db, '05', 'baz'); + changeLog.logTruncateOp('05', 'baz'); + changeLog.logResetOp('05', 'baz'); + changeLog.logResetOp('05', 'baz'); + changeLog.logResetOp('05', 'baz'); expectChangeLog( { @@ -252,6 +296,22 @@ describe('replicator/schema/change-log', () => { op: 't', backfillingColumnVersions: '{}', }, + { + stateVersion: '03', + pos: 0, + table: 'foo', + rowKey: '{"a":2,"b":3}', + op: 'd', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '03', + pos: 1, + table: 'foo', + rowKey: '{"a":5,"b":4}', + op: 's', + backfillingColumnVersions: '{}', + }, { stateVersion: '03', pos: 2, @@ -268,6 +328,22 @@ describe('replicator/schema/change-log', () => { op: 'r', backfillingColumnVersions: '{}', }, + { + stateVersion: '04', + pos: 0, + table: 'bar', + rowKey: '{"a":1,"b":2}', + op: 'd', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '04', + pos: 1, + table: 'bar', + rowKey: '{"a":2,"b":3}', + op: 's', + backfillingColumnVersions: '{}', + }, { stateVersion: '04', pos: 2, @@ -286,10 +362,10 @@ describe('replicator/schema/change-log', () => { }, ); - logResetOp(db, '06', 'baz'); - logResetOp(db, '06', 'baz'); - logTruncateOp(db, '06', 'baz'); - logTruncateOp(db, '06', 'baz'); + changeLog.logResetOp('06', 'baz'); + changeLog.logResetOp('06', 'baz'); + changeLog.logTruncateOp('06', 'baz'); + changeLog.logTruncateOp('06', 'baz'); expectChangeLog( { @@ -308,6 +384,22 @@ describe('replicator/schema/change-log', () => { op: 't', backfillingColumnVersions: '{}', }, + { + stateVersion: '03', + pos: 0, + table: 'foo', + rowKey: '{"a":2,"b":3}', + op: 'd', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '03', + pos: 1, + table: 'foo', + rowKey: '{"a":5,"b":4}', + op: 's', + backfillingColumnVersions: '{}', + }, { stateVersion: '03', pos: 2, @@ -324,6 +416,22 @@ describe('replicator/schema/change-log', () => { op: 'r', backfillingColumnVersions: '{}', }, + { + stateVersion: '04', + pos: 0, + table: 'bar', + rowKey: '{"a":1,"b":2}', + op: 'd', + backfillingColumnVersions: '{}', + }, + { + stateVersion: '04', + pos: 1, + table: 'bar', + rowKey: '{"a":2,"b":3}', + op: 's', + backfillingColumnVersions: '{}', + }, { stateVersion: '04', pos: 2, @@ -350,4 +458,78 @@ describe('replicator/schema/change-log', () => { }, ); }); + + test('change-log with backfill', () => { + changeLog.logSetOp('123', 0, 'foo', {a: 1, b: 2}, ['c', 'b']); + + expectChangeLog({ + stateVersion: '123', + pos: 0, + table: 'foo', + rowKey: '{"a":1,"b":2}', + op: 's', + backfillingColumnVersions: '{"c":"123","b":"123"}', + }); + + changeLog.logSetOp('2440', 0, 'foo', {a: 1, b: 2}, ['d', 'c']); + + expectChangeLog({ + stateVersion: '2440', + pos: 0, + table: 'foo', + rowKey: '{"a":1,"b":2}', + op: 's', + backfillingColumnVersions: '{"c":"2440","b":"123","d":"2440"}', + }); + + // A set that does not write any backfilling column values preserves + // the existing versions. + changeLog.logSetOp('2560', 0, 'foo', {a: 1, b: 2}, []); + + expectChangeLog({ + stateVersion: '2560', + pos: 0, + table: 'foo', + rowKey: '{"a":1,"b":2}', + op: 's', + backfillingColumnVersions: '{"c":"2440","b":"123","d":"2440"}', + }); + + // A delete op clears the backfillingColumnVersions. + changeLog.logDeleteOp('2568', 0, 'foo', {a: 1, b: 2}); + + expectChangeLog({ + stateVersion: '2568', + pos: 0, + table: 'foo', + rowKey: '{"a":1,"b":2}', + op: 'd', + backfillingColumnVersions: '{}', + }); + + changeLog.logSetOp('2888', 0, 'foo', {a: 1, b: 2}, ['e', 'f']); + + expectChangeLog({ + stateVersion: '2888', + pos: 0, + table: 'foo', + rowKey: '{"a":1,"b":2}', + op: 's', + backfillingColumnVersions: '{"e":"2888","f":"2888"}', + }); + + // A set that specifies `undefined` as backfilled is the signal + // that the backfill is complete and column version data can be + // cleared. + changeLog.logSetOp('2990', 0, 'foo', {a: 1, b: 2}, undefined); + + expectChangeLog({ + stateVersion: '2990', + pos: 0, + table: 'foo', + rowKey: '{"a":1,"b":2}', + op: 's', + backfillingColumnVersions: '{}', + }); + }); }); diff --git a/packages/zero-cache/src/services/replicator/schema/change-log.ts b/packages/zero-cache/src/services/replicator/schema/change-log.ts index 94fec66e90..8397713c6a 100644 --- a/packages/zero-cache/src/services/replicator/schema/change-log.ts +++ b/packages/zero-cache/src/services/replicator/schema/change-log.ts @@ -4,7 +4,7 @@ import { stringify, } from '../../../../../shared/src/bigint-json.ts'; import * as v from '../../../../../shared/src/valita.ts'; -import type {StatementRunner} from '../../../db/statements.ts'; +import type {Database, Statement} from '../../../../../zqlite/src/db.ts'; import type {LexiVersion} from '../../../types/lexi-version.ts'; import type {LiteRowKey} from '../../../types/lite.ts'; import {normalizedKeyOrder} from '../../../types/row-key.ts'; @@ -107,82 +107,111 @@ export const changeLogEntrySchema = v export type ChangeLogEntry = v.Infer; -export function logSetOp( - db: StatementRunner, - version: LexiVersion, - pos: number, - table: string, - row: LiteRowKey, -): string { - return logRowOp(db, version, pos, table, row, SET_OP); -} +export class ChangeLog { + readonly #logRowOpStmt: Statement; + readonly #logRowOpWithBackfillStmt: Statement; + readonly #logTableWideOpStmt; -export function logDeleteOp( - db: StatementRunner, - version: LexiVersion, - pos: number, - table: string, - row: LiteRowKey, -): string { - return logRowOp(db, version, pos, table, row, DEL_OP); -} + constructor(db: Database) { + this.#logRowOpStmt = db.prepare(/*sql*/ ` + INSERT OR REPLACE INTO "_zero.changeLog2" + (stateVersion, pos, "table", rowKey, op) + VALUES (@version, @pos, @table, JSON(@rowKey), @op) + `); -function logRowOp( - db: StatementRunner, - version: LexiVersion, - pos: number, - table: string, - row: LiteRowKey, - op: string, -): string { - const rowKey = stringify(normalizedKeyOrder(row)); - db.run( - ` - INSERT OR REPLACE INTO "_zero.changeLog2" - (stateVersion, pos, "table", rowKey, op) - VALUES (@version, @pos, @table, JSON(@rowKey), @op) - `, - {version, pos, table, rowKey, op}, - ); - return rowKey; -} -export function logTruncateOp( - db: StatementRunner, - version: LexiVersion, - table: string, -) { - logTableWideOp(db, version, table, TRUNCATE_OP); -} + this.#logRowOpWithBackfillStmt = db.prepare(/*sql*/ ` + INSERT INTO "_zero.changeLog2" + (stateVersion, pos, "table", rowKey, op, backfillingColumnVersions) + VALUES (@version, @pos, @table, JSON(@rowKey), @op, + JSON(@backfillingColumnVersions)) + ON CONFLICT ("table", rowKey) DO UPDATE + SET stateVersion = excluded.stateVersion, + pos = excluded.pos, + op = excluded.op, + backfillingColumnVersions = json_patch( + backfillingColumnVersions, excluded.backfillingColumnVersions) + `); -export function logResetOp( - db: StatementRunner, - version: LexiVersion, - table: string, -) { - logTableWideOp(db, version, table, RESET_OP); -} + // Because table-wide ops result in aborting an incremental update + // and rehydrating all queries at "head", they are assigned pos = -1 + // as an optimization to abort as early as possible to skip unnecessary + // updates. + // + // However, changeLog entries that are destined to be "skipped" are + // nonetheless kept for the purpose of tracking backfillingColumnVersions. + this.#logTableWideOpStmt = db.prepare(/*sql*/ ` + INSERT OR REPLACE INTO "_zero.changeLog2" + (stateVersion, pos, "table", rowKey, op) + VALUES (@version, -1, @table, @version, @op) + `); + } -function logTableWideOp( - db: StatementRunner, - version: LexiVersion, - table: string, - op: 't' | 'r', -) { - // Delete any existing changes for the table (in this version) since the - // table wide op invalidates them. - db.run( - ` - DELETE FROM "_zero.changeLog2" WHERE stateVersion = ? AND "table" = ? - `, - version, - table, - ); + /** + * + * @param backfilled The backfilling columns for which values were set. Note + * that an empty list and the `undefined` value mean different things; + * * An empty list indicates that a backfill is in progress but no + * backfilling values were set. In this case, existing + * backfillingColumnVersions are preserved. + * * `undefined` indicates that there are no columns being backfilled. + * In this case, any vestigial `backfillingColumnVersions` value + * is cleared. + */ + logSetOp( + version: LexiVersion, + pos: number, + table: string, + row: LiteRowKey, + backfilled: string[] | undefined, + ): string { + return this.#logRowOp(version, pos, table, row, SET_OP, backfilled); + } - db.run( - ` - INSERT OR REPLACE INTO "_zero.changeLog2" (stateVersion, pos, "table", rowKey, op) - VALUES (@version, -1, @table, @version, @op) - `, - {version, table, op}, - ); + logDeleteOp( + version: LexiVersion, + pos: number, + table: string, + row: LiteRowKey, + ): string { + // Note: For delete ops, it is always safe to clear the + // backfillingColumnVersions because the backfill algorithm + // understands that deletes apply to the whole row. + return this.#logRowOp(version, pos, table, row, DEL_OP, undefined); + } + + #logRowOp( + version: LexiVersion, + pos: number, + table: string, + row: LiteRowKey, + op: string, + backfilled: string[] | undefined, + ): string { + const rowKey = stringify(normalizedKeyOrder(row)); + if (backfilled === undefined) { + this.#logRowOpStmt.run({version, pos, table, rowKey, op}); + } else { + const versions: Record = {}; + for (const col of backfilled) { + versions[col] = version; + } + this.#logRowOpWithBackfillStmt.run({ + version, + pos, + table, + rowKey, + op, + backfillingColumnVersions: JSON.stringify(versions), + }); + } + return rowKey; + } + + logTruncateOp(version: LexiVersion, table: string) { + this.#logTableWideOpStmt.run({version, table, op: TRUNCATE_OP}); + } + + logResetOp(version: LexiVersion, table: string) { + this.#logTableWideOpStmt.run({version, table, op: RESET_OP}); + } } diff --git a/packages/zero-cache/src/services/view-syncer/client-schema.test.ts b/packages/zero-cache/src/services/view-syncer/client-schema.test.ts index 978fb58a66..ab0b395742 100644 --- a/packages/zero-cache/src/services/view-syncer/client-schema.test.ts +++ b/packages/zero-cache/src/services/view-syncer/client-schema.test.ts @@ -58,7 +58,13 @@ describe('client schemas', () => { CREATE TABLE "zero.permissions" (lock bool PRIMARY KEY); CREATE TABLE "zero_0.clients" (clientGroupID TEXT PRIMARY KEY); `); - computeZqlSpecs(lc, db, tableSpecs, fullTables); + computeZqlSpecs( + lc, + db, + {includeBackfillingColumns: false}, + tableSpecs, + fullTables, + ); }); test.each([ diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts index fcd6d5c137..d2f47c3ced 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts @@ -16,9 +16,11 @@ import { } from '../../../../zqlite/src/database-storage.ts'; import type {Database as DB} from '../../../../zqlite/src/db.ts'; import {Database} from '../../../../zqlite/src/db.ts'; +import {listTables} from '../../db/lite-tables.ts'; import {InspectorDelegate} from '../../server/inspector-delegate.ts'; import {DbFile} from '../../test/lite.ts'; import {upstreamSchema, type ShardID} from '../../types/shards.ts'; +import {populateFromExistingTables} from '../replicator/schema/column-metadata.ts'; import {initReplicationState} from '../replicator/schema/replication-state.ts'; import { fakeReplicator, @@ -85,6 +87,7 @@ describe('view-syncer/pipeline-driver', () => { issueID TEXT, upvotes INTEGER, ignored BYTEA, + stillBeingBackfilled TEXT, _0_version TEXT NOT NULL); CREATE TABLE "issueLabels" ( issueID TEXT, @@ -122,6 +125,18 @@ describe('view-syncer/pipeline-driver', () => { INSERT INTO "uniques" (id, name, _0_version) VALUES ('foo', 'bar', '123'); INSERT INTO "uniques" (id, name, _0_version) VALUES ('boo', 'dar', '123'); `); + + // Initialize ColumnMetadata and mark a column as being backfilled, + // to verify that it does not appear in the pipeline results. + populateFromExistingTables(db, listTables(db, false)); + db.prepare( + /*sql*/ ` + UPDATE "_zero.column_metadata" + SET backfill = '{"upstreamID":123}' + WHERE table_name = 'comments' + AND column_name = 'stillBeingBackfilled' + `, + ).run(); replicator = fakeReplicator(lc, db); }); diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 9b343d1792..875bcc85ad 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -202,7 +202,13 @@ export class PipelineDriver { #initAndResetCommon(clientSchema: ClientSchema) { const {db} = this.#snapshotter.current(); const fullTables = new Map(); - computeZqlSpecs(this.#lc, db.db, this.#tableSpecs, fullTables); + computeZqlSpecs( + this.#lc, + db.db, + {includeBackfillingColumns: false}, + this.#tableSpecs, + fullTables, + ); checkClientSchema( this.#shardID, clientSchema, diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts index e72a5f9df7..6c4eacc756 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts @@ -1,9 +1,10 @@ import type {LogContext} from '@rocicorp/logger'; import {afterEach, beforeEach, describe, expect, test} from 'vitest'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; -import {computeZqlSpecs} from '../../db/lite-tables.ts'; +import {computeZqlSpecs, listTables} from '../../db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../../db/specs.ts'; import {DbFile, expectTables} from '../../test/lite.ts'; +import {populateFromExistingTables} from '../replicator/schema/column-metadata.ts'; import {initReplicationState} from '../replicator/schema/replication-state.ts'; import { fakeReplicator, @@ -28,8 +29,7 @@ describe('view-syncer/snapshotter', () => { dbFile = new DbFile('snapshotter_test'); const db = dbFile.connect(lc); db.pragma('journal_mode = WAL2'); - db.exec( - ` + db.exec(/*sql*/ ` CREATE TABLE "my_app.permissions" ( "lock" INT PRIMARY KEY, "permissions" JSON, @@ -37,7 +37,14 @@ describe('view-syncer/snapshotter', () => { _0_version TEXT NOT NULL ); INSERT INTO "my_app.permissions" ("lock", "_0_version") VALUES (1, '01'); - CREATE TABLE issues(id INT PRIMARY KEY, owner INTEGER, desc TEXT, ignore UNSUPPORTED_TYPE, _0_version TEXT NOT NULL); + CREATE TABLE issues( + id INT PRIMARY KEY, + owner INTEGER, + desc TEXT, + ignore UNSUPPORTED_TYPE, + stillBeingBackfilled TEXT, + _0_version TEXT NOT NULL + ); CREATE TABLE users(id INT PRIMARY KEY, handle TEXT UNIQUE, ignore UNSUPPORTED_TYPE, _0_version TEXT NOT NULL); CREATE TABLE comments(id INT PRIMARY KEY, desc TEXT, ignore UNSUPPORTED_TYPE, _0_version TEXT NOT NULL); @@ -47,11 +54,22 @@ describe('view-syncer/snapshotter', () => { INSERT INTO users(id, handle, ignore, _0_version) VALUES(10, 'alice', 'vvv', '01'); INSERT INTO users(id, handle, ignore, _0_version) VALUES(20, 'bob', 'vxv', '01'); - `, - ); + `); initReplicationState(db, ['zero_data'], '01'); - tableSpecs = computeZqlSpecs(lc, db); + // Initialize ColumnMetadata and mark a column as being backfilled, + // to verify that it does not appear in the pipeline results. + populateFromExistingTables(db, listTables(db, false)); + db.prepare( + /*sql*/ ` + UPDATE "_zero.column_metadata" + SET backfill = '{"upstreamID":123}' + WHERE table_name = 'issues' + AND column_name = 'stillBeingBackfilled' + `, + ).run(); + + tableSpecs = computeZqlSpecs(lc, db, {includeBackfillingColumns: false}); replicator = fakeReplicator(lc, db); s = new Snapshotter(lc, dbFile.path, {appID: 'my_app'}).init(); @@ -68,9 +86,30 @@ describe('view-syncer/snapshotter', () => { expect(version).toBe('01'); expectTables(db.db, { issues: [ - {id: 1, owner: 10, desc: 'foo', ignore: 'zzz', ['_0_version']: '01'}, - {id: 2, owner: 10, desc: 'bar', ignore: 'xyz', ['_0_version']: '01'}, - {id: 3, owner: 20, desc: 'baz', ignore: 'yyy', ['_0_version']: '01'}, + { + id: 1, + owner: 10, + desc: 'foo', + ignore: 'zzz', + stillBeingBackfilled: null, + ['_0_version']: '01', + }, + { + id: 2, + owner: 10, + desc: 'bar', + ignore: 'xyz', + stillBeingBackfilled: null, + ['_0_version']: '01', + }, + { + id: 3, + owner: 20, + desc: 'baz', + ignore: 'yyy', + stillBeingBackfilled: null, + ['_0_version']: '01', + }, ], users: [ {id: 10, handle: 'alice', ignore: 'vvv', ['_0_version']: '01'}, diff --git a/packages/zql-benchmarks/src/planner-cost.bench.ts b/packages/zql-benchmarks/src/planner-cost.bench.ts index d2f1af701e..bc52dc008a 100644 --- a/packages/zql-benchmarks/src/planner-cost.bench.ts +++ b/packages/zql-benchmarks/src/planner-cost.bench.ts @@ -1,20 +1,20 @@ import {bench, run, summary} from 'mitata'; import {expect, test} from 'vitest'; import {createSilentLogContext} from '../../shared/src/logging-test-utils.ts'; +import {must} from '../../shared/src/must.ts'; import {computeZqlSpecs} from '../../zero-cache/src/db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../../zero-cache/src/db/specs.ts'; import {mapAST} from '../../zero-protocol/src/ast.ts'; import {clientToServer} from '../../zero-schema/src/name-mapper.ts'; +import type {TableSchema} from '../../zero-types/src/schema.ts'; import {getChinook} from '../../zql-integration-tests/src/chinook/get-deps.ts'; import {schema} from '../../zql-integration-tests/src/chinook/schema.ts'; import {bootstrap} from '../../zql-integration-tests/src/helpers/runner.ts'; import {planQuery} from '../../zql/src/planner/planner-builder.ts'; +import {completeOrdering} from '../../zql/src/query/complete-ordering.ts'; import {asQueryInternals} from '../../zql/src/query/query-internals.ts'; import type {Query} from '../../zql/src/query/query.ts'; import {createSQLiteCostModel} from '../../zqlite/src/sqlite-cost-model.ts'; -import {completeOrdering} from '../../zql/src/query/complete-ordering.ts'; -import {must} from '../../shared/src/must.ts'; -import type {TableSchema} from '../../zero-types/src/schema.ts'; const pgContent = await getChinook(); @@ -30,7 +30,12 @@ dbs.sqlite.exec('ANALYZE;'); const tables: {[key: string]: TableSchema} = schema.tables; // Get table specs using computeZqlSpecs const tableSpecs = new Map(); -computeZqlSpecs(createSilentLogContext(), dbs.sqlite, tableSpecs); +computeZqlSpecs( + createSilentLogContext(), + dbs.sqlite, + {includeBackfillingColumns: false}, + tableSpecs, +); // Create SQLite cost model const costModel = createSQLiteCostModel(dbs.sqlite, tableSpecs); diff --git a/packages/zql-benchmarks/src/planner-hydration.bench.ts b/packages/zql-benchmarks/src/planner-hydration.bench.ts index 7e5173a15d..7a704670ab 100644 --- a/packages/zql-benchmarks/src/planner-hydration.bench.ts +++ b/packages/zql-benchmarks/src/planner-hydration.bench.ts @@ -36,7 +36,12 @@ dbs.sqlite.exec('ANALYZE;'); const tables: {[key: string]: TableSchema} = schema.tables; // Get table specs using computeZqlSpecs const tableSpecs = new Map(); -computeZqlSpecs(createSilentLogContext(), dbs.sqlite, tableSpecs); +computeZqlSpecs( + createSilentLogContext(), + dbs.sqlite, + {includeBackfillingColumns: false}, + tableSpecs, +); // Create SQLite cost model const costModel = createSQLiteCostModel(dbs.sqlite, tableSpecs); diff --git a/packages/zql-benchmarks/src/zbugs.bench.ts b/packages/zql-benchmarks/src/zbugs.bench.ts index 303ac31514..dcdcc5e4f2 100644 --- a/packages/zql-benchmarks/src/zbugs.bench.ts +++ b/packages/zql-benchmarks/src/zbugs.bench.ts @@ -30,7 +30,12 @@ if (!dbPath) { // Get table specs using computeZqlSpecs const tableSpecs = new Map(); - computeZqlSpecs(createSilentLogContext(), db, tableSpecs); + computeZqlSpecs( + createSilentLogContext(), + db, + {includeBackfillingColumns: false}, + tableSpecs, + ); // Create SQLite cost model // const costModel = createSQLiteCostModel(db, tableSpecs); diff --git a/packages/zql-integration-tests/src/chinook/planner.pg.test.ts b/packages/zql-integration-tests/src/chinook/planner.pg.test.ts index 88392a1718..58fd3c4a54 100644 --- a/packages/zql-integration-tests/src/chinook/planner.pg.test.ts +++ b/packages/zql-integration-tests/src/chinook/planner.pg.test.ts @@ -28,7 +28,12 @@ describe('Chinook planner tests', () => { // Get table specs using computeZqlSpecs const tableSpecs = new Map(); - computeZqlSpecs(createSilentLogContext(), dbs.sqlite, tableSpecs); + computeZqlSpecs( + createSilentLogContext(), + dbs.sqlite, + {includeBackfillingColumns: false}, + tableSpecs, + ); costModel = createSQLiteCostModel(dbs.sqlite, tableSpecs); diff --git a/packages/zql-integration-tests/src/helpers/planner-exec.ts b/packages/zql-integration-tests/src/helpers/planner-exec.ts index 25e356b6b0..a3f20e82a0 100644 --- a/packages/zql-integration-tests/src/helpers/planner-exec.ts +++ b/packages/zql-integration-tests/src/helpers/planner-exec.ts @@ -1,4 +1,5 @@ // oxlint-disable no-console +import {testLogConfig} from '../../../otel/src/test-log-config.ts'; import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; import {computeZqlSpecs} from '../../../zero-cache/src/db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../../../zero-cache/src/db/specs.ts'; @@ -24,7 +25,6 @@ import { import {AccumulatorDebugger} from '../../../zql/src/planner/planner-debug.ts'; import {completeOrdering} from '../../../zql/src/query/complete-ordering.ts'; import {asQueryInternals} from '../../../zql/src/query/query-internals.ts'; -import {testLogConfig} from '../../../otel/src/test-log-config.ts'; import {Database} from '../../../zqlite/src/db.ts'; import {createSQLiteCostModel} from '../../../zqlite/src/sqlite-cost-model.ts'; import {newQueryDelegate} from '../../../zqlite/src/test/source-factory.ts'; @@ -455,7 +455,12 @@ export async function createPlannerInfrastructure(config: { // Get table specs using computeZqlSpecs tableSpecs = new Map(); - computeZqlSpecs(createSilentLogContext(), dbs.sqlite, tableSpecs); + computeZqlSpecs( + createSilentLogContext(), + dbs.sqlite, + {includeBackfillingColumns: false}, + tableSpecs, + ); costModel = createSQLiteCostModel(dbs.sqlite, tableSpecs); } @@ -475,7 +480,12 @@ export async function createPlannerInfrastructure(config: { // Get table specs with indexed statistics indexedTableSpecs = new Map(); - computeZqlSpecs(createSilentLogContext(), indexedDb, indexedTableSpecs); + computeZqlSpecs( + createSilentLogContext(), + indexedDb, + {includeBackfillingColumns: false}, + indexedTableSpecs, + ); indexedCostModel = createSQLiteCostModel(indexedDb, indexedTableSpecs); } diff --git a/packages/zqlite/src/sqlite-cost-model.test.ts b/packages/zqlite/src/sqlite-cost-model.test.ts index 67ba8ee01e..571fcad883 100644 --- a/packages/zqlite/src/sqlite-cost-model.test.ts +++ b/packages/zqlite/src/sqlite-cost-model.test.ts @@ -1,9 +1,9 @@ import {beforeEach, describe, expect, test} from 'vitest'; import {createSilentLogContext} from '../../shared/src/logging-test-utils.ts'; -import {Database} from './db.ts'; -import {btreeCost, createSQLiteCostModel} from './sqlite-cost-model.ts'; import {computeZqlSpecs} from '../../zero-cache/src/db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../../zero-cache/src/db/specs.ts'; +import {Database} from './db.ts'; +import {btreeCost, createSQLiteCostModel} from './sqlite-cost-model.ts'; describe('SQLite cost model', () => { let db: Database; @@ -32,7 +32,7 @@ describe('SQLite cost model', () => { // Get table specs using computeZqlSpecs const tableSpecs = new Map(); - computeZqlSpecs(lc, db, tableSpecs); + computeZqlSpecs(lc, db, {includeBackfillingColumns: false}, tableSpecs); // Create the cost model costModel = createSQLiteCostModel(db, tableSpecs); @@ -261,7 +261,7 @@ describe('SQLite cost model with skewed data (STAT4 verification)', () => { // Get table specs const tableSpecs = new Map(); - computeZqlSpecs(lc, db, tableSpecs); + computeZqlSpecs(lc, db, {includeBackfillingColumns: false}, tableSpecs); // Create the cost model costModel = createSQLiteCostModel(db, tableSpecs); From 68d0dde9554dd7e92eca12d5202eb798377d46cb Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 2 Feb 2026 19:08:15 -0800 Subject: [PATCH 009/495] feat(zero-cache): surface the replication LSN at /statz?replication (#5507) Surface the LSN up to which the zero-cache has replicated * in a human-readable form at `/statz` * and a machine-readable JSON form at `/statz?replication` This will allow automated systems like DB migrations to implement flow control by checking the progress of end-to-end zero replication and adjusting write rates accordingly. Screenshot 2026-02-02 at 18 51 04 --- packages/zero-cache/src/services/statz.ts | 34 +++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/zero-cache/src/services/statz.ts b/packages/zero-cache/src/services/statz.ts index b0f3038d60..bd80efad51 100644 --- a/packages/zero-cache/src/services/statz.ts +++ b/packages/zero-cache/src/services/statz.ts @@ -8,8 +8,11 @@ import {BigIntJSON} from '../../../shared/src/bigint-json.ts'; import {Database} from '../../../zqlite/src/db.ts'; import type {NormalizedZeroConfig as ZeroConfig} from '../config/normalize.ts'; import {isAdminPasswordValid} from '../config/zero-config.ts'; +import {StatementRunner} from '../db/statements.ts'; import {pgClient} from '../types/pg.ts'; import {getShardID, upstreamSchema} from '../types/shards.ts'; +import {fromLexiVersion} from './change-source/pg/lsn.ts'; +import {getReplicationState} from './replicator/schema/replication-state.ts'; async function upstreamStats( lc: LogContext, @@ -251,6 +254,19 @@ function replicaStats(lc: LogContext, config: ZeroConfig, out: Writable) { ] as const, out, ); + + try { + out.write('\n'); + printStats('replication', getReplicationStats(db), out); + } catch (e) { + lc.error?.(`unable to get replication state`, e); + } +} + +function getReplicationStats(db: Database) { + const {stateVersion} = getReplicationState(new StatementRunner(db)); + const lsn = fromLexiVersion(stateVersion); + return {lsn}; } function osStats(out: Writable) { @@ -292,12 +308,17 @@ async function printPgStats( function printStats( group: string, - queries: readonly [name: string, result: unknown][], + queriesOrObject: + | readonly [name: string, result: unknown][] + | Record, out: Writable, ) { + const queries = Array.isArray(queriesOrObject) + ? queriesOrObject + : Object.entries(queriesOrObject); out.write('\n' + header(group)); for (const [name, result] of queries) { - out.write('\n' + name + BigIntJSON.stringify(result, null, 2)); + out.write('\n' + name + ' ' + BigIntJSON.stringify(result, null, 2)); } } @@ -316,6 +337,15 @@ export async function handleStatzRequest( return; } + const query = req.query as Record; + if (query.replication !== undefined) { + const stats = getReplicationStats(new Database(lc, config.replica.file)); + await res + .header('Content-Type', 'application/json') + .send(JSON.stringify(stats)); + return; + } + await upstreamStats(lc, config, res.raw); res.raw.write('\n\n'); await cvrStats(lc, config, res.raw); From 260cc888728347ca661d778d0fbab460d264a59f Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 3 Feb 2026 07:40:34 -0800 Subject: [PATCH 010/495] feat(zero-cache): generalize all statz output to be machine-readable (#5508) Generalize https://github.com/rocicorp/mono/pull/5507 so that all statz "groups" can be returned as machine-friendly JSON. * Status quo, all groups in human readable format `/statz` * JSON format `/statz?format=json` ```json {"upstream":{"numReplicas":[{"c":1}],"numClientsWithMutations":[{"c":0}],"numMutationsProcessed":[{"c":null}]},"cvr":{"totalNumQueries":[{"c":0}],"numUniqueQueryHashes":[{"c":0}],"numActiveQueries":[{"c":0}],"numInactiveQueries":[{"c":0}],"numDeletedQueries":[{"c":0}],"freshQueriesPercentiles":[{"p50":null,"p75":null,"p90":null,"p95":null,"p99":null,"min":null,"max":null,"avg":null}],"rowsPerClientGroupPercentiles":[{"p50":null,"p75":null,"p90":null,"p95":null,"p99":null,"min":null,"max":null,"avg":null}],"astSizes":[{"25th_percentile":null,"50th_percentile":null,"75th_percentile":null,"90th_percentile":null,"95th_percentile":null,"99th_percentile":null,"minimum_length":null,"maximum_length":null,"average_length":null,"total_records":0}],"biggestAstHash":[],"totalActiveQueriesPerClientAndClientGroup":[],"totalInactiveQueriesPerClientAndClientGroup":[],"totalRowsPerClientGroup":[],"numRowsPerQuery":[]},"changeLog":{"changeLogSize":[{"change_log_size":0}]},"replica":{"wal checkpoint":0,"page count":332823,"page size":4096,"journal mode":"wal2","synchronous":1,"cache size":-16000,"auto vacuum":0,"freelist count":0,"wal autocheckpoint":1000,"db file stats":{"dev":16777232,"mode":33188,"nlink":1,"uid":501,"gid":0,"rdev":0,"blksize":4096,"ino":152627276,"size":1363243008,"blocks":2688744,"atimeMs":1770101330562.595,"mtimeMs":1770101330562.5144,"ctimeMs":1770101330562.5144,"birthtimeMs":1770084843134.9343}},"replication":{"lsn":"0/9EE4BC68"},"os":{"load avg":[2.92041015625,2.42578125,2.384765625],"uptime":18946,"total mem":68719476736,"free mem":1747533824,"cpus":16,"available parallelism":16,"platform":"darwin","arch":"arm64","release":"24.6.0"}} ``` * Stats for specific groups only `/statz?format=json&group=replication&group=upstream` ```json {"replication":{"lsn":"0/9EE4BC68"},"upstream":{"numReplicas":[{"c":1}],"numClientsWithMutations":[{"c":0}],"numMutationsProcessed":[{"c":null}]}} ``` * Indented JSON `/statz?format=json&group=replication&group=upstream&pretty` ```json { "replication": { "lsn": "0/9EE4BC68" }, "upstream": { "numReplicas": [ { "c": 1 } ], "numClientsWithMutations": [ { "c": 0 } ], "numMutationsProcessed": [ { "c": null } ] } } ` --- packages/zero-cache/src/services/statz.ts | 249 +++++++++++----------- 1 file changed, 121 insertions(+), 128 deletions(-) diff --git a/packages/zero-cache/src/services/statz.ts b/packages/zero-cache/src/services/statz.ts index bd80efad51..5934d27f12 100644 --- a/packages/zero-cache/src/services/statz.ts +++ b/packages/zero-cache/src/services/statz.ts @@ -14,40 +14,30 @@ import {getShardID, upstreamSchema} from '../types/shards.ts'; import {fromLexiVersion} from './change-source/pg/lsn.ts'; import {getReplicationState} from './replicator/schema/replication-state.ts'; -async function upstreamStats( - lc: LogContext, - config: ZeroConfig, - out: Writable, -) { +async function upstreamStats(lc: LogContext, config: ZeroConfig) { const schema = upstreamSchema(getShardID(config)); const sql = pgClient(lc, config.upstream.db); - - out.write(header('Upstream')); - - await printPgStats( - [ + try { + return await getPgStats([ [ - 'num replicas', + 'numReplicas', sql`SELECT COUNT(*) as "c" FROM ${sql(schema)}."replicas"`, ], [ - 'num clients with mutations', + 'numClientsWithMutations', sql`SELECT COUNT(*) as "c" FROM ${sql(schema)}."clients"`, ], [ - 'num mutations processed', + 'numMutationsProcessed', sql`SELECT SUM("lastMutationID") as "c" FROM ${sql(schema)}."clients"`, ], - ], - out, - ); - - await sql.end(); + ]); + } finally { + await sql.end(); + } } -async function cvrStats(lc: LogContext, config: ZeroConfig, out: Writable) { - out.write(header('CVR')); - +async function cvrStats(lc: LogContext, config: ZeroConfig) { const schema = upstreamSchema(getShardID(config)) + '/cvr'; const sql = pgClient(lc, config.cvr.db); @@ -85,32 +75,32 @@ async function cvrStats(lc: LogContext, config: ZeroConfig, out: Writable) { ORDER BY g.num_queries DESC;`; } - await printPgStats( - [ + try { + return await getPgStats([ [ - 'total num queries', + 'totalNumQueries', sql`SELECT COUNT(*) as "c" FROM ${sql(schema)}."desires"`, ], [ - 'num unique query hashes', + 'numUniqueQueryHashes', sql`SELECT COUNT(DISTINCT "queryHash") as "c" FROM ${sql( schema, )}."desires"`, ], [ - 'num active queries', + 'numActiveQueries', sql`SELECT COUNT(*) as "c" FROM ${sql(schema)}."desires" WHERE "inactivatedAt" IS NULL AND "deleted" = false`, ], [ - 'num inactive queries', + 'numInactiveQueries', sql`SELECT COUNT(*) as "c" FROM ${sql(schema)}."desires" WHERE "inactivatedAt" IS NOT NULL AND ("inactivatedAt" + "ttl") > NOW()`, ], [ - 'num deleted queries', + 'numDeletedQueries', sql`SELECT COUNT(*) as "c" FROM ${sql(schema)}."desires" WHERE "deleted" = true`, ], [ - 'fresh queries percentiles', + 'freshQueriesPercentiles', sql`WITH client_group_counts AS ( -- Count inactive desires per clientGroupID SELECT @@ -136,7 +126,7 @@ async function cvrStats(lc: LogContext, config: ZeroConfig, out: Writable) { FROM client_group_counts;`, ], [ - 'rows per client group percentiles', + 'rowsPerClientGroupPercentiles', sql`WITH client_group_counts AS ( -- Count inactive desires per clientGroupID SELECT @@ -158,7 +148,7 @@ async function cvrStats(lc: LogContext, config: ZeroConfig, out: Writable) { ], [ // check for AST blowup due to DNF conversion. - 'ast sizes', + 'astSizes', sql`SELECT percentile_cont(0.25) WITHIN GROUP (ORDER BY length("clientAST"::text)) AS "25th_percentile", percentile_cont(0.5) WITHIN GROUP (ORDER BY length("clientAST"::text)) AS "50th_percentile", @@ -174,28 +164,28 @@ async function cvrStats(lc: LogContext, config: ZeroConfig, out: Writable) { ], [ // output the hash of the largest AST - 'biggest ast hash', + 'biggestAstHash', sql`SELECT "queryHash", length("clientAST"::text) AS "ast_length" FROM ${sql(schema)}."queries" ORDER BY length("clientAST"::text) DESC LIMIT 1;`, ], [ - 'total active queries per client and client group', + 'totalActiveQueriesPerClientAndClientGroup', numQueriesPerClientGroup(true), ], [ - 'total inactive queries per client and client group', + 'totalInactiveQueriesPerClientAndClientGroup', numQueriesPerClientGroup(false), ], [ - 'total rows per client group', + 'totalRowsPerClientGroup', sql`SELECT "clientGroupID", COUNT(*) as "c" FROM ${sql( schema, )}."rows" GROUP BY "clientGroupID" ORDER BY "c" DESC`, ], [ - 'num rows per query', + 'numRowsPerQuery', sql`SELECT k.key AS "queryHash", COUNT(*) AS row_count @@ -207,60 +197,47 @@ async function cvrStats(lc: LogContext, config: ZeroConfig, out: Writable) { ] satisfies [ name: string, query: ReturnType>, - ][], - out, - ); - - await sql.end(); + ][]); + } finally { + await sql.end(); + } } -async function changelogStats( - lc: LogContext, - config: ZeroConfig, - out: Writable, -) { - out.write(header('Change DB')); +async function changeLogStats(lc: LogContext, config: ZeroConfig) { const schema = upstreamSchema(getShardID(config)) + '/cdc'; const sql = pgClient(lc, config.change.db); - await printPgStats( - [ + try { + return await getPgStats([ [ - 'change log size', + 'changeLogSize', sql`SELECT COUNT(*) as "change_log_size" FROM ${sql(schema)}."changeLog"`, ], - ], - out, - ); - await sql.end(); + ]); + } finally { + await sql.end(); + } } -function replicaStats(lc: LogContext, config: ZeroConfig, out: Writable) { - out.write(header('Replica')); +function replicaStats(lc: LogContext, config: ZeroConfig) { const db = new Database(lc, config.replica.file); - printStats( - 'replica', - [ - ['wal checkpoint', pick(first(db.pragma('WAL_CHECKPOINT')))], - ['page count', pick(first(db.pragma('PAGE_COUNT')))], - ['page size', pick(first(db.pragma('PAGE_SIZE')))], - ['journal mode', pick(first(db.pragma('JOURNAL_MODE')))], - ['synchronous', pick(first(db.pragma('SYNCHRONOUS')))], - ['cache size', pick(first(db.pragma('CACHE_SIZE')))], - ['auto vacuum', pick(first(db.pragma('AUTO_VACUUM')))], - ['freelist count', pick(first(db.pragma('FREELIST_COUNT')))], - ['wal autocheckpoint', pick(first(db.pragma('WAL_AUTOCHECKPOINT')))], - ['db file stats', fs.statSync(config.replica.file)], - ] as const, - out, - ); + return Object.fromEntries([ + ['wal checkpoint', pick(first(db.pragma('WAL_CHECKPOINT')))], + ['page count', pick(first(db.pragma('PAGE_COUNT')))], + ['page size', pick(first(db.pragma('PAGE_SIZE')))], + ['journal mode', pick(first(db.pragma('JOURNAL_MODE')))], + ['synchronous', pick(first(db.pragma('SYNCHRONOUS')))], + ['cache size', pick(first(db.pragma('CACHE_SIZE')))], + ['auto vacuum', pick(first(db.pragma('AUTO_VACUUM')))], + ['freelist count', pick(first(db.pragma('FREELIST_COUNT')))], + ['wal autocheckpoint', pick(first(db.pragma('WAL_AUTOCHECKPOINT')))], + ['db file stats', fs.statSync(config.replica.file)], + ] as const); +} - try { - out.write('\n'); - printStats('replication', getReplicationStats(db), out); - } catch (e) { - lc.error?.(`unable to get replication state`, e); - } +function replicationStats(lc: LogContext, config: ZeroConfig) { + const db = new Database(lc, config.replica.file); + return getReplicationStats(db); } function getReplicationStats(db: Database) { @@ -269,59 +246,50 @@ function getReplicationStats(db: Database) { return {lsn}; } -function osStats(out: Writable) { - printStats( - 'os', - [ - ['load avg', os.loadavg()], - ['uptime', os.uptime()], - ['total mem', os.totalmem()], - ['free mem', os.freemem()], - ['cpus', os.cpus().length], - ['available parallelism', os.availableParallelism()], - ['platform', os.platform()], - ['arch', os.arch()], - ['release', os.release()], - ['uptime', os.uptime()], - ] as const, - out, - ); +function osStats() { + return Object.fromEntries([ + ['load avg', os.loadavg()], + ['uptime', os.uptime()], + ['total mem', os.totalmem()], + ['free mem', os.freemem()], + ['cpus', os.cpus().length], + ['available parallelism', os.availableParallelism()], + ['platform', os.platform()], + ['arch', os.arch()], + ['release', os.release()], + ['uptime', os.uptime()], + ] as const); } -async function printPgStats( +async function getPgStats( pendingQueries: [ name: string, query: ReturnType>, ][], - out: Writable, ) { const results = await Promise.all( - pendingQueries.map(async ([name, query]) => [name, await query]), + pendingQueries.map(async ([name, query]) => [name, await query] as const), ); - for (const [name, data] of results) { - out.write('\n'); - out.write(name); - out.write('\n'); - out.write(BigIntJSON.stringify(data, null, 2)); - } + return Object.fromEntries(results); } -function printStats( - group: string, - queriesOrObject: - | readonly [name: string, result: unknown][] - | Record, - out: Writable, -) { - const queries = Array.isArray(queriesOrObject) - ? queriesOrObject - : Object.entries(queriesOrObject); +type StatsObject = Record; + +function printStats(group: string, statsObject: StatsObject, out: Writable) { + const queries = Object.entries(statsObject); out.write('\n' + header(group)); for (const [name, result] of queries) { - out.write('\n' + name + ' ' + BigIntJSON.stringify(result, null, 2)); + out.write('\n' + name + ': ' + BigIntJSON.stringify(result, null, 2)); } + out.write('\n'); } +/** + * HTTP query parameters: + * * `group`: restricts the groups for which stats are computed + * * `format=json`: returns the stats as a JSON object + * * `pretty`: formats the JSON object with indentation + */ export async function handleStatzRequest( lc: LogContext, config: ZeroConfig, @@ -337,24 +305,49 @@ export async function handleStatzRequest( return; } + const statsFns: Record Promise | StatsObject> = { + upstream: () => upstreamStats(lc, config), + cvr: () => cvrStats(lc, config), + changeLog: () => changeLogStats(lc, config), + replica: () => replicaStats(lc, config), + replication: () => replicationStats(lc, config), + os: () => osStats(), + }; + + async function computeStats(group: string): Promise<[string, StatsObject]> { + try { + return [group, await statsFns[group]()]; + } catch (e) { + lc.error?.(`error computing ${group} stats`, e); + return [group, {error: String(e)}]; + } + } + const query = req.query as Record; - if (query.replication !== undefined) { - const stats = getReplicationStats(new Database(lc, config.replica.file)); + const groups = + typeof query.group === 'string' + ? query.group.split(',') + : Array.isArray(query.group) + ? query.group + : undefined; + + const stats = await Promise.all( + groups + ? groups.filter(g => g in statsFns).map(computeStats) + : Object.keys(statsFns).map(computeStats), + ); + + if (query.format === 'json') { + const indent = query.pretty !== undefined ? 2 : undefined; await res .header('Content-Type', 'application/json') - .send(JSON.stringify(stats)); - return; + .send(BigIntJSON.stringify(Object.fromEntries(stats), null, indent)); + } else { + for (const [group, statsObject] of stats) { + printStats(group, statsObject, res.raw); + } } - await upstreamStats(lc, config, res.raw); - res.raw.write('\n\n'); - await cvrStats(lc, config, res.raw); - res.raw.write('\n\n'); - await changelogStats(lc, config, res.raw); - res.raw.write('\n\n'); - replicaStats(lc, config, res.raw); - res.raw.write('\n\n'); - osStats(res.raw); res.raw.end(); } From 6d75f9edbfba9c0eaa50c93d485ea2c6e406b5e6 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Tue, 3 Feb 2026 11:26:31 -0500 Subject: [PATCH 011/495] chore(zbugs): record progress of seeding so we can resume on failure (#5491) Written by Claude, review by me. Basic idea is to allow us to resume seeding a database if we fail in the middle of seeding. Useful for seeding a TB of data. Record progress of seeding so we can resume on failure --- apps/zbugs/package.json | 2 +- apps/zbugs/scripts/generate-synthetic.ts | 8 +- apps/zbugs/scripts/seed.ts | 393 ++++++++++++++++------- 3 files changed, 289 insertions(+), 114 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index ee4bacf99a..6b5c37d557 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -14,7 +14,7 @@ "db-migrate": "drizzle-kit migrate", "db-seed": "tsx scripts/seed.ts", "generate-templates": "tsx scripts/generate-templates.ts", - "generate-synthetic": "tsx scripts/generate-synthetic.ts", + "generate-synthetic": "NODE_OPTIONS='--max-old-space-size=8192' tsx scripts/generate-synthetic.ts", "db-seed-synthetic": "ZERO_SEED_DATA_DIR=db/seed-data/synthetic tsx scripts/seed.ts", "clean": "cd docker && docker compose down && docker volume rm docker_zbugs_pgdata_sync && docker volume rm docker_zbugs_pgdata_upstream && rm -rf /tmp/zbugs-sync-replica.db*", "format": "prettier --write .", diff --git a/apps/zbugs/scripts/generate-synthetic.ts b/apps/zbugs/scripts/generate-synthetic.ts index 50d501de81..834cb159f6 100644 --- a/apps/zbugs/scripts/generate-synthetic.ts +++ b/apps/zbugs/scripts/generate-synthetic.ts @@ -85,8 +85,8 @@ function assignWithPareto( numItems: number, numBuckets: number, alpha = 2, -): number[] { - const result = new Array(numItems); +): Uint32Array { + const result = new Uint32Array(numItems); for (let i = 0; i < numItems; i++) { result[i] = Math.floor(Math.pow(rng(), alpha) * numBuckets); } @@ -101,8 +101,8 @@ function distributeWithPareto( numBuckets: number, totalItems: number, alpha = 2, -): number[] { - const result = new Array(numBuckets).fill(0); +): Uint32Array { + const result = new Uint32Array(numBuckets); for (let i = 0; i < totalItems; i++) { const idx = Math.floor(Math.pow(rng(), alpha) * numBuckets); result[idx]++; diff --git a/apps/zbugs/scripts/seed.ts b/apps/zbugs/scripts/seed.ts index 03318903ba..c9dce481f6 100644 --- a/apps/zbugs/scripts/seed.ts +++ b/apps/zbugs/scripts/seed.ts @@ -22,8 +22,10 @@ const TABLE_CSV_FILE_REGEX = `^(${TABLES_IN_SEED_ORDER.join('|')})(_.*)?.csv$`; // Types for dynamically discovered schema objects interface IndexInfo { + tableName: string; indexName: string; indexDdl: string; + constraintName: string | null; } interface ForeignKeyInfo { @@ -37,6 +39,62 @@ interface TriggerInfo { triggerName: string; } +// --- Progress tracking helpers --- + +async function ensureProgressTable(sql: postgres.Sql): Promise { + await sql` + CREATE TABLE IF NOT EXISTS _seed_progress ( + key TEXT PRIMARY KEY, + value TEXT, + created_at TIMESTAMPTZ DEFAULT now() + ) + `; +} + +async function hasProgress(sql: postgres.Sql, key: string): Promise { + const rows = await sql` + SELECT 1 FROM _seed_progress WHERE key = ${key} + `; + return rows.length > 0; +} + +async function getProgress( + sql: postgres.Sql, + key: string, +): Promise { + const rows = await sql<{value: string}[]>` + SELECT value FROM _seed_progress WHERE key = ${key} + `; + return rows.length > 0 ? rows[0].value : undefined; +} + +async function setProgress( + sql: postgres.Sql, + key: string, + value: string, +): Promise { + await sql` + INSERT INTO _seed_progress (key, value) + VALUES (${key}, ${value}) + ON CONFLICT (key) DO UPDATE SET value = ${value} + `; +} + +async function clearProgress(sql: postgres.Sql): Promise { + await sql`DELETE FROM _seed_progress`; +} + +async function dropProgressTable(sql: postgres.Sql): Promise { + await sql`DROP TABLE IF EXISTS _seed_progress`; +} + +async function hasAnyProgress(sql: postgres.Sql): Promise { + const rows = await sql`SELECT 1 FROM _seed_progress LIMIT 1`; + return rows.length > 0; +} + +// --- Schema discovery --- + /** * Discover all non-primary-key indexes for the given tables. */ @@ -46,23 +104,34 @@ async function discoverIndexes( ): Promise { const results: IndexInfo[] = []; for (const table of tables) { - const rows = await sql<{indexname: string; index_ddl: string}[]>` + const rows = await sql< + { + indexname: string; + index_ddl: string; + constraint_name: string | null; + }[] + >` SELECT pg_indexes.indexname, - pg_get_indexdef(pg_class.oid) as index_ddl + pg_get_indexdef(pg_class.oid) as index_ddl, + pg_constraint.conname as constraint_name FROM pg_indexes JOIN pg_namespace ON pg_indexes.schemaname = pg_namespace.nspname JOIN pg_class ON pg_class.relname = pg_indexes.indexname AND pg_class.relnamespace = pg_namespace.oid JOIN pg_index ON pg_index.indexrelid = pg_class.oid + LEFT JOIN pg_constraint ON pg_constraint.conindid = pg_class.oid + AND pg_constraint.contype IN ('u', 'p') WHERE pg_indexes.tablename = ${table} AND pg_indexes.schemaname = 'public' AND pg_index.indisprimary = FALSE `; for (const row of rows) { results.push({ + tableName: table, indexName: row.indexname, indexDdl: row.index_ddl, + constraintName: row.constraint_name, }); } } @@ -125,16 +194,20 @@ async function discoverTriggers( return results; } +function parseBoolEnv(value: string | undefined): boolean { + return ( + value !== undefined && + ['t', 'true', '1', ''].indexOf(value.toLocaleLowerCase().trim()) !== -1 + ); +} + async function seed() { const dataDir = process.env.ZERO_SEED_DATA_DIR ?? join(__dirname, '../db/seed-data/github/'); - const forceSeed = - process.env.ZERO_SEED_FORCE !== undefined && - ['t', 'true', '1', ''].indexOf( - process.env.ZERO_SEED_FORCE.toLocaleLowerCase().trim(), - ) !== -1; + const forceSeed = parseBoolEnv(process.env.ZERO_SEED_FORCE); + const resetSeed = parseBoolEnv(process.env.ZERO_SEED_RESET); const appendMode = process.env.ZERO_SEED_APPEND !== undefined && @@ -167,24 +240,76 @@ async function seed() { process.exit(0); } - // Check if already seeded (skip in append mode) - if (!forceSeed && !appendMode) { + // Ensure progress table exists + await ensureProgressTable(sql); + + // Handle ZERO_SEED_RESET: clear progress and start fresh + if (resetSeed) { + // oxlint-disable-next-line no-console + console.log('Reset mode: clearing progress and starting fresh...'); + await clearProgress(sql); + } + + // Detect mode: resume vs fresh + const resuming = await hasAnyProgress(sql); + if (resuming) { + // oxlint-disable-next-line no-console + console.log('Resuming previous seed run...'); + } + + // Check if already seeded (only for fresh, non-force, non-append runs) + if (!resuming && !forceSeed && !appendMode) { const result = await sql`select 1 from "user" limit 1`; if (result.length === 1) { // oxlint-disable-next-line no-console console.log('Database already seeded.'); + await dropProgressTable(sql); process.exit(0); } } - // If forcing (not appending), truncate existing data - if (forceSeed && !appendMode) { - // oxlint-disable-next-line no-console - console.log('Force mode: truncating existing data...'); - // Truncate in reverse order to respect foreign key dependencies - for (const tableName of [...TABLES_IN_SEED_ORDER].reverse()) { - await sql`TRUNCATE ${sql(tableName)} CASCADE`; + // --- FRESH: truncate and discover schema --- + if (!resuming) { + // If forcing (not appending), truncate existing data + if (forceSeed && !appendMode) { + // oxlint-disable-next-line no-console + console.log('Force mode: truncating existing data...'); + for (const tableName of [...TABLES_IN_SEED_ORDER].reverse()) { + const exists = await sql` + SELECT 1 FROM pg_tables + WHERE schemaname = 'public' AND tablename = ${tableName} + `; + if (exists.length > 0) { + await sql`TRUNCATE ${sql(tableName)} CASCADE`; + } + } } + await setProgress(sql, 'phase:truncated', 'done'); + + // Discover all tables in public schema for comprehensive discovery + const allTablesResult = await sql<{tablename: string}[]>` + SELECT tablename FROM pg_tables WHERE schemaname = 'public' + `; + const allTables = allTablesResult + .map(r => r.tablename) + .filter(t => t !== '_seed_progress'); + + // Discover schema objects and persist to progress table + // oxlint-disable-next-line no-console + console.log('Discovering schema objects...'); + const [indexes, foreignKeys, triggers] = await Promise.all([ + discoverIndexes(sql, allTables), + discoverForeignKeys(sql), + discoverTriggers(sql, allTables), + ]); + // oxlint-disable-next-line no-console + console.log( + ` Found ${indexes.length} indexes, ${foreignKeys.length} FKs, ${triggers.length} triggers`, + ); + + await setProgress(sql, 'schema:indexes', JSON.stringify(indexes)); + await setProgress(sql, 'schema:foreignKeys', JSON.stringify(foreignKeys)); + await setProgress(sql, 'schema:triggers', JSON.stringify(triggers)); } if (appendMode) { @@ -192,71 +317,84 @@ async function seed() { console.log('Append mode: adding data to existing tables...'); } - // Discover all tables in public schema for comprehensive discovery - const allTablesResult = await sql<{tablename: string}[]>` - SELECT tablename FROM pg_tables WHERE schemaname = 'public' - `; - const allTables = allTablesResult.map(r => r.tablename); - - // Discover schema objects - // oxlint-disable-next-line no-console - console.log('Discovering schema objects...'); - const [indexes, foreignKeys, triggers] = await Promise.all([ - discoverIndexes(sql, allTables), - discoverForeignKeys(sql), - discoverTriggers(sql, allTables), - ]); - // oxlint-disable-next-line no-console - console.log( - ` Found ${indexes.length} indexes, ${foreignKeys.length} FKs, ${triggers.length} triggers`, + // --- Load schema objects (from progress table for both fresh and resume) --- + const indexes: IndexInfo[] = JSON.parse( + (await getProgress(sql, 'schema:indexes')) ?? '[]', + ); + const foreignKeys: ForeignKeyInfo[] = JSON.parse( + (await getProgress(sql, 'schema:foreignKeys')) ?? '[]', + ); + const triggers: TriggerInfo[] = JSON.parse( + (await getProgress(sql, 'schema:triggers')) ?? '[]', ); - // Set memory parameters for faster index rebuilds - // oxlint-disable-next-line no-console - console.log('Setting memory parameters...'); - await sql`SET maintenance_work_mem = '2GB'`; - await sql`SET work_mem = '256MB'`; + if (resuming) { + // oxlint-disable-next-line no-console + console.log( + ` Loaded ${indexes.length} indexes, ${foreignKeys.length} FKs, ${triggers.length} triggers from progress`, + ); + } - // Disable all triggers - // oxlint-disable-next-line no-console - console.log('Disabling triggers...'); - for (const {tableName, triggerName} of triggers) { - try { - await sql`ALTER TABLE ${sql(tableName)} DISABLE TRIGGER ${sql.unsafe('"' + triggerName + '"')}`; - } catch (e) { - // oxlint-disable-next-line no-console - console.log( - ` Warning: could not disable trigger ${triggerName} on ${tableName}: ${e}`, - ); + // --- Drop schema objects (skip if already done) --- + if (!(await hasProgress(sql, 'phase:schema_dropped'))) { + // Disable all triggers + // oxlint-disable-next-line no-console + console.log('Disabling triggers...'); + for (const {tableName, triggerName} of triggers) { + try { + await sql`ALTER TABLE ${sql(tableName)} DISABLE TRIGGER ${sql.unsafe('"' + triggerName + '"')}`; + } catch (e) { + // oxlint-disable-next-line no-console + console.log( + ` Warning: could not disable trigger ${triggerName} on ${tableName}: ${e}`, + ); + } } - } - // Drop foreign key constraints - // oxlint-disable-next-line no-console - console.log('Dropping foreign key constraints...'); - for (const {tableName, constraintName} of foreignKeys) { - try { - await sql.unsafe( - `ALTER TABLE "${tableName}" DROP CONSTRAINT IF EXISTS "${constraintName}"`, - ); - } catch (e) { - // oxlint-disable-next-line no-console - console.log(` Warning: could not drop FK ${constraintName}: ${e}`); + // Drop foreign key constraints + // oxlint-disable-next-line no-console + console.log('Dropping foreign key constraints...'); + for (const {tableName, constraintName} of foreignKeys) { + try { + await sql.unsafe( + `ALTER TABLE "${tableName}" DROP CONSTRAINT IF EXISTS "${constraintName}"`, + ); + } catch (e) { + // oxlint-disable-next-line no-console + console.log(` Warning: could not drop FK ${constraintName}: ${e}`); + } } - } - // Drop non-PK indexes - // oxlint-disable-next-line no-console - console.log('Dropping indexes...'); - for (const {indexName} of indexes) { - try { - await sql.unsafe(`DROP INDEX IF EXISTS "${indexName}"`); - } catch (e) { - // oxlint-disable-next-line no-console - console.log(` Warning: could not drop index ${indexName}: ${e}`); + // Drop non-PK indexes (constraint-backed indexes must be dropped via ALTER TABLE) + // oxlint-disable-next-line no-console + console.log('Dropping indexes...'); + for (const {tableName, indexName, constraintName} of indexes) { + try { + if (constraintName) { + await sql.unsafe( + `ALTER TABLE "${tableName}" DROP CONSTRAINT IF EXISTS "${constraintName}"`, + ); + } else { + await sql.unsafe(`DROP INDEX IF EXISTS "${indexName}"`); + } + } catch (e) { + // oxlint-disable-next-line no-console + console.log(` Warning: could not drop index ${indexName}: ${e}`); + } } + + await setProgress(sql, 'phase:schema_dropped', 'done'); + } else { + // oxlint-disable-next-line no-console + console.log('Schema already dropped, skipping...'); } + // Set memory parameters for faster index rebuilds (session-level, always set) + // oxlint-disable-next-line no-console + console.log('Setting memory parameters...'); + await sql`SET maintenance_work_mem = '2GB'`; + await sql`SET work_mem = '256MB'`; + // COPY data (no transaction - each file is its own implicit transaction) // oxlint-disable-next-line no-console console.log('Loading data via COPY...'); @@ -271,6 +409,14 @@ async function seed() { let tableRowCount = 0; for (const file of tableFiles) { + const progressKey = `file:${file}`; + if (await hasProgress(sql, progressKey)) { + // oxlint-disable-next-line no-console + console.log(` Skipping ${file} (already loaded)`); + tableRowCount++; + continue; + } + const filePath = join(dataDir, file); const headerLine = await readFirstLine(filePath); @@ -289,6 +435,7 @@ async function seed() { const query = await sql`COPY ${sql(tableName)} (${sql(columns)}) FROM STDIN DELIMITER ',' CSV HEADER`.writable(); await pipeline(fileStream, query); + await setProgress(sql, progressKey, 'done'); tableRowCount++; } @@ -296,63 +443,91 @@ async function seed() { console.log(` ${tableName}: loaded ${tableRowCount} files`); } - // Recreate indexes - // oxlint-disable-next-line no-console - console.log('Recreating indexes (this may take a while)...'); - for (const {indexName, indexDdl} of indexes) { + // --- Restore schema objects (skip if already done) --- + if (!(await hasProgress(sql, 'phase:schema_restored'))) { + // Recreate indexes (constraint-backed indexes are recreated via ALTER TABLE) // oxlint-disable-next-line no-console - console.log(` Creating index ${indexName}...`); - try { - await sql.unsafe(indexDdl); - } catch (e) { + console.log('Recreating indexes (this may take a while)...'); + for (const {tableName, indexName, indexDdl, constraintName} of indexes) { // oxlint-disable-next-line no-console - console.log(` Warning: could not create index ${indexName}: ${e}`); + console.log(` Creating index ${indexName}...`); + try { + if (constraintName) { + // The DDL from pg_get_indexdef is a CREATE UNIQUE INDEX statement. + // First create the index, then add it as a constraint. + await sql.unsafe(indexDdl); + await sql.unsafe( + `ALTER TABLE "${tableName}" ADD CONSTRAINT "${constraintName}" UNIQUE USING INDEX "${indexName}"`, + ); + } else { + await sql.unsafe(indexDdl); + } + } catch (e) { + // oxlint-disable-next-line no-console + console.log(` Warning: could not create index ${indexName}: ${e}`); + } } - } - // Recreate foreign key constraints - // oxlint-disable-next-line no-console - console.log('Recreating foreign key constraints...'); - for (const {tableName, constraintName, fkDefinition} of foreignKeys) { + // Recreate foreign key constraints // oxlint-disable-next-line no-console - console.log(` Creating FK ${constraintName}...`); - try { - await sql.unsafe( - `ALTER TABLE "${tableName}" ADD CONSTRAINT "${constraintName}" ${fkDefinition}`, - ); - } catch (e) { + console.log('Recreating foreign key constraints...'); + for (const {tableName, constraintName, fkDefinition} of foreignKeys) { // oxlint-disable-next-line no-console - console.log(` Warning: could not create FK ${constraintName}: ${e}`); + console.log(` Creating FK ${constraintName}...`); + try { + await sql.unsafe( + `ALTER TABLE "${tableName}" ADD CONSTRAINT "${constraintName}" ${fkDefinition}`, + ); + } catch (e) { + // oxlint-disable-next-line no-console + console.log(` Warning: could not create FK ${constraintName}: ${e}`); + } } - } - // Re-enable triggers - // oxlint-disable-next-line no-console - console.log('Re-enabling triggers...'); - for (const {tableName, triggerName} of triggers) { - try { - await sql`ALTER TABLE ${sql(tableName)} ENABLE TRIGGER ${sql.unsafe('"' + triggerName + '"')}`; - } catch (e) { - // oxlint-disable-next-line no-console - console.log( - ` Warning: could not enable trigger ${triggerName} on ${tableName}: ${e}`, - ); + // Re-enable triggers + // oxlint-disable-next-line no-console + console.log('Re-enabling triggers...'); + for (const {tableName, triggerName} of triggers) { + try { + await sql`ALTER TABLE ${sql(tableName)} ENABLE TRIGGER ${sql.unsafe('"' + triggerName + '"')}`; + } catch (e) { + // oxlint-disable-next-line no-console + console.log( + ` Warning: could not enable trigger ${triggerName} on ${tableName}: ${e}`, + ); + } } + + await setProgress(sql, 'phase:schema_restored', 'done'); + } else { + // oxlint-disable-next-line no-console + console.log('Schema already restored, skipping...'); } - // Analyze tables for query planner - // oxlint-disable-next-line no-console - console.log('Running ANALYZE...'); - for (const tableName of TABLES_IN_SEED_ORDER) { - await sql`ANALYZE ${sql(tableName)}`; + // Analyze tables for query planner (skip if already done) + if (!(await hasProgress(sql, 'phase:analyzed'))) { + // oxlint-disable-next-line no-console + console.log('Running ANALYZE...'); + for (const tableName of TABLES_IN_SEED_ORDER) { + await sql`ANALYZE ${sql(tableName)}`; + } + await setProgress(sql, 'phase:analyzed', 'done'); + } else { + // oxlint-disable-next-line no-console + console.log('ANALYZE already done, skipping...'); } + // Clean exit: drop progress table + await dropProgressTable(sql); + // oxlint-disable-next-line no-console console.log('Seeding complete.'); process.exit(0); } catch (err) { // oxlint-disable-next-line no-console console.error('Seeding failed:', err); + // oxlint-disable-next-line no-console + console.error('Re-run the script to resume from where it left off.'); process.exit(1); } } From 7f38141a1b298ff3973cfc026a2da95d84f5dcc7 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Tue, 3 Feb 2026 11:25:40 -0500 Subject: [PATCH 012/495] fix(claudit): strict zbugs cookies: secure, samesite (#5476) Brings back more of what was reverted in https://github.com/rocicorp/mono/pull/5465/changes --- apps/zbugs/api/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/zbugs/api/index.ts b/apps/zbugs/api/index.ts index 0a4a82e460..675643f811 100644 --- a/apps/zbugs/api/index.ts +++ b/apps/zbugs/api/index.ts @@ -120,6 +120,8 @@ fastify.get<{ .cookie('jwt', jwt, { path: '/', expires: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), + secure: !request.hostname.includes('localhost'), + sameSite: 'strict', }) .redirect( request.query.redirect ? decodeURIComponent(request.query.redirect) : '/', From 7635071414b600534b346e090eb3c6a05ce07891 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Tue, 3 Feb 2026 12:00:38 -0500 Subject: [PATCH 013/495] chore(claudit): only allow certain content types for zbugs attachments (#5475) This is restoring part of the reverted pr: https://github.com/rocicorp/mono/pull/5465 --- apps/zbugs/shared/consts.ts | 8 ++++++++ apps/zbugs/src/components/image-upload-area.tsx | 13 ++++--------- apps/zbugs/src/server/upload.ts | 7 +++++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/apps/zbugs/shared/consts.ts b/apps/zbugs/shared/consts.ts index 6b82ffc1e6..3327854919 100644 --- a/apps/zbugs/shared/consts.ts +++ b/apps/zbugs/shared/consts.ts @@ -1 +1,9 @@ export const INITIAL_COMMENT_LIMIT = 100; + +export const ALLOWED_CONTENT_TYPES = [ + 'image/jpeg', + 'image/png', + 'image/gif', + 'image/webp', + 'image/svg+xml', +]; diff --git a/apps/zbugs/src/components/image-upload-area.tsx b/apps/zbugs/src/components/image-upload-area.tsx index fc3edaa8ce..e4f5c8cf64 100644 --- a/apps/zbugs/src/components/image-upload-area.tsx +++ b/apps/zbugs/src/components/image-upload-area.tsx @@ -2,6 +2,7 @@ import classNames from 'classnames'; import type {ReactNode} from 'react'; import {useCallback, useState} from 'react'; import {useDropzone, type FileRejection} from 'react-dropzone'; +import {ALLOWED_CONTENT_TYPES} from '../../shared/consts.ts'; import {useLogin} from '../hooks/use-login.tsx'; import {Button} from './button.tsx'; import styles from './image-upload-area.module.css'; @@ -24,9 +25,8 @@ type ImageUploadAreaProps = { // Image upload logic (from use-image-upload.ts) const validateFile = (file: File): string | null => { - const validTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif']; - if (!validTypes.includes(file.type)) { - return 'Invalid file type. Please select a JPG, PNG, WEBP, or GIF image.'; + if (!ALLOWED_CONTENT_TYPES.includes(file.type)) { + return `Invalid file type. Allowed types: ${ALLOWED_CONTENT_TYPES.join(', ')}`; } if (file.size > 10 * 1024 * 1024) { @@ -190,12 +190,7 @@ export function ImageUploadArea({ ); const {getRootProps, getInputProps, isDragActive, open} = useDropzone({ - accept: { - 'image/jpeg': [], - 'image/png': [], - 'image/webp': [], - 'image/gif': [], - }, + accept: Object.fromEntries(ALLOWED_CONTENT_TYPES.map(t => [t, []])), multiple: true, maxSize: 10 * 1024 * 1024, noClick: true, diff --git a/apps/zbugs/src/server/upload.ts b/apps/zbugs/src/server/upload.ts index 355bc60fc2..5113860543 100644 --- a/apps/zbugs/src/server/upload.ts +++ b/apps/zbugs/src/server/upload.ts @@ -1,6 +1,7 @@ import {PutObjectCommand, S3Client} from '@aws-sdk/client-s3'; import {getSignedUrl} from '@aws-sdk/s3-request-presigner'; import {nanoid} from 'nanoid'; +import {ALLOWED_CONTENT_TYPES} from '../../shared/consts.ts'; if (!process.env.AWS_REGION) { // oxlint-disable-next-line no-console -- Configuration warning in demo app @@ -39,6 +40,12 @@ export async function getPresignedUrl( ); } + if (!ALLOWED_CONTENT_TYPES.includes(contentType)) { + throw new Error( + `Invalid content type: ${contentType}. Allowed types: ${ALLOWED_CONTENT_TYPES.join(', ')}`, + ); + } + const key = nanoid(); const command = new PutObjectCommand({ Bucket: BUCKET_NAME, From 0730e2e05ee941bfc9a7068bb46ee687dcf5fe75 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 3 Feb 2026 10:08:39 -0800 Subject: [PATCH 014/495] chore(zero-cache): rename cvr "minorVersion" to "configVersion" (#5510) Rename the `minorVersion` field of the `CVRVersion` object to `configVersion`. CVRVersion objects are always persisted in their string form (e.g. "61e32hi8:05") and are thus safe to rename. (The motivation is to avoid confusion with an upcoming backfill-related change in which the `minorVersion` terminology will be introduced to state versions) --- .../view-syncer/client-handler.test.ts | 8 +- .../services/view-syncer/cvr-store.pg.test.ts | 2 +- .../src/services/view-syncer/cvr.pg.test.ts | 168 +++++++++--------- .../src/services/view-syncer/cvr.test.ts | 2 +- .../services/view-syncer/schema/types.test.ts | 46 ++--- .../src/services/view-syncer/schema/types.ts | 14 +- .../view-syncer/view-syncer.pg.test.ts | 26 +-- 7 files changed, 133 insertions(+), 133 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/client-handler.test.ts b/packages/zero-cache/src/services/view-syncer/client-handler.test.ts index 87adf9816b..1e5b1c00e6 100644 --- a/packages/zero-cache/src/services/view-syncer/client-handler.test.ts +++ b/packages/zero-cache/src/services/view-syncer/client-handler.test.ts @@ -168,7 +168,7 @@ describe('view-syncer/client-handler', () => { let pokers = startPoke(handlers, poke1Version); await pokers.addPatch({ - toVersion: {stateVersion: '11z', minorVersion: 1}, + toVersion: {stateVersion: '11z', configVersion: 1}, patch: { type: 'query', op: 'put', @@ -195,7 +195,7 @@ describe('view-syncer/client-handler', () => { }, }); await pokers.addPatch({ - toVersion: {stateVersion: '120', minorVersion: 2}, + toVersion: {stateVersion: '120', configVersion: 2}, patch: {type: 'query', op: 'del', id: 'barhash', clientID: 'foo'}, }); await pokers.addPatch({ @@ -208,7 +208,7 @@ describe('view-syncer/client-handler', () => { }); await pokers.addPatch({ - toVersion: {stateVersion: '120', minorVersion: 2}, + toVersion: {stateVersion: '120', configVersion: 2}, patch: { type: 'row', op: 'put', @@ -234,7 +234,7 @@ describe('view-syncer/client-handler', () => { }, }); await pokers.addPatch({ - toVersion: {stateVersion: '11z', minorVersion: 1}, + toVersion: {stateVersion: '11z', configVersion: 1}, patch: { type: 'row', op: 'del', diff --git a/packages/zero-cache/src/services/view-syncer/cvr-store.pg.test.ts b/packages/zero-cache/src/services/view-syncer/cvr-store.pg.test.ts index 43893f44e9..eb207a87a3 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr-store.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr-store.pg.test.ts @@ -220,7 +220,7 @@ describe('view-syncer/cvr-store', () => { const cvr = await loading; expect(cvr.version).toEqual({ stateVersion: '05', - minorVersion: 1, + configVersion: 1, }); }); diff --git a/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts b/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts index 2ba53ccf6d..37df7a326a 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts @@ -633,7 +633,7 @@ describe('view-syncer/cvr', () => { const cvr = await cvrStore.load(lc, LAST_CONNECT); expect(cvr).toEqual({ id: 'abc123', - version: {stateVersion: '1a9', minorVersion: 2}, + version: {stateVersion: '1a9', configVersion: 2}, replicaVersion: '123', lastActive: 1713830400000, ttlClock: ttlClockFromNumber(1713830400000), @@ -651,12 +651,12 @@ describe('view-syncer/cvr', () => { transformationHash: 'twoHash', clientState: { fooClient: { - version: {stateVersion: '1a9', minorVersion: 1}, + version: {stateVersion: '1a9', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, - patchVersion: {stateVersion: '1a9', minorVersion: 2}, + patchVersion: {stateVersion: '1a9', configVersion: 2}, }, }, clientSchema: null, @@ -746,7 +746,7 @@ describe('view-syncer/cvr', () => { expect(cvr).toEqual({ id: 'abc123', - version: {stateVersion: '1a9', minorVersion: 2}, + version: {stateVersion: '1a9', configVersion: 2}, replicaVersion: '112', lastActive: Date.UTC(2024, 3, 23), ttlClock: ttlClockFromNumber(Date.UTC(2024, 3, 23)), @@ -764,12 +764,12 @@ describe('view-syncer/cvr', () => { transformationHash: 'twoHash', clientState: { fooClient: { - version: {stateVersion: '1a9', minorVersion: 1}, + version: {stateVersion: '1a9', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, - patchVersion: {stateVersion: '1a9', minorVersion: 2}, + patchVersion: {stateVersion: '1a9', configVersion: 2}, }, }, clientSchema: null, @@ -1011,12 +1011,12 @@ describe('view-syncer/cvr', () => { ttl: DEFAULT_TTL_MS, }, fooClient: { - version: {stateVersion: '1a9', minorVersion: 1}, + version: {stateVersion: '1a9', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, - patchVersion: {stateVersion: '1a9', minorVersion: 2}, + patchVersion: {stateVersion: '1a9', configVersion: 2}, }, }, clientSchema: null, @@ -1037,7 +1037,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1060,7 +1060,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1072,7 +1072,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1084,7 +1084,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1108,7 +1108,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1120,7 +1120,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1132,7 +1132,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1153,7 +1153,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1180,7 +1180,7 @@ describe('view-syncer/cvr', () => { `); expect(updated).toEqual({ id: 'abc123', - version: {stateVersion: '1aa', minorVersion: 1}, // minorVersion bump + version: {stateVersion: '1aa', configVersion: 1}, // configVersion bump replicaVersion: '101', lastActive: 1713916800000, ttlClock: ttlClockFromNumber(1713916800000), @@ -1264,7 +1264,7 @@ describe('view-syncer/cvr', () => { inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1aa', }, }, @@ -1272,7 +1272,7 @@ describe('view-syncer/cvr', () => { inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1aa', }, }, @@ -1289,12 +1289,12 @@ describe('view-syncer/cvr', () => { transformationVersion: undefined, clientState: { barClient: { - version: {stateVersion: '1aa', minorVersion: 1}, + version: {stateVersion: '1aa', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, - patchVersion: {stateVersion: '1a9', minorVersion: 2}, + patchVersion: {stateVersion: '1a9', configVersion: 2}, }, threeHash: { id: 'threeHash', @@ -1302,12 +1302,12 @@ describe('view-syncer/cvr', () => { ast: {table: 'comments'}, clientState: { barClient: { - version: {stateVersion: '1aa', minorVersion: 1}, + version: {stateVersion: '1aa', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, fooClient: { - version: {stateVersion: '1aa', minorVersion: 1}, + version: {stateVersion: '1aa', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, @@ -1319,7 +1319,7 @@ describe('view-syncer/cvr', () => { ast: {table: 'users'}, clientState: { fooClient: { - version: {stateVersion: '1aa', minorVersion: 1}, + version: {stateVersion: '1aa', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, @@ -1594,7 +1594,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 2, + "configVersion": 2, "stateVersion": "1aa", }, }, @@ -1867,7 +1867,7 @@ describe('view-syncer/cvr', () => { [{id: 'oneHash', transformationHash: 'serverOneHash'}], [], ); - expect(newVersion).toEqual({stateVersion: '1aa', minorVersion: 1}); + expect(newVersion).toEqual({stateVersion: '1aa', configVersion: 1}); expect(queryPatches).toMatchInlineSnapshot(` [ { @@ -1877,7 +1877,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -1943,7 +1943,7 @@ describe('view-syncer/cvr', () => { }, }, { - toVersion: {stateVersion: '1aa', minorVersion: 1}, + toVersion: {stateVersion: '1aa', configVersion: 1}, patch: { type: 'row', op: 'put', @@ -2018,7 +2018,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -2056,14 +2056,14 @@ describe('view-syncer/cvr', () => { ast: {table: 'issues'}, clientState: { fooClient: { - version: {stateVersion: '1a9', minorVersion: 1}, + version: {stateVersion: '1a9', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, transformationHash: 'serverOneHash', - transformationVersion: {stateVersion: '1aa', minorVersion: 1}, - patchVersion: {stateVersion: '1aa', minorVersion: 1}, + transformationVersion: {stateVersion: '1aa', configVersion: 1}, + patchVersion: {stateVersion: '1aa', configVersion: 1}, }, }, lastActive: 1713834000000, @@ -2353,7 +2353,7 @@ describe('view-syncer/cvr', () => { [{id: 'oneHash', transformationHash: 'serverTwoHash'}], [], ); - expect(newVersion).toEqual({stateVersion: '1ba', minorVersion: 1}); + expect(newVersion).toEqual({stateVersion: '1ba', configVersion: 1}); expect(queryPatches).toHaveLength(0); expect( @@ -2372,7 +2372,7 @@ describe('view-syncer/cvr', () => { ), ).toEqual([ { - toVersion: {stateVersion: '1aa', minorVersion: 1}, + toVersion: {stateVersion: '1aa', configVersion: 1}, patch: { type: 'row', op: 'put', @@ -2384,7 +2384,7 @@ describe('view-syncer/cvr', () => { expect(updater.updatedVersion()).toEqual({ stateVersion: '1ba', - minorVersion: 1, + configVersion: 1, }); expect( @@ -2404,7 +2404,7 @@ describe('view-syncer/cvr', () => { ), ).toEqual([ { - toVersion: {stateVersion: '1ba', minorVersion: 1}, + toVersion: {stateVersion: '1ba', configVersion: 1}, patch: { type: 'row', op: 'put', @@ -2466,7 +2466,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -2478,7 +2478,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -2515,14 +2515,14 @@ describe('view-syncer/cvr', () => { ast: {table: 'issues'}, clientState: { fooClient: { - version: {stateVersion: '1a9', minorVersion: 1}, + version: {stateVersion: '1a9', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, transformationHash: 'serverTwoHash', - transformationVersion: {stateVersion: '1ba', minorVersion: 1}, - patchVersion: {stateVersion: '1aa', minorVersion: 1}, + transformationVersion: {stateVersion: '1ba', configVersion: 1}, + patchVersion: {stateVersion: '1aa', configVersion: 1}, }, }, lastActive: 1713834000000, @@ -2666,7 +2666,7 @@ describe('view-syncer/cvr', () => { [{id: 'oneHash', transformationHash: 'newXFormHash'}], [], )); - expect(newVersion).toEqual({stateVersion: '1ba', minorVersion: 2}); + expect(newVersion).toEqual({stateVersion: '1ba', configVersion: 2}); expect(queryPatches).toHaveLength(0); ({cvr: updated, flushed} = await updater.flush( @@ -2914,7 +2914,7 @@ describe('view-syncer/cvr', () => { ], [], ); - expect(newVersion).toEqual({stateVersion: '1ba', minorVersion: 1}); + expect(newVersion).toEqual({stateVersion: '1ba', configVersion: 1}); expect(queryPatches).toHaveLength(0); expect( @@ -2933,7 +2933,7 @@ describe('view-syncer/cvr', () => { ), ).toEqual([ { - toVersion: {stateVersion: '1aa', minorVersion: 1}, + toVersion: {stateVersion: '1aa', configVersion: 1}, patch: { type: 'row', op: 'put', @@ -3043,7 +3043,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -3054,7 +3054,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -3066,7 +3066,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -3078,7 +3078,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -3118,14 +3118,14 @@ describe('view-syncer/cvr', () => { ast: {table: 'issues'}, clientState: { fooClient: { - version: {stateVersion: '1a9', minorVersion: 1}, + version: {stateVersion: '1a9', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, transformationHash: 'updatedServerOneHash', transformationVersion: newVersion, - patchVersion: {stateVersion: '1aa', minorVersion: 1}, + patchVersion: {stateVersion: '1aa', configVersion: 1}, }, twoHash: { id: 'twoHash', @@ -3133,14 +3133,14 @@ describe('view-syncer/cvr', () => { ast: {table: 'issues'}, clientState: { fooClient: { - version: {stateVersion: '1a9', minorVersion: 1}, + version: {stateVersion: '1a9', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, transformationHash: 'updatedServerTwoHash', transformationVersion: newVersion, - patchVersion: {stateVersion: '1aa', minorVersion: 1}, + patchVersion: {stateVersion: '1aa', configVersion: 1}, }, }, } satisfies CVRSnapshot); @@ -3429,7 +3429,7 @@ describe('view-syncer/cvr', () => { [], [{id: 'oneHash'}], ); - expect(newVersion).toEqual({stateVersion: '1ba', minorVersion: 1}); + expect(newVersion).toEqual({stateVersion: '1ba', configVersion: 1}); expect(queryPatches).toMatchInlineSnapshot(` [ { @@ -3439,7 +3439,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1ba", }, }, @@ -3856,14 +3856,14 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, }, "id": "oneHash", "patchVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, "transformationHash": "serverOneHash", @@ -3881,14 +3881,14 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, }, "id": "twoHash", "patchVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, "transformationHash": "serverTwoHash", @@ -3934,7 +3934,7 @@ describe('view-syncer/cvr', () => { ), ).toEqual([ { - toVersion: {stateVersion: '1aa', minorVersion: 1}, + toVersion: {stateVersion: '1aa', configVersion: 1}, patch: { type: 'row', op: 'put', @@ -4027,7 +4027,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -4038,7 +4038,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -4050,7 +4050,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -4062,7 +4062,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -5223,7 +5223,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -5273,7 +5273,7 @@ describe('view-syncer/cvr', () => { inactivatedAt: ttlClock, ttl: DEFAULT_TTL_MS, version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1aa', }, }, @@ -5286,7 +5286,7 @@ describe('view-syncer/cvr', () => { }, replicaVersion: '120', version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1aa', }, clientSchema: null, @@ -5384,7 +5384,7 @@ describe('view-syncer/cvr', () => { inactivatedAt: undefined, ttl, version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1a9', }, }, @@ -5417,7 +5417,7 @@ describe('view-syncer/cvr', () => { inactivatedAt: now, ttl, version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1aa', }, }, @@ -5533,7 +5533,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -5542,7 +5542,7 @@ describe('view-syncer/cvr', () => { "patchVersion": undefined, "transformationHash": "oneHashTransformed", "transformationVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, "type": "client", @@ -5573,7 +5573,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -5607,7 +5607,7 @@ describe('view-syncer/cvr', () => { inactivatedAt: ttlClock, ttl: DEFAULT_TTL_MS, version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1aa', }, }, @@ -5616,14 +5616,14 @@ describe('view-syncer/cvr', () => { patchVersion: undefined, transformationHash: 'oneHashTransformed', transformationVersion: { - minorVersion: 1, + configVersion: 1, stateVersion: '1a9', }, }, }, replicaVersion: '120', version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1aa', }, clientSchema: null, @@ -5706,7 +5706,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 10, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, } @@ -5727,7 +5727,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -5746,7 +5746,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 600000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, } @@ -5870,7 +5870,7 @@ describe('view-syncer/cvr', () => { "type": "query", }, "toVersion": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -5915,7 +5915,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -5923,7 +5923,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": 1709683200000, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, }, @@ -5931,7 +5931,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -5946,7 +5946,7 @@ describe('view-syncer/cvr', () => { "replicaVersion": "120", "ttlClock": 1709683200000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1aa", }, } @@ -6238,7 +6238,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, @@ -6246,7 +6246,7 @@ describe('view-syncer/cvr', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "1a9", }, }, diff --git a/packages/zero-cache/src/services/view-syncer/cvr.test.ts b/packages/zero-cache/src/services/view-syncer/cvr.test.ts index 2aea634e8c..50fe9b6103 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr.test.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr.test.ts @@ -49,7 +49,7 @@ function makeCVR(clients: Record): CVR { inactivatedAt, ttl, version: { - minorVersion: 1, + configVersion: 1, stateVersion: '1a9', }, }; diff --git a/packages/zero-cache/src/services/view-syncer/schema/types.test.ts b/packages/zero-cache/src/services/view-syncer/schema/types.test.ts index 04a3ecc10a..87028c9401 100644 --- a/packages/zero-cache/src/services/view-syncer/schema/types.test.ts +++ b/packages/zero-cache/src/services/view-syncer/schema/types.test.ts @@ -11,44 +11,44 @@ describe('view-syncer/schema/types', () => { test('version comparison', () => { expect( cmpVersions( - {stateVersion: '02', minorVersion: 1}, - {stateVersion: '01', minorVersion: 2}, + {stateVersion: '02', configVersion: 1}, + {stateVersion: '01', configVersion: 2}, ), ).toBeGreaterThan(0); expect( cmpVersions( - {stateVersion: '01', minorVersion: 2}, - {stateVersion: '02', minorVersion: 1}, + {stateVersion: '01', configVersion: 2}, + {stateVersion: '02', configVersion: 1}, ), ).toBeLessThan(0); expect( cmpVersions( - {stateVersion: '02', minorVersion: 1}, - {stateVersion: '02', minorVersion: 2}, + {stateVersion: '02', configVersion: 1}, + {stateVersion: '02', configVersion: 2}, ), ).toBeLessThan(0); expect( cmpVersions( - {stateVersion: '02', minorVersion: 2}, - {stateVersion: '02', minorVersion: 1}, + {stateVersion: '02', configVersion: 2}, + {stateVersion: '02', configVersion: 1}, ), ).toBeGreaterThan(0); expect( - cmpVersions({stateVersion: '02'}, {stateVersion: '02', minorVersion: 1}), + cmpVersions({stateVersion: '02'}, {stateVersion: '02', configVersion: 1}), ).toBeLessThan(0); expect( - cmpVersions({stateVersion: '02', minorVersion: 1}, {stateVersion: '02'}), + cmpVersions({stateVersion: '02', configVersion: 1}, {stateVersion: '02'}), ).toBeGreaterThan(0); expect( cmpVersions( - {stateVersion: '02', minorVersion: 2}, - {stateVersion: '02', minorVersion: 2}, + {stateVersion: '02', configVersion: 2}, + {stateVersion: '02', configVersion: 2}, ), ).toBe(0); @@ -62,11 +62,11 @@ describe('view-syncer/schema/types', () => { {cookie: null, version: null}, {cookie: '00', version: {stateVersion: '00'}}, {cookie: '2abc', version: {stateVersion: '2abc'}}, - {cookie: '00:01', version: {stateVersion: '00', minorVersion: 1}}, - {cookie: '100:0a', version: {stateVersion: '100', minorVersion: 10}}, + {cookie: '00:01', version: {stateVersion: '00', configVersion: 1}}, + {cookie: '100:0a', version: {stateVersion: '100', configVersion: 10}}, { cookie: 'a128adk2f9s:110', - version: {stateVersion: 'a128adk2f9s', minorVersion: 36}, + version: {stateVersion: 'a128adk2f9s', configVersion: 36}, }, ] satisfies { cookie: string | null; @@ -98,23 +98,23 @@ describe('view-syncer/schema/types', () => { [ { version: {stateVersion: '00'}, - plusOne: {stateVersion: '00', minorVersion: 1}, + plusOne: {stateVersion: '00', configVersion: 1}, }, { version: {stateVersion: '2abc'}, - plusOne: {stateVersion: '2abc', minorVersion: 1}, + plusOne: {stateVersion: '2abc', configVersion: 1}, }, { - version: {stateVersion: '00', minorVersion: 1}, - plusOne: {stateVersion: '00', minorVersion: 2}, + version: {stateVersion: '00', configVersion: 1}, + plusOne: {stateVersion: '00', configVersion: 2}, }, { - version: {stateVersion: '100', minorVersion: 10}, - plusOne: {stateVersion: '100', minorVersion: 11}, + version: {stateVersion: '100', configVersion: 10}, + plusOne: {stateVersion: '100', configVersion: 11}, }, { - version: {stateVersion: 'a128adk2f9s', minorVersion: 36}, - plusOne: {stateVersion: 'a128adk2f9s', minorVersion: 37}, + version: {stateVersion: 'a128adk2f9s', configVersion: 36}, + plusOne: {stateVersion: 'a128adk2f9s', configVersion: 37}, }, ] satisfies { version: CVRVersion; diff --git a/packages/zero-cache/src/services/view-syncer/schema/types.ts b/packages/zero-cache/src/services/view-syncer/schema/types.ts index d739498b25..738e61e01a 100644 --- a/packages/zero-cache/src/services/view-syncer/schema/types.ts +++ b/packages/zero-cache/src/services/view-syncer/schema/types.ts @@ -13,7 +13,7 @@ export const cvrVersionSchema = v.object({ stateVersion: v.string(), // LexiVersion /** - * `minorVersion` is subversion of `stateVersion` that is initially absent for each + * `configVersion` is subversion of `stateVersion` that is initially absent for each * `stateVersion`, and incremented for configuration changes that affect the contents * of the CVR such as: * @@ -28,7 +28,7 @@ export const cvrVersionSchema = v.object({ * When the `stateVersion` moves forward, the `minorVersion` is reset to absent. * In this manner it behaves like the analogous concept in semantic versioning. */ - minorVersion: v.number().optional(), + configVersion: v.number().optional(), }); export type CVRVersion = v.Infer; @@ -42,7 +42,7 @@ export function oneAfter(v: NullableCVRVersion): CVRVersion { ? {stateVersion: versionToLexi(0)} : { stateVersion: v.stateVersion, - minorVersion: (v.minorVersion ?? 0) + 1, + configVersion: (v.configVersion ?? 0) + 1, }; } @@ -62,7 +62,7 @@ export function cmpVersions( ? -1 : a.stateVersion > b.stateVersion ? 1 - : (a.minorVersion ?? 0) - (b.minorVersion ?? 0); + : (a.configVersion ?? 0) - (b.configVersion ?? 0); } export function maxVersion(a: CVRVersion, b?: CVRVersion): CVRVersion { @@ -294,8 +294,8 @@ export function versionString(v: CVRVersion) { // storage key path separator (e.g. "/") so that "01/row-hash" is less than "01:01/row-hash". // In particular, the traditional separator for major.minor versions (".") does not // satisfy this quality. - return v.minorVersion - ? `${v.stateVersion}:${versionToLexi(v.minorVersion)}` + return v.configVersion + ? `${v.stateVersion}:${versionToLexi(v.configVersion)}` : v.stateVersion; } @@ -312,7 +312,7 @@ export function versionFromString(str: string): CVRVersion { if (minorVersion > BigInt(Number.MAX_SAFE_INTEGER)) { throw new Error(`minorVersion ${parts[1]} exceeds max safe integer`); } - return {stateVersion, minorVersion: Number(minorVersion)}; + return {stateVersion, configVersion: Number(minorVersion)}; } default: throw new TypeError(`Invalid version string ${str}`); diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts index c322d26b66..b6e195ffb6 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts @@ -187,11 +187,11 @@ describe('view-syncer/service', () => { 'query-hash1': { ast: ISSUES_QUERY, type: 'client', - clientState: {foo: {version: {stateVersion: '00', minorVersion: 1}}}, + clientState: {foo: {version: {stateVersion: '00', configVersion: 1}}}, id: 'query-hash1', }, }, - version: {stateVersion: '00', minorVersion: 1}, + version: {stateVersion: '00', configVersion: 1}, }); }); @@ -310,7 +310,7 @@ describe('view-syncer/service', () => { foo: { inactivatedAt, ttl: DEFAULT_TTL_MS, - version: {minorVersion: 2, stateVersion: '00'}, + version: {configVersion: 2, stateVersion: '00'}, }, }, id: 'query-hash1', @@ -322,13 +322,13 @@ describe('view-syncer/service', () => { foo: { inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, - version: {stateVersion: '00', minorVersion: 2}, + version: {stateVersion: '00', configVersion: 2}, }, }, id: 'query-hash2', }, }, - version: {stateVersion: '00', minorVersion: 2}, + version: {stateVersion: '00', configVersion: 2}, }); }); @@ -1259,7 +1259,7 @@ describe('view-syncer/service', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "00", }, }, @@ -1517,7 +1517,7 @@ describe('view-syncer/service', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "01", }, }, @@ -2163,7 +2163,7 @@ describe('view-syncer/service', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "00", }, }, @@ -2181,7 +2181,7 @@ describe('view-syncer/service', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "00", }, }, @@ -2342,7 +2342,7 @@ describe('view-syncer/service', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "01", }, }, @@ -2350,7 +2350,7 @@ describe('view-syncer/service', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "00", }, }, @@ -2375,7 +2375,7 @@ describe('view-syncer/service', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "01", }, }, @@ -2383,7 +2383,7 @@ describe('view-syncer/service', () => { "inactivatedAt": undefined, "ttl": 300000, "version": { - "minorVersion": 1, + "configVersion": 1, "stateVersion": "00", }, }, From d4c69aef48e96df1712d142267031b0a5eb362ea Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 3 Feb 2026 11:27:21 -0800 Subject: [PATCH 015/495] chore(zero-cache): introduce minor stateVersions for tracking backfill txs (#5512) Expands the format of the `stateVersion` to allow an optional `minorVersion` that comes after a `.`, e.g. `61e32hi8.05`. This will be used to track backfill transactions in between the replicated transactions from the replication stream (the latter of which still correspond to the advancing LSN). --- .../change-source/pg/change-source.pg.test.ts | 22 +++++-- .../change-source/pg/change-source.ts | 33 ++++++----- .../change-source/pg/initial-sync.pg.test.ts | 4 +- .../services/change-source/pg/initial-sync.ts | 4 +- .../src/services/change-source/pg/lsn.test.ts | 24 ++++---- .../src/services/change-source/pg/lsn.ts | 18 +++--- packages/zero-cache/src/services/statz.ts | 4 +- .../services/view-syncer/cvr-store.pg.test.ts | 8 +-- .../src/services/view-syncer/cvr.pg.test.ts | 12 ++-- .../src/services/view-syncer/schema/types.ts | 16 ++++-- .../zero-cache/src/types/lexi-version.test.ts | 6 -- packages/zero-cache/src/types/lexi-version.ts | 4 -- .../src/types/state-version.test.ts | 55 ++++++++++++++++++ .../zero-cache/src/types/state-version.ts | 57 +++++++++++++++++++ 14 files changed, 199 insertions(+), 68 deletions(-) create mode 100644 packages/zero-cache/src/types/state-version.test.ts create mode 100644 packages/zero-cache/src/types/state-version.ts diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index d91759203f..f0daccf343 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -15,8 +15,11 @@ import { test, } from '../../../test/db.ts'; import {DbFile} from '../../../test/lite.ts'; -import {versionFromLexi, versionToLexi} from '../../../types/lexi-version.ts'; import {type PostgresDB} from '../../../types/pg.ts'; +import { + majorVersionFromString, + majorVersionToString, +} from '../../../types/state-version.ts'; import type {Source} from '../../../types/streams.ts'; import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; import {getSubscriptionState} from '../../replicator/schema/replication-state.ts'; @@ -27,7 +30,7 @@ import type { Commit, } from '../protocol/current/downstream.ts'; import {initializePostgresChangeSource} from './change-source.ts'; -import {fromLexiVersion} from './lsn.ts'; +import {fromStateVersionString} from './lsn.ts'; import {dropEventTriggerStatements} from './schema/ddl.ts'; const APP_ID = '23'; @@ -349,9 +352,9 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { const results = await upstream<{confirmed: string}[]>` SELECT confirmed_flush_lsn as confirmed FROM pg_replication_slots WHERE slot_name = ${replicationSlot}`; - const expected = versionFromLexi(commit1[2].watermark); + const expected = majorVersionFromString(commit1[2].watermark); expect(results).toEqual([ - {confirmed: fromLexiVersion(versionToLexi(expected))}, + {confirmed: fromStateVersionString(majorVersionToString(expected))}, ]); }); @@ -487,6 +490,17 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { expect(await changes3.dequeue()).toEqual(commit3); stream3.changes.cancel(); + + // Similarly, start a stream from after the secondCommit that has + // a minor version to confirm that it is ignored. + const stream4 = await startStream(`${commit2[2].watermark}.3z8d2`); + const changes4 = drainToQueue(stream4.changes); + + expect(await changes4.dequeue()).toMatchObject(begin3); + expect(await changes4.dequeue()).toMatchObject(['data', {tag: 'insert'}]); + expect(await changes4.dequeue()).toEqual(commit3); + + stream3.changes.cancel(); }); test('set replica identity using index', async () => { diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 68ee034cd4..9510c53e64 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -22,18 +22,17 @@ import {Database} from '../../../../../zqlite/src/db.ts'; import {mapPostgresToLiteColumn} from '../../../db/pg-to-lite.ts'; import type {ColumnSpec, PublishedTableSpec} from '../../../db/specs.ts'; import {StatementRunner} from '../../../db/statements.ts'; -import { - oneAfter, - versionFromLexi, - versionToLexi, - type LexiVersion, -} from '../../../types/lexi-version.ts'; +import {type LexiVersion} from '../../../types/lexi-version.ts'; import {pgClient, type PostgresDB} from '../../../types/pg.ts'; import { upstreamSchema, type ShardConfig, type ShardID, } from '../../../types/shards.ts'; +import { + majorVersionFromString, + majorVersionToString, +} from '../../../types/state-version.ts'; import type {Sink} from '../../../types/streams.ts'; import {Subscription, type PendingResult} from '../../../types/subscription.ts'; import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; @@ -61,7 +60,7 @@ import type { MessageRelation as PostgresRelation, } from './logical-replication/pgoutput.types.ts'; import {subscribe} from './logical-replication/stream.ts'; -import {fromBigInt, toLexiVersion, type LSN} from './lsn.ts'; +import {fromBigInt, toStateVersionString, type LSN} from './lsn.ts'; import {replicationEventSchema, type DdlUpdateEvent} from './schema/ddl.ts'; import {updateShardSchema} from './schema/init.ts'; import { @@ -258,13 +257,13 @@ class PostgresChangeSource implements ChangeSource { clientWatermark: string, shardConfig: InternalShardConfig, ): Promise { - const clientStart = oneAfter(clientWatermark); + const clientStart = majorVersionFromString(clientWatermark) + 1n; const {messages, acks} = await subscribe( this.#lc, db, slot, [...shardConfig.publications], - versionFromLexi(clientStart), + clientStart, ); const changes = Subscription.create({ @@ -284,7 +283,11 @@ class PostgresChangeSource implements ChangeSource { try { for await (const [lsn, msg] of messages) { if (msg.tag === 'keepalive') { - changes.push(['status', msg, {watermark: versionToLexi(lsn)}]); + changes.push([ + 'status', + msg, + {watermark: majorVersionToString(lsn)}, + ]); continue; } let last: PendingResult | undefined; @@ -424,7 +427,7 @@ export class Acker { // Note: Sending '0/0' means "keep alive but do not update confirmed_flush_lsn" // https://github.com/postgres/postgres/blob/3edc67d337c2e498dad1cd200e460f7c63e512e6/src/backend/replication/walsender.c#L2457 - const lsn = watermark ? versionFromLexi(watermark) : 0n; + const lsn = watermark ? majorVersionFromString(watermark) : 0n; this.#acks.push(lsn); } } @@ -523,7 +526,7 @@ class ChangeMaker { [ 'begin', {...msg, json: 's'}, - {commitWatermark: toLexiVersion(must(msg.commitLsn))}, + {commitWatermark: toStateVersionString(must(msg.commitLsn))}, ], ]; @@ -574,7 +577,11 @@ class ChangeMaker { case 'commit': return [ - ['commit', msg, {watermark: toLexiVersion(must(msg.commitLsn))}], + [ + 'commit', + msg, + {watermark: toStateVersionString(must(msg.commitLsn))}, + ], ]; case 'relation': diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts index ca7fc50937..2e0f411068 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts @@ -20,7 +20,7 @@ import { import type {PostgresDB} from '../../../types/pg.ts'; import {ZERO_VERSION_COLUMN_NAME} from '../../replicator/schema/replication-state.ts'; import {initialSync, INSERT_BATCH_SIZE} from './initial-sync.ts'; -import {fromLexiVersion} from './lsn.ts'; +import {fromStateVersionString} from './lsn.ts'; import {ensureShardSchema} from './schema/init.ts'; import {getPublicationInfo} from './schema/published.ts'; import {UnsupportedTableSchemaError} from './schema/validation.ts'; @@ -2601,7 +2601,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { FROM pg_replication_slots WHERE slot_name = ${r.slot}`; expect(slots[0]).toEqual({ slotName: r.slot, - lsn: fromLexiVersion(replicaState.stateVersion), + lsn: fromStateVersionString(replicaState.stateVersion), }); expect(eventSink.slice(0, 2)).toMatchObject([ diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index 2bfac8b480..c70ab75772 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -41,7 +41,7 @@ import {id} from '../../../types/sql.ts'; import {ReplicationStatusPublisher} from '../../replicator/replication-status.ts'; import {ColumnMetadataStore} from '../../replicator/schema/column-metadata.ts'; import {initReplicationState} from '../../replicator/schema/replication-state.ts'; -import {toLexiVersion} from './lsn.ts'; +import {toStateVersionString} from './lsn.ts'; import {ensureShardSchema} from './schema/init.ts'; import {getPublicationInfo} from './schema/published.ts'; import { @@ -128,7 +128,7 @@ export async function initialSync( } } const {snapshot_name: snapshot, consistent_point: lsn} = slot; - const initialVersion = toLexiVersion(lsn); + const initialVersion = toStateVersionString(lsn); initReplicationState(tx, publications, initialVersion); diff --git a/packages/zero-cache/src/services/change-source/pg/lsn.test.ts b/packages/zero-cache/src/services/change-source/pg/lsn.test.ts index 76874e771f..a446a2c90d 100644 --- a/packages/zero-cache/src/services/change-source/pg/lsn.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/lsn.test.ts @@ -1,13 +1,10 @@ import {describe, expect, test} from 'vitest'; -import { - versionFromLexi, - type LexiVersion, -} from '../../../types/lexi-version.ts'; +import {type LexiVersion} from '../../../types/lexi-version.ts'; import { fromBigInt, - fromLexiVersion, + fromStateVersionString, toBigInt, - toLexiVersion, + toStateVersionString, type LSN, } from './lsn.ts'; @@ -15,15 +12,22 @@ describe('lsn to/from LexiVersion', () => { type Case = [LSN, LexiVersion, bigint]; const cases: Case[] = [ ['0/0', '00', 0n], + ['0/0', '00.01', 0n], ['0/A', '0a', 10n], ['16/B374D848', '718sh0nk8', 97500059720n], + ['16/B374D848', '718sh0nk8.123', 97500059720n], ['FFFFFFFF/FFFFFFFF', 'c3w5e11264sgsf', 2n ** 64n - 1n], ]; - test.each(cases)('convert(%s <=> %s)', (lsn, lexi, ver) => { - expect(toLexiVersion(lsn)).toBe(lexi); + test.each(cases)('convert(%s <=> %s)', (lsn, str, ver) => { + if (str.includes('.')) { + expect(toStateVersionString(lsn)).toBe( + str.substring(0, str.indexOf('.')), + ); + } else { + expect(toStateVersionString(lsn)).toBe(str); + } expect(toBigInt(lsn)).toBe(ver); expect(fromBigInt(ver)).toBe(lsn); - expect(versionFromLexi(lexi).toString()).toBe(ver.toString()); - expect(fromLexiVersion(lexi)).toBe(lsn); + expect(fromStateVersionString(str)).toBe(lsn); }); }); diff --git a/packages/zero-cache/src/services/change-source/pg/lsn.ts b/packages/zero-cache/src/services/change-source/pg/lsn.ts index c2f60ade09..01d3936520 100644 --- a/packages/zero-cache/src/services/change-source/pg/lsn.ts +++ b/packages/zero-cache/src/services/change-source/pg/lsn.ts @@ -1,9 +1,8 @@ import {assert} from '../../../../../shared/src/asserts.ts'; import { - versionFromLexi, - versionToLexi, - type LexiVersion, -} from '../../../types/lexi-version.ts'; + majorVersionToString, + stateVersionFromString, +} from '../../../types/state-version.ts'; import type {Change} from '../protocol/current/data.ts'; /** @@ -29,13 +28,14 @@ export function toBigInt(lsn: LSN): bigint { return val; } -export function toLexiVersion(lsn: LSN): LexiVersion { - return versionToLexi(toBigInt(lsn)); +export function toStateVersionString(lsn: LSN): string { + return majorVersionToString(toBigInt(lsn)); } -export function fromLexiVersion(lexi: LexiVersion): LSN { - const val = versionFromLexi(lexi); - return fromBigInt(val); +/** The LSN is tracked by the `major` component of the StateVersion. */ +export function fromStateVersionString(ver: string): LSN { + const {major} = stateVersionFromString(ver); + return fromBigInt(major); } export function fromBigInt(val: bigint): LSN { diff --git a/packages/zero-cache/src/services/statz.ts b/packages/zero-cache/src/services/statz.ts index 5934d27f12..8471738f55 100644 --- a/packages/zero-cache/src/services/statz.ts +++ b/packages/zero-cache/src/services/statz.ts @@ -11,7 +11,7 @@ import {isAdminPasswordValid} from '../config/zero-config.ts'; import {StatementRunner} from '../db/statements.ts'; import {pgClient} from '../types/pg.ts'; import {getShardID, upstreamSchema} from '../types/shards.ts'; -import {fromLexiVersion} from './change-source/pg/lsn.ts'; +import {fromStateVersionString} from './change-source/pg/lsn.ts'; import {getReplicationState} from './replicator/schema/replication-state.ts'; async function upstreamStats(lc: LogContext, config: ZeroConfig) { @@ -242,7 +242,7 @@ function replicationStats(lc: LogContext, config: ZeroConfig) { function getReplicationStats(db: Database) { const {stateVersion} = getReplicationState(new StatementRunner(db)); - const lsn = fromLexiVersion(stateVersion); + const lsn = fromStateVersionString(stateVersion); return {lsn}; } diff --git a/packages/zero-cache/src/services/view-syncer/cvr-store.pg.test.ts b/packages/zero-cache/src/services/view-syncer/cvr-store.pg.test.ts index eb207a87a3..cc35cde8a8 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr-store.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr-store.pg.test.ts @@ -4,11 +4,11 @@ import type {ReadonlyJSONValue} from '../../../../shared/src/json.ts'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import {sleep} from '../../../../shared/src/sleep.ts'; import {test, type PgTest} from '../../test/db.ts'; -import {versionToLexi} from '../../types/lexi-version.ts'; import type {PostgresDB} from '../../types/pg.ts'; import {rowIDString, type RowID} from '../../types/row-key.ts'; import {upstreamSchema} from '../../types/shards.ts'; import {id} from '../../types/sql.ts'; +import {stateVersionToString} from '../../types/state-version.ts'; import {getMutationsTableDefinition} from '../change-source/pg/schema/shard.ts'; import {ClientNotFoundError, CVRStore, OwnershipError} from './cvr-store.ts'; import { @@ -642,7 +642,7 @@ describe('view-syncer/cvr-store', () => { // Commit 30 flushes of 10 rows each. for (let i = 20; i < 320; i += 10) { - const version = versionToLexi(i); + const version = stateVersionToString({major: i}); const updater = new CVRQueryDrivenUpdater(store, cvr, version, '01'); updater.trackQueries( lc, @@ -719,7 +719,7 @@ describe('view-syncer/cvr-store', () => { // Commit 30 flushes of 10 rows each. for (let i = 20; i < 320; i += 10) { - const version = versionToLexi(i); + const version = stateVersionToString({major: i}); const updater = new CVRQueryDrivenUpdater(store, cvr, version, '01'); updater.trackQueries( lc, @@ -746,7 +746,7 @@ describe('view-syncer/cvr-store', () => { const updater = new CVRQueryDrivenUpdater( store, cvr, - versionToLexi(320), + stateVersionToString({major: 320}), '01', ); updater.trackQueries( diff --git a/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts b/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts index 37df7a326a..6b166e8c80 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts @@ -579,7 +579,7 @@ describe('view-syncer/cvr', () => { instances: [ { clientGroupID: 'abc123', - version: '1a9:02', + version: '1a9.28wa:02', replicaVersion: '123', lastActive: Date.UTC(2024, 3, 23), ttlClock: ttlClockFromNumber(Date.UTC(2024, 3, 23)), @@ -601,7 +601,7 @@ describe('view-syncer/cvr', () => { queryArgs: null, queryName: null, transformationVersion: null, - patchVersion: '1a9:02', + patchVersion: '1a9.28wa:02', internal: null, deleted: false, }, @@ -611,7 +611,7 @@ describe('view-syncer/cvr', () => { clientGroupID: 'abc123', clientID: 'fooClient', queryHash: 'oneHash', - patchVersion: '1a9:01', + patchVersion: '1a9.28wa:01', deleted: false, inactivatedAt: null, ttl: DEFAULT_TTL_MS, @@ -633,7 +633,7 @@ describe('view-syncer/cvr', () => { const cvr = await cvrStore.load(lc, LAST_CONNECT); expect(cvr).toEqual({ id: 'abc123', - version: {stateVersion: '1a9', configVersion: 2}, + version: {stateVersion: '1a9.28wa', configVersion: 2}, replicaVersion: '123', lastActive: 1713830400000, ttlClock: ttlClockFromNumber(1713830400000), @@ -651,12 +651,12 @@ describe('view-syncer/cvr', () => { transformationHash: 'twoHash', clientState: { fooClient: { - version: {stateVersion: '1a9', configVersion: 1}, + version: {stateVersion: '1a9.28wa', configVersion: 1}, inactivatedAt: undefined, ttl: DEFAULT_TTL_MS, }, }, - patchVersion: {stateVersion: '1a9', configVersion: 2}, + patchVersion: {stateVersion: '1a9.28wa', configVersion: 2}, }, }, clientSchema: null, diff --git a/packages/zero-cache/src/services/view-syncer/schema/types.ts b/packages/zero-cache/src/services/view-syncer/schema/types.ts index 738e61e01a..298d7a7628 100644 --- a/packages/zero-cache/src/services/view-syncer/schema/types.ts +++ b/packages/zero-cache/src/services/view-syncer/schema/types.ts @@ -3,6 +3,10 @@ import {jsonSchema} from '../../../../../shared/src/json-schema.ts'; import * as v from '../../../../../shared/src/valita.ts'; import {astSchema} from '../../../../../zero-protocol/src/ast.ts'; import {versionFromLexi, versionToLexi} from '../../../types/lexi-version.ts'; +import { + majorVersionToString, + stateVersionFromString, +} from '../../../types/state-version.ts'; import {ttlClockSchema} from '../ttl-clock.ts'; import type {QueriesRow} from './cvr.ts'; @@ -34,12 +38,12 @@ export const cvrVersionSchema = v.object({ export type CVRVersion = v.Infer; export const EMPTY_CVR_VERSION: CVRVersion = { - stateVersion: versionToLexi(0), + stateVersion: majorVersionToString(0), } as const; export function oneAfter(v: NullableCVRVersion): CVRVersion { return v === null - ? {stateVersion: versionToLexi(0)} + ? {stateVersion: majorVersionToString(0)} : { stateVersion: v.stateVersion, configVersion: (v.configVersion ?? 0) + 1, @@ -304,15 +308,15 @@ export function versionFromString(str: string): CVRVersion { const stateVersion = parts[0]; switch (parts.length) { case 1: { - versionFromLexi(stateVersion); // Purely for validation. + stateVersionFromString(stateVersion); // Purely for validation. return {stateVersion}; } case 2: { - const minorVersion = versionFromLexi(parts[1]); - if (minorVersion > BigInt(Number.MAX_SAFE_INTEGER)) { + const configVersion = versionFromLexi(parts[1]); + if (configVersion > BigInt(Number.MAX_SAFE_INTEGER)) { throw new Error(`minorVersion ${parts[1]} exceeds max safe integer`); } - return {stateVersion, configVersion: Number(minorVersion)}; + return {stateVersion, configVersion: Number(configVersion)}; } default: throw new TypeError(`Invalid version string ${str}`); diff --git a/packages/zero-cache/src/types/lexi-version.test.ts b/packages/zero-cache/src/types/lexi-version.test.ts index 6fb7365e3c..71e8898721 100644 --- a/packages/zero-cache/src/types/lexi-version.test.ts +++ b/packages/zero-cache/src/types/lexi-version.test.ts @@ -2,7 +2,6 @@ import {expect, test} from 'vitest'; import { max, min, - oneAfter, versionFromLexi, versionToLexi, type AtLeastOne, @@ -32,11 +31,6 @@ test('LexiVersion encoding', () => { } }); -test('oneAfter', () => { - expect(oneAfter('2zzz')).toBe('31000'); - expect(oneAfter('e65gym2kbgwjf668')).toBe('e65gym2kbgwjf669'); -}); - test('min max', () => { expect(min('01')).toBe('01'); expect(max('01')).toBe('01'); diff --git a/packages/zero-cache/src/types/lexi-version.ts b/packages/zero-cache/src/types/lexi-version.ts index 7189d009fb..4ba19260b1 100644 --- a/packages/zero-cache/src/types/lexi-version.ts +++ b/packages/zero-cache/src/types/lexi-version.ts @@ -75,7 +75,3 @@ export function min(...versions: AtLeastOne): LexiVersion { } return winner; } - -export function oneAfter(version: LexiVersion) { - return versionToLexi(versionFromLexi(version) + 1n); -} diff --git a/packages/zero-cache/src/types/state-version.test.ts b/packages/zero-cache/src/types/state-version.test.ts new file mode 100644 index 0000000000..f1d9c15ea9 --- /dev/null +++ b/packages/zero-cache/src/types/state-version.test.ts @@ -0,0 +1,55 @@ +import {expect, test} from 'vitest'; +import { + majorVersionFromString, + majorVersionToString, + stateVersionFromString, + stateVersionToString, + type StateVersion, +} from './state-version.ts'; + +test.each([ + ['00', {major: 0n}], + ['01', {major: 1n}], + ['123', {major: 75n}], + ['01.00', {major: 1n, minor: 0n}], + ['01.123', {major: 1n, minor: 75n}], +] satisfies [string, StateVersion][])( + 'StateVersion: %s', + (str, ver: StateVersion) => { + expect(stateVersionFromString(str)).toEqual(ver); + expect(stateVersionToString(ver)).toEqual(str); + expect(majorVersionFromString(str)).toEqual(ver.major); + + if (ver.minor === undefined) { + expect(majorVersionToString(ver.major)).toBe(str); + } else { + expect(str.startsWith(majorVersionToString(ver.major) + '.')).toBe(true); + } + }, +); + +test('sorting', () => { + const vers = [ + {major: 75n}, + {major: 75n, minor: 1n}, + {major: 23n, minor: 100n}, + {major: 12n, minor: 1001n}, + {major: 23n, minor: 101n}, + {major: 12n, minor: 1n}, + {major: 12n, minor: 0n}, + {major: 12n}, + ]; + + expect( + vers.map(stateVersionToString).sort().map(stateVersionFromString), + ).toEqual([ + {major: 12n}, + {major: 12n, minor: 0n}, + {major: 12n, minor: 1n}, + {major: 12n, minor: 1001n}, + {major: 23n, minor: 100n}, + {major: 23n, minor: 101n}, + {major: 75n}, + {major: 75n, minor: 1n}, + ]); +}); diff --git a/packages/zero-cache/src/types/state-version.ts b/packages/zero-cache/src/types/state-version.ts new file mode 100644 index 0000000000..77b19f73b9 --- /dev/null +++ b/packages/zero-cache/src/types/state-version.ts @@ -0,0 +1,57 @@ +import {assert} from '../../../shared/src/asserts.ts'; +import {versionFromLexi, versionToLexi} from './lexi-version.ts'; + +/** + * Identifies the version of the data on the replica, corresponding to the + * stream of changes produced by the change-source and change-streamer. + * + * The `major` version directly tracks the watermark of the replication + * stream (e.g. the Postgres LSN). + * + * The `minor` version is optional and used to auxiliary state changes, + * such as writes from pending backfills. + * + * StateVersions are persisted and passed as lexicographically ordered + * strings, using the LexiVersion format for major and minor versions, + * separated by a dot. If there is no minor version, the StateVersion + * is represented by a single LexiVersion. + */ +export type StateVersion = { + major: bigint; + minor?: bigint | undefined; +}; + +type StateVersionInput = { + major: bigint | number; + minor?: bigint | number | undefined; +}; + +export function stateVersionFromString(ver: string): StateVersion { + if (!ver.includes('.')) { + return {major: versionFromLexi(ver)}; + } + const parts = ver.split('.'); + assert(parts.length === 2, () => `Invalid stateVersion ${ver}`); + return { + major: versionFromLexi(parts[0]), + minor: versionFromLexi(parts[1]), + }; +} + +export function stateVersionToString(ver: StateVersionInput) { + return ver.minor === undefined + ? versionToLexi(ver.major) + : `${versionToLexi(ver.major)}.${versionToLexi(ver.minor)}`; +} + +export function majorVersionFromString(ver: string): bigint { + if (!ver.includes('.')) { + return versionFromLexi(ver); + } + const {major} = stateVersionFromString(ver); + return major; +} + +export function majorVersionToString(major: number | bigint) { + return versionToLexi(major); +} From 3d8f80a9b07a03075dd9fb4694f97c8aa2798b83 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Tue, 3 Feb 2026 12:31:59 -0700 Subject: [PATCH 016/495] fix(zero-cache): view-syncer close race w/ changeDesiredQueries (#5506) We saw a race condition throwing `Database connection is not open` from a customer when view syncer is shutting down: When the view-syncer shuts down and closes the snapshotter SQLite connections while a `changeDesiredQueries` task is still running on the lock, `currentPermissions()` will still try to read from a closed DB and throws `TypeError: The database connection is not open`. The first commit to this branch is a test repro, and the second is a regression test + proposed fix. --- .../view-syncer/view-syncer.pg.test.ts | 66 ++++++++++++++++++- .../src/services/view-syncer/view-syncer.ts | 12 ++-- 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts index b6e195ffb6..e3f0f72988 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts @@ -7,6 +7,7 @@ import { type MockedFunction, vi, } from 'vitest'; +import {resolver} from '@rocicorp/resolver'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import type {Queue} from '../../../../shared/src/queue.ts'; import {sleep} from '../../../../shared/src/sleep.ts'; @@ -43,7 +44,7 @@ import type {ReplicaState} from '../replicator/replicator.ts'; import {updateReplicationWatermark} from '../replicator/schema/replication-state.ts'; import {type FakeReplicator} from '../replicator/test-utils.ts'; import {CVRStore} from './cvr-store.ts'; -import {CVRQueryDrivenUpdater} from './cvr.ts'; +import {CVRQueryDrivenUpdater, CVRUpdater} from './cvr.ts'; import type {DrainCoordinator} from './drain-coordinator.ts'; import {ttlClockFromNumber} from './ttl-clock.ts'; import { @@ -71,9 +72,15 @@ import { USERS_QUERY, } from './view-syncer-test-util.ts'; import type {ViewSyncerService} from './view-syncer.ts'; +import {ClientHandler} from './client-handler.ts'; +import {PipelineDriver} from './pipeline-driver.ts'; import {type SyncContext} from './view-syncer.ts'; describe('view-syncer/service', () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + let storageDB: Database; let replicaDbFile: DbFile; let replica: Database; @@ -4893,4 +4900,61 @@ describe('view-syncer/service', () => { `[ProtocolError: Reconnect required]`, ); }); + + test('stop waits for in-flight changeDesiredQueries', async () => { + // Bring pipelines into the synced state so changeDesiredQueries hits + // #syncQueryPipelineSet and currentPermissions. + const client = connect(SYNC_CONTEXT, [ + {op: 'put', hash: 'query-hash1', ast: ISSUES_QUERY}, + ]); + await nextPoke(client); + + stateChanges.push({state: 'version-ready'}); + await nextPoke(client); + + // Gate the CVR flush so we can stop while a config update is in-flight. + const {promise: flushStarted, resolve: signalFlushStarted} = + resolver(); + const allowFlush = resolver(); + const originalFlush = CVRUpdater.prototype.flush; + vi.spyOn(CVRUpdater.prototype, 'flush').mockImplementation(async function ( + this: CVRUpdater, + ...args: Parameters + ) { + signalFlushStarted(); + await allowFlush.promise; + return originalFlush.apply(this, args); + }); + const failSpy = vi.spyOn(ClientHandler.prototype, 'fail'); + let flushReleased = false; + let destroyCalledAfterRelease = false; + const originalDestroy = PipelineDriver.prototype.destroy; + const destroySpy = vi + .spyOn(PipelineDriver.prototype, 'destroy') + .mockImplementation(function (this: PipelineDriver) { + destroyCalledAfterRelease = flushReleased; + return originalDestroy.call(this); + }); + + // Start the config update; it will block on the flush gate. + const changePromise = vs.changeDesiredQueries(SYNC_CONTEXT, [ + 'changeDesiredQueries', + { + desiredQueriesPatch: [ + {op: 'put', hash: 'query-hash2', ast: USERS_QUERY}, + ], + }, + ]); + + await flushStarted; + const stopPromise = vs.stop(); + flushReleased = true; + allowFlush.resolve(); + await Promise.all([stopPromise, viewSyncerDone, changePromise]); + + // The in-flight update should finish without failing the client. + expect(failSpy).not.toHaveBeenCalled(); + expect(destroySpy).toHaveBeenCalled(); + expect(destroyCalledAfterRelease).toBe(true); + }); }); diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.ts index cfd7fb5b14..34609318ed 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.ts @@ -498,13 +498,13 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { if (this.#drainCoordinator.shouldDrain()) { this.#drainCoordinator.drainNextIn(this.#totalHydrationTimeMs()); } - this.#cleanup(); + await this.#cleanup(); } catch (e) { this.#lc[getLogLevel(e)]?.( `stopping view-syncer ${this.id}: ${String(e)}`, e, ); - this.#cleanup(e); + await this.#cleanup(e); } finally { // Always wait for the cvrStore to flush, regardless of how the service // was stopped. @@ -2015,11 +2015,10 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { return this.#stopped.promise; } - #cleanup(err?: unknown) { + async #cleanup(err?: unknown) { this.#stopTTLClockInterval(); this.#stopExpireTimer(); - this.#pipelines.destroy(); for (const client of this.#clients.values()) { if (err) { client.fail(err); @@ -2027,6 +2026,11 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { client.close(`closed clientGroupID=${this.id}`); } } + + // Wait for existing lock logic to complete before + // cleaning up the pipelines and closing db connections. + await this.#lock.withLock(() => {}); + this.#pipelines.destroy(); } /** From 3845684706864e480d61816882375db14221c66a Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Tue, 3 Feb 2026 12:35:13 -0700 Subject: [PATCH 017/495] fix(zero-cache): `deleteClients` from stale WebSocket crashes view-syncer (#5509) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `deleteClients` messages sent from a stale WebSocket can crash view-syncer. **Steps:** 1. Client connects (wsID A), then reconnects (wsID B). 2. A late `deleteClients` arrives from wsID A. 3. `#runInLockForClient` early‑returns on wsID mismatch, leaving result unset. 4. `#runInLockForClient` cast undefined to array even when it could be undefined and caller reads `.length`. **Test Failure:** Screenshot 2026-02-03 at 9 49 03 AM Related to `Cannot read properties of undefined (reading 'length')` error in zbugs: https://rocicorp.slack.com/archives/C07RLKFNSF6/p1769897748417939 --- .../view-syncer/view-syncer.pg.test.ts | 71 +++++++++++++++++++ .../src/services/view-syncer/view-syncer.ts | 13 ++-- 2 files changed, 78 insertions(+), 6 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts index e3f0f72988..b0046e57fa 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts @@ -3074,6 +3074,77 @@ describe('view-syncer/service', () => { `); }); + test('ignores deleteClients from old wsID', async () => { + const ttl = 5000; // 5s + vi.setSystemTime(Date.UTC(2025, 2, 4)); + + const {queue: client1} = connectWithQueueAndSource(SYNC_CONTEXT, [ + {op: 'put', hash: 'query-hash1', ast: ISSUES_QUERY, ttl}, + ]); + + const {queue: client2, source: connectSource2} = connectWithQueueAndSource( + {...SYNC_CONTEXT, clientID: 'bar', wsID: 'ws2'}, + [{op: 'put', hash: 'query-hash2', ast: USERS_QUERY, ttl}], + ); + + await nextPoke(client1); + await nextPoke(client2); + + stateChanges.push({state: 'version-ready'}); + + await nextPoke(client1); + await nextPoke(client1); + + await nextPoke(client2); + await nextPoke(client2); + + connectSource2.cancel(); + + const deletedClientIDs = await vs.deleteClients( + {...SYNC_CONTEXT, wsID: 'old-wsid'}, + ['deleteClients', {clientIDs: ['bar']}], + ); + + expect(deletedClientIDs).toEqual([]); + await expectNoPokes(client1); + + expect( + await cvrDB`SELECT "clientID" from "this_app_2/cvr".clients`, + ).toMatchInlineSnapshot( + ` + Result [ + { + "clientID": "foo", + }, + { + "clientID": "bar", + }, + ] + `, + ); + + expect( + await cvrDB`SELECT "clientID", "deleted", "queryHash", "ttl", "inactivatedAt" from "this_app_2/cvr".desires`, + ).toMatchInlineSnapshot(` + Result [ + { + "clientID": "foo", + "deleted": false, + "inactivatedAt": null, + "queryHash": "query-hash1", + "ttl": "00:00:05", + }, + { + "clientID": "bar", + "deleted": false, + "inactivatedAt": null, + "queryHash": "query-hash2", + "ttl": "00:00:05", + }, + ] + `); + }); + test('activeClients inactivates queries from inactive clients', async () => { const ttl = 5000; // 5s vi.setSystemTime(Date.UTC(2025, 5, 30)); diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.ts index 34609318ed..494efe35ad 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.ts @@ -764,12 +764,13 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { ctx: SyncContext, msg: DeleteClientsMessage, ): Promise { - return await this.#runInLockForClient( + const deletedClientIDs = await this.#runInLockForClient( ctx, [msg[0], {deleted: msg[1]}], (lc, clientID, msg: Partial, cvr) => this.#handleConfigUpdate(lc, clientID, msg, cvr, 'missing'), ); + return deletedClientIDs ?? []; } #getTTLClock(now: number): TTLClock { @@ -785,7 +786,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { ); this.#ttlClock = ttlClock; this.#ttlClockBase = now; - return ttlClock as TTLClock; + return ttlClock; } #flushUpdater(lc: LogContext, updater: CVRUpdater): Promise { @@ -891,7 +892,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { cvr: CVRSnapshot, ) => Promise, newClient?: ClientHandler, - ): Promise { + ): Promise { this.#lc.debug?.('viewSyncer.#runInLockForClient'); const {clientID, wsID} = ctx; const [cmd, body] = msg; @@ -949,7 +950,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { throw e; } } - return result as R; + return result; }, ); } @@ -1981,8 +1982,8 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { }); } - inspect(context: SyncContext, msg: InspectUpMessage): Promise { - return this.#runInLockForClient(context, msg, this.#handleInspect); + async inspect(context: SyncContext, msg: InspectUpMessage): Promise { + await this.#runInLockForClient(context, msg, this.#handleInspect); } // oxlint-disable-next-line require-await From 11deff3bec683fd81a7f7777ebcae1a99fe9c783 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Tue, 3 Feb 2026 12:57:27 -1000 Subject: [PATCH 018/495] Change Zero version *down* to 0.25.13 The maintenance branch we created for 0.25.x just ended up having almost everything from main in it. Will delete maintenance branch after and we can do future versions of 0.25 from trunk until there's a reason not to. --- apps/zbugs/package.json | 4 +- package-lock.json | 1460 +++++++++--------------------------- packages/zero/package.json | 4 +- 3 files changed, 359 insertions(+), 1109 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 6b5c37d557..93e8fb1578 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -44,7 +44,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.0", + "@rocicorp/zero": "0.25.13", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.10.9", "classnames": "^2.5.1", @@ -98,4 +98,4 @@ "vitest": "4.0.15" }, "prettier": "@rocicorp/prettier-config" -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 71a36da753..591f106c62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.0", + "@rocicorp/zero": "0.25.13", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.10.9", "classnames": "^2.5.1", @@ -196,6 +196,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -223,6 +224,7 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -382,6 +384,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -484,7 +487,6 @@ "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -700,6 +702,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -1763,6 +1766,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2116,7 +2120,6 @@ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -2133,7 +2136,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2147,7 +2149,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2163,7 +2164,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2173,8 +2173,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -2182,7 +2181,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -2193,7 +2191,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -2204,7 +2201,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2312,7 +2308,6 @@ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2331,7 +2326,6 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2360,7 +2354,6 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2374,7 +2367,6 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2388,7 +2380,6 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2402,7 +2393,6 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2419,7 +2409,6 @@ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2448,7 +2437,6 @@ "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2465,7 +2453,6 @@ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2512,7 +2499,6 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2526,7 +2512,6 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2555,7 +2540,6 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2569,7 +2553,6 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2583,7 +2566,6 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2597,7 +2579,6 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2611,7 +2592,6 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2625,7 +2605,6 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2639,7 +2618,6 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2656,7 +2634,6 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2975,7 +2952,6 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -3903,7 +3879,6 @@ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -4130,6 +4105,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -4152,6 +4128,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -6668,6 +6645,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6883,6 +6861,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7395,6 +7374,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7496,7 +7476,8 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.6", @@ -8410,7 +8391,6 @@ "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -8422,7 +8402,6 @@ "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -8445,7 +8424,6 @@ "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -8469,7 +8447,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8488,7 +8465,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -8499,7 +8475,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8516,7 +8491,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8533,8 +8507,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/config/node_modules/@babel/code-frame": { "version": "7.10.4", @@ -8542,7 +8515,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8553,7 +8525,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8572,7 +8543,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -8583,7 +8553,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8600,7 +8569,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8618,7 +8586,6 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8630,7 +8597,6 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8641,7 +8607,6 @@ "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8656,7 +8621,6 @@ "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -8679,8 +8643,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/fingerprint/node_modules/brace-expansion": { "version": "2.0.2", @@ -8688,7 +8651,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8699,7 +8661,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8716,7 +8677,6 @@ "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8736,7 +8696,6 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8747,7 +8706,6 @@ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -8761,7 +8719,6 @@ "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -8773,7 +8730,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8784,7 +8740,6 @@ "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -8805,7 +8760,6 @@ "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -8827,7 +8781,6 @@ "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -8842,7 +8795,6 @@ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -8858,7 +8810,6 @@ "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -8870,16 +8821,14 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8887,7 +8836,6 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8900,16 +8848,14 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/xcpretty": { "version": "4.3.2", @@ -8917,7 +8863,6 @@ "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -8934,7 +8879,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8945,7 +8889,6 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8963,7 +8906,6 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8980,7 +8922,6 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9631,7 +9572,6 @@ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -9645,7 +9585,6 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -9656,7 +9595,6 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9674,7 +9612,6 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -9685,7 +9622,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9696,7 +9632,6 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9711,7 +9646,6 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9726,7 +9660,6 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9740,7 +9673,6 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9757,7 +9689,6 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9770,7 +9701,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -9781,7 +9711,6 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9795,7 +9724,6 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9812,7 +9740,6 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9843,7 +9770,6 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9871,7 +9797,6 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10200,6 +10125,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10322,6 +10248,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10555,6 +10482,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -10651,6 +10579,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12579,6 +12508,7 @@ "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.2.0" }, @@ -12966,7 +12896,6 @@ "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -12977,7 +12906,6 @@ "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -12992,7 +12920,6 @@ "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -13053,7 +12980,6 @@ "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -13077,7 +13003,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13099,7 +13024,6 @@ "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -13131,7 +13055,6 @@ "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13142,7 +13065,6 @@ "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -13167,7 +13089,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13185,7 +13106,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13196,7 +13116,6 @@ "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13207,7 +13126,6 @@ "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -13222,7 +13140,6 @@ "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -13246,7 +13163,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13264,7 +13180,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13275,7 +13190,6 @@ "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13286,7 +13200,6 @@ "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13296,8 +13209,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-stately/utils": { "version": "3.10.4", @@ -13712,6 +13624,7 @@ "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -13934,7 +13847,6 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -13945,7 +13857,6 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -14942,6 +14853,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15075,6 +14987,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/virtual-core": "3.10.9" }, @@ -15193,6 +15106,7 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15592,7 +15506,6 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*" } @@ -15733,6 +15646,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15766,6 +15680,7 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -15823,6 +15738,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -15973,8 +15889,7 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -16046,7 +15961,6 @@ "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -16058,7 +15972,6 @@ "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -16338,6 +16251,7 @@ "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -16361,6 +16275,7 @@ "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -16716,7 +16631,6 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -16837,6 +16751,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16922,6 +16837,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16983,6 +16899,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -17024,8 +16941,7 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", @@ -17318,8 +17234,7 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", @@ -17422,8 +17337,7 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/async-listen": { "version": "3.0.0", @@ -17565,7 +17479,6 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -17614,7 +17527,6 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -17633,7 +17545,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17655,7 +17566,6 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17671,7 +17581,6 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -17774,7 +17683,6 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -17784,8 +17692,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.29.1", @@ -17793,7 +17700,6 @@ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.29.1" } @@ -17804,7 +17710,6 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -17815,7 +17720,6 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -17843,7 +17747,6 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -18075,7 +17978,6 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -18089,7 +17991,6 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -18356,7 +18257,6 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -18367,7 +18267,6 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -18426,6 +18325,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -18446,7 +18346,6 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -18624,7 +18523,6 @@ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -18638,7 +18536,6 @@ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -18649,7 +18546,6 @@ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -18902,7 +18798,6 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -18931,7 +18826,6 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19030,7 +18924,6 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -19043,7 +18936,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "peer": true, "engines": { "node": ">=6" }, @@ -19089,7 +18981,6 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -20350,6 +20241,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -20589,7 +20481,6 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -21013,7 +20904,6 @@ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "dotenv": "^16.4.5" }, @@ -21392,7 +21282,6 @@ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -21411,7 +21300,6 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -21490,6 +21378,7 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22189,8 +22078,7 @@ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/execa": { "version": "5.1.1", @@ -22239,7 +22127,6 @@ "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -22258,7 +22145,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -22269,7 +22155,6 @@ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=20.16.0" } @@ -22279,8 +22164,7 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/express": { "version": "4.22.1", @@ -22639,7 +22523,6 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", - "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -22653,7 +22536,6 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bser": "2.1.1" } @@ -22937,8 +22819,7 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -22965,8 +22846,7 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/for-each": { "version": "0.3.5", @@ -23063,7 +22943,6 @@ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -23282,7 +23161,6 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -23364,7 +23242,6 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -24000,16 +23877,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.29.1", @@ -24017,7 +23892,6 @@ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.29.1" } @@ -24057,6 +23931,7 @@ "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -24502,7 +24377,6 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -24748,7 +24622,6 @@ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -25123,7 +24996,6 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -25141,7 +25013,6 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -25217,7 +25088,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -25236,7 +25106,6 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25247,7 +25116,6 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -25274,7 +25142,6 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -25296,7 +25163,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25310,7 +25176,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25325,8 +25190,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-mock": { "version": "29.7.0", @@ -25334,7 +25198,6 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -25350,7 +25213,6 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25378,7 +25240,6 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -25397,7 +25258,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25411,7 +25271,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25426,8 +25285,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-worker": { "version": "29.7.0", @@ -25464,8 +25322,7 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jiti": { "version": "1.21.0", @@ -25544,8 +25401,7 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/jsdom": { "version": "26.1.0", @@ -25674,8 +25530,7 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -25779,7 +25634,6 @@ "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -25903,7 +25757,6 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -25915,7 +25768,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -25925,8 +25777,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lightningcss": { "version": "1.30.2", @@ -25972,7 +25823,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25994,7 +25844,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26016,7 +25865,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26038,7 +25886,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26060,7 +25907,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26082,7 +25928,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26104,7 +25949,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26126,7 +25970,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26148,7 +25991,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26170,7 +26012,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26192,7 +26033,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26295,8 +26135,7 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -26310,7 +26149,6 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -26324,7 +26162,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -26338,7 +26175,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26354,7 +26190,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -26364,8 +26199,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -26373,7 +26207,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -26384,7 +26217,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -26395,7 +26227,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -26532,6 +26363,7 @@ "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -26565,7 +26397,6 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -26626,8 +26457,7 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -27016,8 +26846,7 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge-anything": { "version": "5.1.7", @@ -27073,7 +26902,6 @@ "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -27129,7 +26957,6 @@ "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -27146,7 +26973,6 @@ "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -27163,7 +26989,6 @@ "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27177,7 +27002,6 @@ "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -27198,7 +27022,6 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -27209,7 +27032,6 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -27226,7 +27048,6 @@ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -27241,7 +27062,6 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -27256,7 +27076,6 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -27271,7 +27090,6 @@ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -27282,7 +27100,6 @@ "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27298,7 +27115,6 @@ "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27320,7 +27136,6 @@ "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27335,7 +27150,6 @@ "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27349,7 +27163,6 @@ "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27364,7 +27177,6 @@ "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27387,7 +27199,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27398,7 +27209,6 @@ "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27420,7 +27230,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27431,7 +27240,6 @@ "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27450,7 +27258,6 @@ "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27475,8 +27282,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", @@ -27484,7 +27290,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -27495,7 +27300,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -27509,7 +27313,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27520,7 +27323,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28537,6 +28339,7 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.x" } @@ -28594,7 +28397,8 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/mri": { "version": "1.2.0", @@ -28639,6 +28443,7 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -28752,8 +28557,7 @@ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", @@ -28884,8 +28688,7 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.27", @@ -28934,7 +28737,6 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -28951,7 +28753,6 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -28964,8 +28765,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -29053,8 +28853,7 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nwsapi": { "version": "2.2.22", @@ -29089,7 +28888,6 @@ "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29276,7 +29074,6 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -29295,7 +29092,6 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -29306,7 +29102,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -29320,7 +29115,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29336,7 +29130,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -29346,8 +29139,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -29355,7 +29147,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -29366,7 +29157,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -29377,7 +29167,6 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -29391,7 +29180,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -29487,6 +29275,7 @@ "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -29522,7 +29311,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -29647,7 +29435,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -29832,7 +29619,6 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -29904,7 +29690,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -29995,6 +29780,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -30225,6 +30011,7 @@ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "playwright-core": "1.53.2" }, @@ -30256,7 +30043,6 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -30272,7 +30058,6 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } @@ -30319,6 +30104,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31455,6 +31241,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31624,7 +31411,6 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -31714,6 +31500,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -31756,7 +31543,6 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -31804,7 +31590,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -31815,7 +31600,6 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -32049,7 +31833,6 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -32075,7 +31858,6 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -32225,6 +32007,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32238,7 +32021,6 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -32250,7 +32032,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -32272,6 +32053,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32346,6 +32128,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -32420,6 +32203,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -33136,7 +32920,6 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, - "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -33152,7 +32935,6 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-parse": "^1.0.5" } @@ -33204,7 +32986,6 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "global-dirs": "^0.1.1" }, @@ -33218,7 +32999,6 @@ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -33245,8 +33025,7 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/resolve.exports": { "version": "2.0.3", @@ -33254,7 +33033,6 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -33280,7 +33058,6 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -33295,7 +33072,6 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -33306,7 +33082,6 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -33385,6 +33160,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33593,6 +33369,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -33790,7 +33567,6 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -33809,6 +33585,7 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -34176,7 +33953,6 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -34266,7 +34042,6 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -34351,6 +34126,7 @@ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -34556,7 +34332,6 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -34570,7 +34345,6 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -34587,8 +34361,7 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -34596,7 +34369,6 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34610,7 +34382,6 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -34641,7 +34412,6 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -34813,8 +34583,7 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/style-to-js": { "version": "1.1.21", @@ -34900,7 +34669,6 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -35011,6 +34779,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35157,7 +34926,6 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -35168,7 +34936,6 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -35185,6 +34952,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -35391,8 +35159,7 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/throttleit": { "version": "2.1.0", @@ -35494,6 +35261,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -35555,8 +35323,7 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -35733,13 +35500,15 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.20.5", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -35913,7 +35682,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -36025,6 +35793,7 @@ "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 18" }, @@ -36729,7 +36498,6 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -36808,6 +36576,7 @@ "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -37053,8 +36822,7 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -37075,7 +36843,6 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -37108,7 +36875,6 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -37124,6 +36890,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -37542,8 +37309,7 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "4.0.0", @@ -37571,7 +37337,6 @@ "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -37587,7 +37352,6 @@ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=8" } @@ -37729,8 +37493,7 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/wordwrapjs": { "version": "5.1.0", @@ -37811,6 +37574,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -37871,7 +37635,6 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -37886,7 +37649,6 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -37931,7 +37693,6 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -37946,7 +37707,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" } @@ -37957,7 +37717,6 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -38046,7 +37805,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -38185,7 +37943,6 @@ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", - "peer": true, "peerDependencies": { "zod": "^3.24.1" } @@ -38517,6 +38274,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -38617,7 +38375,6 @@ "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -38706,7 +38463,6 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -38717,7 +38473,6 @@ "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -38740,7 +38495,6 @@ "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -38764,7 +38518,6 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -38788,7 +38541,6 @@ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -38827,7 +38579,6 @@ "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -38850,7 +38601,6 @@ "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -38877,7 +38627,6 @@ "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -38888,7 +38637,6 @@ "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -38903,7 +38651,6 @@ "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -38964,7 +38711,6 @@ "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -38987,7 +38733,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -39000,7 +38745,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -39022,7 +38766,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39036,7 +38779,6 @@ "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -39068,7 +38810,6 @@ "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39079,7 +38820,6 @@ "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -39104,7 +38844,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39127,7 +38866,6 @@ "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39138,7 +38876,6 @@ "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -39153,7 +38890,6 @@ "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -39177,7 +38913,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -39188,7 +38923,6 @@ "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39199,7 +38933,6 @@ "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39209,8 +38942,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/@react-native/virtualized-lists": { "version": "0.83.1", @@ -39218,7 +38950,6 @@ "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -39243,7 +38974,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -39256,8 +38986,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/babel-preset-expo": { "version": "54.0.10", @@ -39265,7 +38994,6 @@ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -39310,7 +39038,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -39321,7 +39048,6 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -39332,7 +39058,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -39397,7 +39122,6 @@ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -39414,7 +39138,6 @@ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -39430,7 +39153,6 @@ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -39458,7 +39180,6 @@ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -39470,7 +39191,6 @@ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -39488,7 +39208,6 @@ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -39518,7 +39237,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -39537,7 +39255,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -39553,16 +39270,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/lru-cache": { "version": "11.2.4", @@ -39570,7 +39285,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -39581,7 +39295,6 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -39637,7 +39350,6 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -39654,7 +39366,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -39665,7 +39376,6 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -39682,7 +39392,6 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39696,7 +39405,6 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -39717,7 +39425,6 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -39733,7 +39440,6 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -39755,7 +39461,6 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -39770,7 +39475,6 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39784,7 +39488,6 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -39799,7 +39502,6 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -39822,7 +39524,6 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -39844,7 +39545,6 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -39863,7 +39563,6 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -39888,8 +39587,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/metro/node_modules/hermes-parser": { "version": "0.32.0", @@ -39897,7 +39595,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -39908,7 +39605,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39931,7 +39627,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -39942,7 +39637,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -39956,7 +39650,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -39973,7 +39666,6 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -39987,7 +39679,6 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40001,7 +39692,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -40019,7 +39709,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -40037,7 +39726,6 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -40065,7 +39753,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -40081,7 +39768,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -40107,8 +39793,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native": { "version": "0.83.1", @@ -40176,7 +39861,6 @@ "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -40198,8 +39882,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -40207,7 +39890,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -40218,7 +39900,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -40230,7 +39911,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -40242,7 +39922,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40264,7 +39943,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40275,7 +39953,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -40289,7 +39966,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40311,16 +39987,14 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/source-map": { "version": "0.5.7", @@ -40328,7 +40002,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -40339,7 +40012,6 @@ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -40371,7 +40043,6 @@ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -40382,7 +40053,6 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -40480,7 +40150,7 @@ }, "packages/zero": { "name": "@rocicorp/zero", - "version": "0.26.0", + "version": "0.25.13", "license": "Apache-2.0", "dependencies": { "@badrap/valita": "0.3.11", @@ -40914,7 +40584,6 @@ "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -41004,7 +40673,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41022,7 +40690,6 @@ "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -41045,7 +40712,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41063,7 +40729,6 @@ "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -41102,7 +40767,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41120,7 +40784,6 @@ "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -41143,7 +40806,6 @@ "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -41170,7 +40832,6 @@ "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -41193,7 +40854,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41206,7 +40866,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41228,7 +40887,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41239,7 +40897,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41253,7 +40910,6 @@ "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -41277,8 +40933,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/babel-preset-expo": { "version": "54.0.4", @@ -41286,7 +40941,6 @@ "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -41331,7 +40985,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -41382,7 +41035,6 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -41393,7 +41045,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -41458,7 +41109,6 @@ "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -41475,7 +41125,6 @@ "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -41491,7 +41140,6 @@ "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -41519,7 +41167,6 @@ "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -41531,7 +41178,6 @@ "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -41593,8 +41239,7 @@ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/minimatch": { "version": "9.0.5", @@ -41602,7 +41247,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -41619,7 +41263,6 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -41651,7 +41294,6 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -41679,7 +41321,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -41701,7 +41342,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -41715,7 +41355,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -41731,7 +41370,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -41755,8 +41393,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native": { "version": "0.82.0", @@ -41823,8 +41460,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -41832,7 +41468,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -41843,7 +41478,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41856,7 +41490,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41878,7 +41511,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41889,7 +41521,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41903,7 +41534,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -41925,16 +41555,14 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/tar": { "version": "7.5.1", @@ -41942,7 +41570,6 @@ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -41974,7 +41601,6 @@ "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -42121,7 +41747,6 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -42492,7 +42117,6 @@ "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, - "peer": true, "requires": {} }, "@ai-sdk/gateway": { @@ -42632,6 +42256,7 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", + "peer": true, "requires": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -43466,6 +43091,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -43707,7 +43333,6 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, - "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -43720,7 +43345,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -43730,7 +43354,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -43742,7 +43365,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -43751,29 +43373,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -43837,7 +43455,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, - "peer": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -43849,7 +43466,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43865,7 +43481,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43875,7 +43490,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43885,7 +43499,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -43895,7 +43508,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -43905,7 +43517,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43923,7 +43534,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43933,7 +43543,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43959,7 +43568,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -43969,7 +43577,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43987,7 +43594,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -43997,7 +43603,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44007,7 +43612,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44017,7 +43621,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44027,7 +43630,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44037,7 +43639,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44047,7 +43648,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44057,7 +43657,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44236,7 +43835,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -44806,7 +44404,6 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -44931,12 +44528,14 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "peer": true }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -45970,6 +45569,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -46134,6 +45734,7 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", + "peer": true, "requires": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -46492,7 +46093,8 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "peer": true }, "which": { "version": "4.0.0", @@ -46553,7 +46155,8 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true + "dev": true, + "peer": true }, "@electric-sql/pglite-socket": { "version": "0.0.6", @@ -46964,7 +46567,6 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, - "peer": true, "requires": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -46975,7 +46577,6 @@ "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -46997,7 +46598,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47007,7 +46607,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47018,15 +46617,13 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47036,7 +46633,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47049,7 +46645,6 @@ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, - "peer": true, "requires": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -47072,7 +46667,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47083,15 +46677,13 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47101,7 +46693,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47113,15 +46704,13 @@ "version": "54.0.10", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true, - "peer": true + "dev": true }, "@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, - "peer": true, "requires": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -47132,7 +46721,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "peer": true, "requires": { "ms": "^2.1.1" } @@ -47144,7 +46732,6 @@ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, - "peer": true, "requires": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -47158,7 +46745,6 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -47177,15 +46763,13 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -47195,7 +46779,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -47207,7 +46790,6 @@ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -47225,15 +46807,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "peer": true + "dev": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, - "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -47245,7 +46825,6 @@ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -47256,7 +46835,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47268,7 +46846,6 @@ "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, - "peer": true, "requires": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -47280,7 +46857,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, - "peer": true, "requires": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -47301,7 +46877,6 @@ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -47312,7 +46887,6 @@ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, - "peer": true, "requires": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -47327,7 +46901,6 @@ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, - "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -47338,22 +46911,19 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true, - "peer": true + "dev": true }, "@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true, - "peer": true + "dev": true }, "@expo/spawn-async": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.3" } @@ -47362,22 +46932,19 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true, - "peer": true + "dev": true }, "@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true, - "peer": true + "dev": true }, "@expo/xcpretty": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -47390,7 +46957,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47400,7 +46966,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -47411,7 +46976,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -47421,7 +46985,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -47925,7 +47488,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "peer": true, "requires": { "minipass": "^7.0.4" } @@ -47934,15 +47496,13 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true, - "peer": true + "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "peer": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -47956,7 +47516,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -47965,15 +47524,13 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true + "dev": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -47984,7 +47541,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -47995,7 +47551,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -48005,7 +47560,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "peer": true, "requires": { "p-try": "^2.0.0" } @@ -48015,7 +47569,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -48026,15 +47579,13 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "peer": true + "dev": true }, "@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3" } @@ -48044,7 +47595,6 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "peer": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -48057,7 +47607,6 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -48080,7 +47629,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -48104,7 +47652,6 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -48328,6 +47875,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "peer": true, "requires": { "@types/mdx": "^2.0.0" } @@ -48421,7 +47969,8 @@ "@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "peer": true }, "@noble/curves": { "version": "1.8.1", @@ -48600,7 +48149,8 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "peer": true }, "@opentelemetry/api-logs": { "version": "0.203.0", @@ -48675,6 +48225,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -49815,6 +49366,7 @@ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, + "peer": true, "requires": { "@prisma/client-runtime-utils": "7.2.0" } @@ -50116,15 +49668,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -50135,7 +49685,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -50189,7 +49738,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50205,7 +49753,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50222,7 +49769,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, - "peer": true, "requires": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -50237,15 +49783,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true, - "peer": true + "dev": true }, "@react-native/dev-middleware": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -50266,7 +49810,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50277,7 +49820,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50288,15 +49830,13 @@ "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true, - "peer": true + "dev": true }, "@react-native/debugger-shell": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -50307,7 +49847,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -50327,7 +49866,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50338,7 +49876,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50349,22 +49886,19 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/js-polyfills": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/normalize-colors": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true, - "peer": true + "dev": true }, "@react-stately/utils": { "version": "3.10.4", @@ -50485,7 +50019,6 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -50558,7 +50091,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50571,7 +50103,6 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, - "peer": true, "requires": { "chalk": "^4.1.2" }, @@ -50581,7 +50112,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50594,7 +50124,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -50624,7 +50153,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50637,7 +50165,6 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -50656,7 +50183,6 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, - "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -50671,7 +50197,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50687,7 +50212,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -50698,7 +50222,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50713,7 +50236,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -50723,7 +50245,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -50735,7 +50256,6 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -50745,15 +50265,13 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "babel-preset-expo": { "version": "54.0.4", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, - "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -50784,7 +50302,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -50814,15 +50331,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true + "dev": true }, "commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true + "dev": true }, "expo": { "version": "54.0.13", @@ -50859,7 +50374,6 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, - "peer": true, "requires": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -50870,7 +50384,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -50881,7 +50394,6 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, - "peer": true, "requires": {} }, "expo-font": { @@ -50899,7 +50411,6 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, - "peer": true, "requires": {} }, "expo-modules-core": { @@ -50907,7 +50418,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4" } @@ -50939,15 +50449,13 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -50957,7 +50465,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "peer": true, "requires": { "minipass": "^7.1.2" } @@ -50971,15 +50478,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true + "dev": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -50990,8 +50495,7 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51000,7 +50504,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -51011,8 +50514,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51027,8 +50529,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true }, "react-native": { "version": "0.82.0", @@ -51078,15 +50579,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -51096,7 +50595,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51107,7 +50605,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51122,7 +50619,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51132,7 +50628,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51142,7 +50637,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51158,22 +50652,19 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true + "dev": true }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true, - "peer": true + "dev": true }, "tar": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, - "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -51192,8 +50683,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true, - "peer": true + "dev": true }, "vite": { "version": "7.2.7", @@ -51239,8 +50729,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51435,6 +50924,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -51610,7 +51100,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "peer": true, "requires": { "type-detect": "4.0.8" } @@ -51620,7 +51109,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "peer": true, "requires": { "@sinonjs/commons": "^3.0.0" } @@ -52272,6 +51760,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "requires": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -52354,6 +51843,7 @@ "version": "3.10.9", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", + "peer": true, "requires": { "@tanstack/virtual-core": "3.10.9" } @@ -52430,6 +51920,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -52774,7 +52265,6 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "peer": true, "requires": { "@types/node": "*" } @@ -52901,6 +52391,7 @@ "version": "22.18.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "peer": true, "requires": { "undici-types": "~6.21.0" }, @@ -52932,6 +52423,7 @@ "version": "8.15.4", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", + "peer": true, "requires": { "@types/node": "*", "pg-protocol": "*", @@ -52982,6 +52474,7 @@ "version": "18.3.23", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -53120,8 +52613,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true + "dev": true }, "@types/strip-ansi": { "version": "3.0.0", @@ -53184,7 +52676,6 @@ "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -53195,7 +52686,6 @@ "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, - "peer": true, "requires": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -53403,6 +52893,7 @@ "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, + "peer": true, "requires": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -53427,6 +52918,7 @@ "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, + "peer": true, "requires": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -53684,8 +53176,7 @@ "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "peer": true + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -53774,7 +53265,8 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "peer": true }, "acorn-import-attributes": { "version": "1.9.5", @@ -53827,6 +53319,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -53870,6 +53363,7 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", + "peer": true, "requires": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -53924,8 +53418,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "peer": true + "dev": true }, "ansi-align": { "version": "3.0.1", @@ -54126,8 +53619,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true + "dev": true }, "asn1": { "version": "0.2.6", @@ -54220,8 +53712,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "peer": true + "dev": true }, "async-listen": { "version": "3.0.0", @@ -54305,7 +53796,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "peer": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -54338,7 +53828,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -54352,7 +53841,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -54367,7 +53855,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "peer": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -54381,7 +53868,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -54459,7 +53945,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, - "peer": true, "requires": { "@babel/types": "^7.26.0" } @@ -54468,15 +53953,13 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.29.1" } @@ -54486,7 +53969,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, - "peer": true, "requires": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -54496,7 +53978,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, - "peer": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -54520,7 +54001,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "peer": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -54670,7 +54150,6 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, - "peer": true, "requires": { "open": "^8.0.4" } @@ -54679,8 +54158,7 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "peer": true + "dev": true }, "big.js": { "version": "5.2.2", @@ -54860,7 +54338,6 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, - "peer": true, "requires": { "stream-buffers": "2.2.x" } @@ -54870,7 +54347,6 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, - "peer": true, "requires": { "big-integer": "1.6.x" } @@ -54902,6 +54378,7 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "peer": true, "requires": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -54915,7 +54392,6 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "peer": true, "requires": { "node-int64": "^0.4.0" } @@ -55026,7 +54502,6 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, - "peer": true, "requires": { "callsites": "^2.0.0" }, @@ -55035,8 +54510,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -55045,7 +54519,6 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, - "peer": true, "requires": { "caller-callsite": "^2.0.0" } @@ -55205,7 +54678,6 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, - "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55223,7 +54695,6 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, - "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55292,7 +54763,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, - "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -55301,8 +54771,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "peer": true + "dev": true }, "cli-table3": { "version": "0.6.5", @@ -55346,8 +54815,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "peer": true + "dev": true }, "clone-deep": { "version": "4.0.1", @@ -56147,7 +55615,8 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "peer": true }, "d3-timer": { "version": "3.0.1", @@ -56318,7 +55787,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "peer": true, "requires": { "clone": "^1.0.2" } @@ -56604,7 +56072,6 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, - "peer": true, "requires": { "dotenv": "^16.4.5" } @@ -56790,8 +56257,7 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true, - "peer": true + "dev": true }, "error-ex": { "version": "1.3.2", @@ -56806,7 +56272,6 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, - "peer": true, "requires": { "stackframe": "^1.3.4" } @@ -56860,6 +56325,7 @@ "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "peer": true, "requires": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", @@ -57232,8 +56698,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true, - "peer": true + "dev": true }, "execa": { "version": "5.1.1", @@ -57267,7 +56732,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -57281,8 +56745,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -57290,15 +56753,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true, - "peer": true + "dev": true }, "exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "peer": true + "dev": true }, "express": { "version": "4.22.1", @@ -57568,15 +57029,13 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true, - "peer": true + "dev": true }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "peer": true, "requires": { "bser": "2.1.1" } @@ -57765,8 +57224,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true, - "peer": true + "dev": true }, "follow-redirects": { "version": "1.15.11", @@ -57777,8 +57235,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true, - "peer": true + "dev": true }, "for-each": { "version": "0.3.5", @@ -57835,8 +57292,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true, - "peer": true + "dev": true }, "fresh": { "version": "0.5.2", @@ -57989,8 +57445,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "peer": true + "dev": true }, "get-port": { "version": "7.1.0", @@ -58040,8 +57495,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true, - "peer": true + "dev": true }, "giget": { "version": "2.0.0", @@ -58484,22 +57938,19 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true, - "peer": true + "dev": true }, "hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true, - "peer": true + "dev": true }, "hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.29.1" } @@ -58536,7 +57987,8 @@ "version": "4.10.6", "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true + "dev": true, + "peer": true }, "hpack.js": { "version": "2.1.6", @@ -58830,7 +58282,6 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, - "peer": true, "requires": { "queue": "6.0.2" } @@ -58991,8 +58442,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "peer": true + "dev": true }, "is-docker": { "version": "2.2.1", @@ -59209,7 +58659,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -59222,8 +58671,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59280,7 +58728,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "peer": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -59294,15 +58741,13 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "peer": true + "dev": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -59323,7 +58768,6 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -59340,15 +58784,13 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59359,8 +58801,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59369,7 +58810,6 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -59380,8 +58820,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "peer": true + "dev": true }, "jest-util": { "version": "29.7.0", @@ -59401,7 +58840,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -59415,15 +58853,13 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59434,8 +58870,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59464,8 +58899,7 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true, - "peer": true + "dev": true }, "jiti": { "version": "1.21.0", @@ -59529,8 +58963,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true, - "peer": true + "dev": true }, "jsdom": { "version": "26.1.0", @@ -59623,8 +59056,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "peer": true + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -59707,8 +59139,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true, - "peer": true + "dev": true }, "latest-version": { "version": "7.0.0", @@ -59801,7 +59232,6 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, - "peer": true, "requires": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -59812,7 +59242,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "requires": { "ms": "2.0.0" } @@ -59821,8 +59250,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59852,88 +59280,77 @@ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-freebsd-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-x64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-x64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-win32-arm64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-win32-x64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lilconfig": { "version": "2.1.0", @@ -60021,8 +59438,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "peer": true + "dev": true }, "lodash.uniq": { "version": "4.5.0", @@ -60034,7 +59450,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, - "peer": true, "requires": { "chalk": "^2.0.1" }, @@ -60044,7 +59459,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -60054,7 +59468,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -60066,7 +59479,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -60075,29 +59487,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -60187,6 +59595,7 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, + "peer": true, "requires": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -60212,7 +59621,6 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "peer": true, "requires": { "tmpl": "1.0.5" } @@ -60250,8 +59658,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true, - "peer": true + "dev": true }, "math-intrinsics": { "version": "1.1.0", @@ -60540,8 +59947,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true, - "peer": true + "dev": true }, "merge-anything": { "version": "5.1.7", @@ -60577,7 +59983,6 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -60625,22 +60030,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "peer": true, "requires": { "mime-db": "1.52.0" } @@ -60649,15 +60051,13 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -60667,7 +60067,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -60680,7 +60079,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, - "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -60693,7 +60091,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60703,7 +60100,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, - "peer": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -60720,7 +60116,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -60730,7 +60125,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, - "peer": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -60743,7 +60137,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, - "peer": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -60754,7 +60147,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -60765,7 +60157,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "peer": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -60775,8 +60166,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60785,7 +60175,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -60797,7 +60186,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, - "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -60815,7 +60203,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -60826,7 +60213,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60836,7 +60222,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -60847,7 +60232,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -60865,8 +60249,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60875,7 +60258,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -60889,8 +60271,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60899,7 +60280,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -60914,7 +60294,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61549,7 +60928,8 @@ "version": "15.10.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true + "dev": true, + "peer": true }, "graphql-subscriptions": { "version": "1.2.1", @@ -61592,7 +60972,8 @@ "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "peer": true }, "mri": { "version": "1.2.0", @@ -61623,6 +61004,7 @@ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, + "peer": true, "requires": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -61703,8 +61085,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true, - "peer": true + "dev": true }, "netmask": { "version": "2.0.2", @@ -61795,8 +61176,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "peer": true + "dev": true }, "node-releases": { "version": "2.0.27", @@ -61826,7 +61206,6 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, - "peer": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -61839,7 +61218,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "peer": true, "requires": { "lru-cache": "^10.0.1" } @@ -61848,8 +61226,7 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -61910,8 +61287,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "peer": true + "dev": true }, "nwsapi": { "version": "2.2.22", @@ -61937,7 +61313,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -62057,7 +61432,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, - "peer": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -62071,15 +61445,13 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -62089,7 +61461,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -62101,7 +61472,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -62110,29 +61480,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -62142,7 +61508,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -62225,6 +61590,7 @@ "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.8.5.tgz", "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", "dev": true, + "peer": true, "requires": { "@oxlint-tsgolint/darwin-arm64": "0.8.5", "@oxlint-tsgolint/darwin-x64": "0.8.5", @@ -62249,7 +61615,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -62323,8 +61688,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true + "dev": true }, "pac-proxy-agent": { "version": "7.2.0", @@ -62461,7 +61825,6 @@ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, - "peer": true, "requires": { "pngjs": "^3.3.0" } @@ -62514,8 +61877,7 @@ "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, - "peer": true + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -62582,6 +61944,7 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -62744,6 +62107,7 @@ "version": "1.53.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", + "peer": true, "requires": { "fsevents": "2.3.2", "playwright-core": "1.53.2" @@ -62759,7 +62123,6 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, - "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -62770,8 +62133,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true, - "peer": true + "dev": true }, "portfinder": { "version": "1.0.38", @@ -62792,6 +62154,7 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -63419,6 +62782,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -63516,8 +62880,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "peer": true + "dev": true }, "pretty-error": { "version": "4.0.0", @@ -63574,6 +62937,7 @@ "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", "dev": true, + "peer": true, "requires": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -63592,8 +62956,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "peer": true + "dev": true }, "process": { "version": "0.11.10", @@ -63628,15 +62991,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "peer": true + "dev": true }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, - "peer": true, "requires": { "asap": "~2.0.6" } @@ -63806,8 +63167,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true, - "peer": true + "dev": true }, "qs": { "version": "6.14.0", @@ -63822,7 +63182,6 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, - "peer": true, "requires": { "inherits": "~2.0.3" } @@ -63922,6 +63281,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -63931,7 +63291,6 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, - "peer": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -63942,7 +63301,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -63951,6 +63309,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -63999,6 +63358,7 @@ "version": "npm:@docusaurus/react-loadable@6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "peer": true, "requires": { "@types/react": "*" } @@ -64045,6 +63405,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "peer": true, "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -64548,7 +63909,6 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -64620,7 +63980,6 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, - "peer": true, "requires": { "node-forge": "^1.3.3" } @@ -64630,7 +63989,6 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, - "peer": true, "requires": { "chalk": "^4.1.2" } @@ -64640,7 +63998,6 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -64660,7 +64017,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, - "peer": true, "requires": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -64683,7 +64039,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -64713,7 +64068,6 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -64732,7 +64086,6 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, - "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -64746,15 +64099,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true, - "peer": true + "dev": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -64765,7 +64116,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -64819,7 +64169,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -64835,7 +64184,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -64846,7 +64194,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -64861,7 +64208,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -64873,7 +64219,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, - "peer": true, "requires": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -64888,15 +64233,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true, - "peer": true + "dev": true }, "@react-native/dev-middleware": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -64917,7 +64260,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -64926,15 +64268,13 @@ "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true, - "peer": true + "dev": true }, "@react-native/debugger-shell": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -64945,7 +64285,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -64965,7 +64304,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -64976,29 +64314,25 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true, - "peer": true + "dev": true }, "@react-native/js-polyfills": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true, - "peer": true + "dev": true }, "@react-native/normalize-colors": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true, - "peer": true + "dev": true }, "@react-native/virtualized-lists": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -65008,22 +64342,19 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "babel-preset-expo": { "version": "54.0.10", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, - "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -65054,7 +64385,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -65063,15 +64393,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true + "dev": true }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true + "dev": true }, "expo": { "version": "54.0.32", @@ -65108,7 +64436,6 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, - "peer": true, "requires": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -65119,7 +64446,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -65130,7 +64456,6 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, - "peer": true, "requires": {} }, "expo-font": { @@ -65148,7 +64473,6 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, - "peer": true, "requires": {} }, "expo-modules-autolinking": { @@ -65156,7 +64480,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -65170,7 +64493,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4" } @@ -65189,7 +64511,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -65201,7 +64522,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -65212,29 +64532,25 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true, - "peer": true + "dev": true }, "hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true + "dev": true }, "lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -65282,15 +64598,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": true }, "hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65300,7 +64614,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -65310,7 +64623,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -65323,7 +64635,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65335,7 +64646,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, - "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -65348,7 +64658,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65358,7 +64667,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, - "peer": true, "requires": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -65375,7 +64683,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -65387,7 +64694,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, - "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -65405,7 +64711,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -65416,7 +64721,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65426,7 +64730,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -65437,7 +64740,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -65456,7 +64758,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -65471,7 +64772,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65486,7 +64786,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65507,15 +64806,13 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "peer": true, "requires": { "mime-db": "1.52.0" } @@ -65525,7 +64822,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -65535,7 +64831,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "peer": true, "requires": { "minipass": "^7.1.2" } @@ -65545,7 +64840,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65555,7 +64849,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -65566,7 +64859,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -65576,15 +64868,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true + "dev": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -65596,7 +64886,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -65614,8 +64903,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true }, "react-native": { "version": "0.83.1", @@ -65666,7 +64954,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -65681,15 +64968,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -65699,7 +64984,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -65709,15 +64993,13 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true + "dev": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -65732,7 +65014,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65742,7 +65023,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65752,7 +65032,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -65761,29 +65040,25 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true + "dev": true }, "scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, - "peer": true + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true }, "tar": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, - "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -65802,15 +65077,13 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true, - "peer": true + "dev": true }, "yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -65880,7 +65153,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "peer": true }, "typescript": { "version": "5.9.3", @@ -65933,7 +65207,6 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, - "peer": true, "requires": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -65945,7 +65218,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, - "peer": true, "requires": { "path-parse": "^1.0.5" } @@ -65982,7 +65254,6 @@ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, - "peer": true, "requires": { "global-dirs": "^0.1.1" }, @@ -65992,7 +65263,6 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, - "peer": true, "requires": { "ini": "^1.3.4" } @@ -66013,15 +65283,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true, - "peer": true + "dev": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "peer": true + "dev": true }, "responselike": { "version": "3.0.0", @@ -66036,7 +65304,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, - "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -66046,15 +65313,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "peer": true + "dev": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, - "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -66108,6 +65373,7 @@ "version": "4.46.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "peer": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", @@ -66238,6 +65504,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -66372,8 +65639,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true, - "peer": true + "dev": true }, "serialize-javascript": { "version": "6.0.2", @@ -66387,7 +65653,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true + "dev": true, + "peer": true }, "seroval-plugins": { "version": "1.1.1", @@ -66686,7 +65953,6 @@ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, - "peer": true, "requires": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -66754,8 +66020,7 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true, - "peer": true + "dev": true }, "smart-buffer": { "version": "4.2.0", @@ -66819,6 +66084,7 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, + "peer": true, "requires": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -66982,7 +66248,6 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "peer": true, "requires": { "escape-string-regexp": "^2.0.0" }, @@ -66991,8 +66256,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "peer": true + "dev": true } } }, @@ -67006,15 +66270,13 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "peer": true + "dev": true }, "stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, - "peer": true, "requires": { "type-fest": "^0.7.1" }, @@ -67023,8 +66285,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -67047,8 +66308,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "peer": true + "dev": true }, "stream-shift": { "version": "1.0.3", @@ -67167,8 +66427,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true, - "peer": true + "dev": true }, "style-to-js": { "version": "1.1.21", @@ -67231,7 +66490,6 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, - "peer": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -67308,6 +66566,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, + "peer": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -67416,15 +66675,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "peer": true + "dev": true }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, - "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -67434,6 +66691,7 @@ "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -67581,8 +66839,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "peer": true + "dev": true }, "throttleit": { "version": "2.1.0", @@ -67642,7 +66899,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "peer": true } } }, @@ -67682,8 +66940,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "peer": true + "dev": true }, "to-regex-range": { "version": "5.0.1", @@ -67786,12 +67043,14 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "peer": true }, "tsx": { "version": "4.20.5", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "peer": true, "requires": { "esbuild": "~0.25.0", "fsevents": "~2.3.3", @@ -67897,8 +67156,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true + "dev": true }, "type-fest": { "version": "4.41.0", @@ -67989,6 +67247,7 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, + "peer": true, "requires": {} }, "typescript": { @@ -68398,8 +67657,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "peer": true + "dev": true }, "value-equal": { "version": "1.0.1", @@ -68466,6 +67724,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fsevents": "~2.3.3", @@ -68560,8 +67819,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "peer": true + "dev": true }, "w3c-xmlserializer": { "version": "5.0.0", @@ -68577,7 +67835,6 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "peer": true, "requires": { "makeerror": "1.0.12" } @@ -68604,7 +67861,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "peer": true, "requires": { "defaults": "^1.0.3" } @@ -68618,6 +67874,7 @@ "version": "5.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -68881,8 +68138,7 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true, - "peer": true + "dev": true }, "whatwg-mimetype": { "version": "4.0.0", @@ -68904,7 +68160,6 @@ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, - "peer": true, "requires": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -68915,8 +68170,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -69007,8 +68261,7 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true, - "peer": true + "dev": true }, "wordwrapjs": { "version": "5.1.0", @@ -69066,6 +68319,7 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "peer": true, "requires": {} }, "wsl-utils": { @@ -69096,7 +68350,6 @@ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, - "peer": true, "requires": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -69106,8 +68359,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -69135,7 +68387,6 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, - "peer": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -69145,8 +68396,7 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -69154,8 +68404,7 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "peer": true + "dev": true }, "xmlchars": { "version": "2.2.0", @@ -69212,8 +68461,7 @@ "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, - "peer": true + "dev": true }, "z2s": { "version": "file:packages/z2s", @@ -69247,7 +68495,7 @@ "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", "@rocicorp/prettier-config": "^0.4.0", - "@rocicorp/zero": "0.26.0", + "@rocicorp/zero": "0.25.13", "@schickling/fps-meter": "^0.1.2", "@tailwindcss/forms": "^0.5.0", "@tanstack/react-virtual": "^3.10.9", @@ -69332,7 +68580,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true }, "typescript": { "version": "5.9.3", @@ -69345,6 +68594,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -69650,7 +68900,6 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, - "peer": true, "requires": {} }, "zql": { @@ -69774,7 +69023,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true }, "typescript": { "version": "5.9.3", diff --git a/packages/zero/package.json b/packages/zero/package.json index ca974512fe..834890f57b 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero", - "version": "0.26.0", + "version": "0.25.13", "description": "Zero is a web framework for serverless web development.", "author": "Rocicorp, Inc.", "repository": { @@ -198,4 +198,4 @@ "!*.tsbuildinfo" ], "prettier": "@rocicorp/prettier-config" -} +} \ No newline at end of file From 845f3b45fa92921d6c29afee3412e0c18cccc517 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Tue, 3 Feb 2026 13:04:11 -1000 Subject: [PATCH 019/495] format --- packages/zero/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zero/package.json b/packages/zero/package.json index 834890f57b..032ab74066 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -198,4 +198,4 @@ "!*.tsbuildinfo" ], "prettier": "@rocicorp/prettier-config" -} \ No newline at end of file +} From 1bd835d414155cb7f6e00fe38dcbf64f9b043c52 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Tue, 3 Feb 2026 13:07:09 -1000 Subject: [PATCH 020/495] Revert "format This reverts commit 845f3b45fa92921d6c29afee3412e0c18cccc517. --- packages/zero/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zero/package.json b/packages/zero/package.json index 032ab74066..834890f57b 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -198,4 +198,4 @@ "!*.tsbuildinfo" ], "prettier": "@rocicorp/prettier-config" -} +} \ No newline at end of file From 2cf5e08baa41db90933649aac547aefc34d59b24 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 3 Feb 2026 23:12:01 -0800 Subject: [PATCH 021/495] fix(zero-cache): restore schemaVersions table for rollback safety (#5517) Restore the `schemaVersions` table (previously removed in the decommissioning of the schemaVersions logic in https://github.com/rocicorp/mono/pull/5363) for rollback safety. Once a release that no longer reads the table is fully rolled out, the table can be dropped in the subsequent release. --- apps/zbugs/package.json | 2 +- .../change-source/pg/schema/init.pg.test.ts | 13 +++++-- .../services/change-source/pg/schema/init.ts | 38 +++++++++++++------ packages/zero/package.json | 2 +- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 93e8fb1578..45972758cc 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -98,4 +98,4 @@ "vitest": "4.0.15" }, "prettier": "@rocicorp/prettier-config" -} \ No newline at end of file +} diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts index 6e79c7faba..e1002e25a6 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts @@ -21,8 +21,8 @@ const SHARD_NUM = 23; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 12, - schemaVersion: 12, + dataVersion: 13, + schemaVersion: 13, minSafeVersion: 1, lock: 'v', } as const; @@ -121,7 +121,7 @@ describe('change-streamer/pg/schema/init', () => { }, }, { - name: 'v5 to v7', + name: 'Migration from v5', upstreamSetup: ` CREATE SCHEMA ${APP_ID}_${SHARD_NUM}; CREATE TABLE ${APP_ID}_${SHARD_NUM}."shardConfig" ( @@ -159,6 +159,13 @@ describe('change-streamer/pg/schema/init', () => { ddlDetection: true, }, ], + [`${APP_ID}_${SHARD_NUM}.schemaVersions`]: [ + { + lock: true, + minSupportedVersion: 1, + maxSupportedVersion: 1, + }, + ], [`${APP_ID}_${SHARD_NUM}.replicas`]: [ { slot: `${APP_ID}_${SHARD_NUM}`, diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.ts index ba952ac3a7..385a7b8082 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.ts @@ -8,11 +8,7 @@ import { type Migration, } from '../../../../db/migration.ts'; import type {PostgresDB} from '../../../../types/pg.ts'; -import { - appSchema, - upstreamSchema, - type ShardConfig, -} from '../../../../types/shards.ts'; +import {upstreamSchema, type ShardConfig} from '../../../../types/shards.ts'; import {id} from '../../../../types/sql.ts'; import {AutoResetSignal} from '../../../change-streamer/schema/tables.ts'; import {decommissionShard} from '../decommission.ts'; @@ -195,12 +191,9 @@ function getIncrementalMigrations( }, }, - 11: { - migrateSchema: async (lc, sql) => { - await sql`DROP TABLE IF EXISTS ${sql(appSchema(shard))}."schemaVersions"`; - lc.info?.(`Dropped legacy schemaVersions table`); - }, - }, + // Formerly dropped the schemaVersions table, but restored in the v13 + // migration for rollback safety. + 11: {}, // Upgrade DDL trigger to query schemaOID, needed information for auto-backfill. 12: { @@ -211,6 +204,29 @@ function getIncrementalMigrations( lc.info?.(`Upgraded DDL event triggers`); }, }, + + // Recreates the legacy schemaVersions table that was prematurely dropped + // in the (former) v11 migration. It needs to remain present for at least one + // release in order to be rollback safe. + // + // TODO: Drop the table once a release that no longer reads the table has + // been rolled out. + 13: { + migrateSchema: async (_, sql) => { + await sql` + CREATE TABLE IF NOT EXISTS ${sql(upstreamSchema(shard))}."schemaVersions" ( + "minSupportedVersion" INT4, + "maxSupportedVersion" INT4, + "lock" BOOL PRIMARY KEY DEFAULT true CHECK (lock) + );`; + await sql` + INSERT INTO ${sql(upstreamSchema(shard))}."schemaVersions" + ("lock", "minSupportedVersion", "maxSupportedVersion") + VALUES (true, 1, 1) + ON CONFLICT DO NOTHING; + `; + }, + }, }; } diff --git a/packages/zero/package.json b/packages/zero/package.json index 834890f57b..032ab74066 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -198,4 +198,4 @@ "!*.tsbuildinfo" ], "prettier": "@rocicorp/prettier-config" -} \ No newline at end of file +} From b630287f1f162b724df781915c083fe50a19d228 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Wed, 4 Feb 2026 13:19:16 -0500 Subject: [PATCH 022/495] feat(zql): scalar subquery API (#5511) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds the scalar subquery API but transforms it to `whereExists` under the hood. Future PRs will implement special handling of scalar subqueries on the server. ## Summary - Add scalar subquery support to ZQL, enabling `cmp('field', scalar(query, 'column'))` syntax for comparing a field against a single value from a subquery - Scalar subqueries rewrite to `EXISTS`/`NOT EXISTS` correlated subqueries internally in the IVM pipeline, and compile to standard `field = (SELECT col FROM ... LIMIT 1)` SQL in the z2s compiler - Only `=` and `IS NOT` operators are supported — `=` maps to `EXISTS`, `IS NOT` maps to `NOT EXISTS`, avoiding the surprising NULL semantics that `!=` would require (empty subquery → no match) ## Details **New API surface** (`ExpressionBuilder`): - `scalar(query, column)` creates a `ScalarReference` from any query - `cmp('field', scalar(...))` defaults to `=` - `cmp('field', 'IS NOT', scalar(...))` for negation - `not(cmp('field', scalar(...)))` flips `=` ↔ `IS NOT` - Invalid operators throw at runtime with a clear error message; TypeScript overloads prevent misuse at compile time **AST** (`zero-protocol`): - New `ScalarSubqueryCondition` node type with `op: '=' | 'IS NOT'` - Schema validation, ordering, flattening, and transform support **IVM builder** (`zql`): - `rewriteScalarSubquery()` converts scalar conditions to correlated subquery conditions before pipeline construction - `=` → `EXISTS(correlated)`, `IS NOT` → `NOT EXISTS(correlated)` **SQL compiler** (`z2s`): - `scalarSubquery()` emits `field op (SELECT col FROM table WHERE ... ORDER BY ... LIMIT 1)` ## Test plan - [x] Unit tests for AST generation (`query-impl.ast.test.ts`) — default `=`, explicit `IS NOT`, with where conditions, `and` combinator, `not()` negation - [x] Type-level tests (`query.test.ts`) — overload resolution, invalid operator rejection - [x] Builder tests — scalar rewrite to EXISTS/NOT EXISTS - [x] Integration test (`chinook.pg.test.ts`) — scalar subquery against PostgreSQL - [x] `npm run check-types` — full monorepo passes - [x] `npm run lint` — clean --- Note to self: how to sync resolved rows........... --- packages/ast-to-zql/src/ast-to-zql.test.ts | 118 ++++++++++ packages/ast-to-zql/src/ast-to-zql.ts | 26 +++ packages/z2s/src/compiler.ts | 33 +++ .../zero-cache/src/auth/read-authorizer.ts | 7 + .../src/client/protocol-version-url.test.ts | 2 +- packages/zero-protocol/src/ast.test.ts | 4 +- packages/zero-protocol/src/ast.ts | 48 +++- .../src/protocol-version.test.ts | 4 +- .../zero-protocol/src/protocol-version.ts | 3 +- .../src/chinook/chinook.pg.test.ts | 25 +++ .../src/chinook/planner-controlled.test.ts | 2 +- packages/zql/src/builder/builder.ts | 68 +++++- packages/zql/src/builder/filter.ts | 1 + packages/zql/src/planner/planner-builder.ts | 4 +- packages/zql/src/query/complete-ordering.ts | 6 + .../zql/src/query/expression-test-util.ts | 2 + packages/zql/src/query/expression.test.ts | 1 + packages/zql/src/query/expression.ts | 113 +++++++++- packages/zql/src/query/query-impl.ast.test.ts | 208 ++++++++++++++++++ packages/zql/src/query/query.test.ts | 34 +++ packages/zqlite/src/query-builder.ts | 2 +- packages/zqlite/src/sqlite-cost-model.ts | 3 +- 22 files changed, 689 insertions(+), 25 deletions(-) diff --git a/packages/ast-to-zql/src/ast-to-zql.test.ts b/packages/ast-to-zql/src/ast-to-zql.test.ts index 06a63b00bb..e139ebcfc0 100644 --- a/packages/ast-to-zql/src/ast-to-zql.test.ts +++ b/packages/ast-to-zql/src/ast-to-zql.test.ts @@ -637,6 +637,124 @@ test('EXISTS with order', () => { ); }); +test('scalar subquery with = operator', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + subquery: { + table: 'user', + }, + childField: 'id', + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".where(({cmp, scalar}) => cmp('ownerId', scalar(q => q, 'id')))"`, + ); +}); + +test('scalar subquery with IS NOT operator', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'scalarSubquery', + op: 'IS NOT', + parentField: 'ownerId', + subquery: { + table: 'user', + }, + childField: 'id', + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".where(({cmp, scalar}) => cmp('ownerId', 'IS NOT', scalar(q => q, 'id')))"`, + ); +}); + +test('scalar subquery with where clause in subquery', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + subquery: { + table: 'user', + where: { + type: 'simple', + left: {type: 'column', name: 'name'}, + op: '=', + right: {type: 'literal', value: 'Alice'}, + }, + }, + childField: 'id', + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".where(({cmp, scalar}) => cmp('ownerId', scalar(q => q.where('name', 'Alice'), 'id')))"`, + ); +}); + +test('scalar subquery inside AND combinator', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'and', + conditions: [ + { + type: 'simple', + left: {type: 'column', name: 'status'}, + op: '=', + right: {type: 'literal', value: 'open'}, + }, + { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + subquery: { + table: 'user', + }, + childField: 'id', + }, + ], + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".where('status', 'open').where(({cmp, scalar}) => cmp('ownerId', scalar(q => q, 'id')))"`, + ); +}); + +test('scalar subquery inside OR combinator', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'or', + conditions: [ + { + type: 'simple', + left: {type: 'column', name: 'status'}, + op: '=', + right: {type: 'literal', value: 'open'}, + }, + { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + subquery: { + table: 'user', + }, + childField: 'id', + }, + ], + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".where(({cmp, or, scalar}) => or(cmp('status', 'open'), cmp('ownerId', scalar(q => q, 'id'))))"`, + ); +}); + test('round trip', () => { const randomizer = generateMersenne53Randomizer(42); const rng = () => randomizer.next(); diff --git a/packages/ast-to-zql/src/ast-to-zql.ts b/packages/ast-to-zql/src/ast-to-zql.ts index dc4f8a550f..abf7fc1e84 100644 --- a/packages/ast-to-zql/src/ast-to-zql.ts +++ b/packages/ast-to-zql/src/ast-to-zql.ts @@ -10,6 +10,7 @@ import type { LiteralReference, Ordering, Parameter, + ScalarSubqueryCondition, SimpleCondition, ValuePosition, } from '../../zero-protocol/src/ast.ts'; @@ -85,6 +86,8 @@ function transformCondition( return transformLogicalCondition(condition, prefix, args); case 'correlatedSubquery': return transformExistsCondition(condition, prefix, args); + case 'scalarSubquery': + return transformScalarSubqueryCondition(condition, prefix, args); default: unreachable(condition); } @@ -202,6 +205,29 @@ function transformExistsCondition( return `not(exists('${relationship}')))`; } +function transformScalarSubqueryCondition( + condition: ScalarSubqueryCondition, + prefix: Prefix, + args: Args, +): string { + const subqueryCode = astToZQL(condition.subquery); + const scalarExpr = `scalar(q => q${subqueryCode}, '${condition.childField}')`; + + let cmpExpr: string; + if (condition.op === '=') { + cmpExpr = `cmp('${condition.parentField}', ${scalarExpr})`; + } else { + cmpExpr = `cmp('${condition.parentField}', '${condition.op}', ${scalarExpr})`; + } + + if (prefix === '.where') { + return `.where(({cmp, scalar}) => ${cmpExpr})`; + } + args.add('cmp'); + args.add('scalar'); + return cmpExpr; +} + // If the `exists` is applied against a junction edge, both hops will have the same alias and both hops will be exists conditions. function getNextExistsSubquery(related: CorrelatedSubquery): AST { if ( diff --git a/packages/z2s/src/compiler.ts b/packages/z2s/src/compiler.ts index 87cb24b83f..70ca02649c 100644 --- a/packages/z2s/src/compiler.ts +++ b/packages/z2s/src/compiler.ts @@ -17,6 +17,7 @@ import type { Correlation, LiteralReference, Ordering, + ScalarSubqueryCondition, SimpleCondition, ValuePosition, } from '../../zero-protocol/src/ast.ts'; @@ -304,6 +305,8 @@ function where( )})`; case 'correlatedSubquery': return exists(spec, condition, table); + case 'scalarSubquery': + return scalarSubquery(spec, condition, table); case 'simple': return simple(spec, condition, table); } @@ -346,6 +349,36 @@ function exists( } } +function scalarSubquery( + spec: Spec, + condition: ScalarSubqueryCondition, + parentTable: Table, +): SQLQuery { + const parentCol = colIdent(spec.server, { + table: parentTable, + zql: condition.parentField, + }); + + const subqueryTable = makeTable(spec, condition.subquery.table); + const childCol = colIdent(spec.server, { + table: subqueryTable, + zql: condition.childField, + }); + + const op = sql.__dangerous__rawValue(condition.op); + + const subqueryWhere = condition.subquery.where + ? sql`WHERE ${where(spec, condition.subquery.where, subqueryTable)}` + : sql``; + const subqueryOrderBy = orderBy( + spec, + condition.subquery.orderBy, + subqueryTable, + ); + + return sql`${parentCol} ${op} (SELECT ${childCol} FROM ${fromIdent(spec.server, subqueryTable)} ${subqueryWhere} ${subqueryOrderBy} LIMIT 1)`; +} + export function makeCorrelator( spec: Spec, parentFields: readonly QualifiedColumn[], diff --git a/packages/zero-cache/src/auth/read-authorizer.ts b/packages/zero-cache/src/auth/read-authorizer.ts index 84440e9871..07e23edd65 100644 --- a/packages/zero-cache/src/auth/read-authorizer.ts +++ b/packages/zero-cache/src/auth/read-authorizer.ts @@ -148,5 +148,12 @@ function transformCondition( }, }; } + case 'scalarSubquery': { + const query = transformQueryInternal(lc, cond.subquery, auth); + return { + ...cond, + subquery: query, + }; + } } } diff --git a/packages/zero-client/src/client/protocol-version-url.test.ts b/packages/zero-client/src/client/protocol-version-url.test.ts index 38d1b040bd..93d8ee5335 100644 --- a/packages/zero-client/src/client/protocol-version-url.test.ts +++ b/packages/zero-client/src/client/protocol-version-url.test.ts @@ -34,5 +34,5 @@ test('When the URL changes we need to update the protocol version', async () => // might not understand it. You may need to bump the PROTOCOL_VERSION and // update the expected values. expect(hash).toBe('10r2tfvet9a3s'); - expect(PROTOCOL_VERSION).toBe(45); + expect(PROTOCOL_VERSION).toBe(46); }); diff --git a/packages/zero-protocol/src/ast.test.ts b/packages/zero-protocol/src/ast.test.ts index 28b75a95ba..ae3dc10cd5 100644 --- a/packages/zero-protocol/src/ast.test.ts +++ b/packages/zero-protocol/src/ast.test.ts @@ -606,6 +606,6 @@ test('protocol version', () => { // If this test fails because the AST schema has changed such that // old code will not understand the new schema, bump the // PROTOCOL_VERSION and update the expected values. - expect(hash).toEqual('q4ltbplgffre'); - expect(PROTOCOL_VERSION).toBe(45); + expect(hash).toEqual('1b4tkghe24u7q'); + expect(PROTOCOL_VERSION).toBe(46); }); diff --git a/packages/zero-protocol/src/ast.ts b/packages/zero-protocol/src/ast.ts index 5a5bd9298d..8ebda7d8c9 100644 --- a/packages/zero-protocol/src/ast.ts +++ b/packages/zero-protocol/src/ast.ts @@ -125,11 +125,21 @@ export const correlatedSubqueryConditionSchema: v.Type = + v.readonlyObject({ + type: v.literal('scalarSubquery'), + op: v.literalUnion('=', 'IS NOT'), + parentField: v.string(), + subquery: v.lazy(() => astSchema), + childField: v.string(), + }); + export const conditionSchema: v.Type = v.union( simpleConditionSchema, v.lazy(() => conjunctionSchema), v.lazy(() => disjunctionSchema), correlatedSubqueryConditionSchema, + scalarSubqueryConditionSchema, ); const conjunctionSchema: v.Type = v.readonlyObject({ @@ -292,7 +302,8 @@ export type Condition = | SimpleCondition | Conjunction | Disjunction - | CorrelatedSubqueryCondition; + | CorrelatedSubqueryCondition + | ScalarSubqueryCondition; export type SimpleCondition = { readonly type: 'simple'; @@ -326,6 +337,14 @@ export type CorrelatedSubqueryCondition = { export type CorrelatedSubqueryConditionOperator = 'EXISTS' | 'NOT EXISTS'; +export type ScalarSubqueryCondition = { + type: 'scalarSubquery'; + op: '=' | 'IS NOT'; + parentField: string; + subquery: AST; + childField: string; +}; + interface ASTTransform { tableName(orig: string): string; columnName(origTable: string, origColumn: string): string; @@ -413,6 +432,13 @@ function transformWhere( subquery: transformAST(subquery, transform), }, }; + } else if (where.type === 'scalarSubquery') { + return { + ...where, + parentField: columnName(table, where.parentField), + childField: columnName(where.subquery.table, where.childField), + subquery: transformAST(where.subquery, transform), + }; } return { @@ -499,6 +525,20 @@ function cmpCondition(a: Condition, b: Condition): number { return -1; // Order correlatedSubquery before conjuctions/disjuctions } + if (a.type === 'scalarSubquery') { + if (b.type !== 'scalarSubquery') { + return -1; // Order scalarSubquery before conjunctions/disjunctions + } + return ( + compareUTF8(a.parentField, b.parentField) || + compareUTF8(a.childField, b.childField) || + compareUTF8MaybeNull(a.op, b.op) + ); + } + if (b.type === 'scalarSubquery') { + return 1; + } + const val = compareUTF8MaybeNull(a.type, b.type); if (val !== 0) { return val; @@ -551,7 +591,11 @@ function cmpRelated(a: CorrelatedSubquery, b: CorrelatedSubquery): number { * empty Conjunctions. */ function flattened(cond: Condition): Condition | undefined { - if (cond.type === 'simple' || cond.type === 'correlatedSubquery') { + if ( + cond.type === 'simple' || + cond.type === 'correlatedSubquery' || + cond.type === 'scalarSubquery' + ) { return cond; } const conditions = defined( diff --git a/packages/zero-protocol/src/protocol-version.test.ts b/packages/zero-protocol/src/protocol-version.test.ts index 362d681ffe..d3f9ba85f0 100644 --- a/packages/zero-protocol/src/protocol-version.test.ts +++ b/packages/zero-protocol/src/protocol-version.test.ts @@ -11,6 +11,6 @@ test('protocol version', () => { // If this test fails upstream or downstream schema has changed such that // old code will not understand the new schema, bump the // PROTOCOL_VERSION and update the expected values. - expect(hash).toEqual('145xgagl5c356'); - expect(PROTOCOL_VERSION).toBe(45); + expect(hash).toEqual('2yts97hw5kfv0'); + expect(PROTOCOL_VERSION).toBe(46); }); diff --git a/packages/zero-protocol/src/protocol-version.ts b/packages/zero-protocol/src/protocol-version.ts index 3d7c8b0ea4..534422cc48 100644 --- a/packages/zero-protocol/src/protocol-version.ts +++ b/packages/zero-protocol/src/protocol-version.ts @@ -51,7 +51,8 @@ import {assert} from '../../shared/src/asserts.ts'; // -- version 43 renames `plans` to `sqlitePlans`, `plannerEvents` to `joinPlans`, and `plannerDebug` option to `joinPlans` (0.25) // -- version 44 adds profileID to connection URL (0.25) // -- version 45 adds userPushHeaders and userQueryHeaders to initConnection (0.25) -export const PROTOCOL_VERSION = 45; +// -- version 46 adds scalarSubquery condition type to AST +export const PROTOCOL_VERSION = 46; /** * The minimum server-supported sync protocol version (i.e. the version diff --git a/packages/zql-integration-tests/src/chinook/chinook.pg.test.ts b/packages/zql-integration-tests/src/chinook/chinook.pg.test.ts index 2bbdca3780..0370963f08 100644 --- a/packages/zql-integration-tests/src/chinook/chinook.pg.test.ts +++ b/packages/zql-integration-tests/src/chinook/chinook.pg.test.ts @@ -144,6 +144,31 @@ describe( and(exists('invoiceLines'), exists('playlists')), ), }, + { + name: 'Scalar subquery: tracks for album by title', + createQuery: q => + q.track.where(({cmp, scalar}) => + cmp( + 'albumId', + scalar(q.album.where('title', 'Riot Act'), 'id'), + ), + ), + }, + // Note: IS NOT scalar subquery is not tested here because it rewrites to + // NOT EXISTS which is not supported on the memory backend. + { + name: 'Scalar subquery: with and combinator', + createQuery: q => + q.track.where(({and, cmp, scalar}) => + and( + cmp( + 'albumId', + scalar(q.album.where('title', 'Riot Act'), 'id'), + ), + cmp('name', 'LIKE', '%Mine%'), + ), + ), + }, { name: 'Prefix like', createQuery: q => q.album.where('title', 'LIKE', 'Riot%').limit(1), diff --git a/packages/zql-integration-tests/src/chinook/planner-controlled.test.ts b/packages/zql-integration-tests/src/chinook/planner-controlled.test.ts index df4ad0298d..6fca3cd61f 100644 --- a/packages/zql-integration-tests/src/chinook/planner-controlled.test.ts +++ b/packages/zql-integration-tests/src/chinook/planner-controlled.test.ts @@ -31,7 +31,7 @@ function normalizeFlipFlags(ast: AST): AST { } function normalizeConditionFlipFlags(condition: Condition): Condition { - if (condition.type === 'simple') { + if (condition.type === 'simple' || condition.type === 'scalarSubquery') { return condition; } diff --git a/packages/zql/src/builder/builder.ts b/packages/zql/src/builder/builder.ts index 758b979d37..87cd8c8727 100644 --- a/packages/zql/src/builder/builder.ts +++ b/packages/zql/src/builder/builder.ts @@ -14,6 +14,7 @@ import type { LiteralValue, Ordering, Parameter, + ScalarSubqueryCondition, SimpleCondition, ValuePosition, } from '../../../zero-protocol/src/ast.ts'; @@ -174,6 +175,12 @@ export function bindStaticParameters( }, }; } + if (condition.type === 'scalarSubquery') { + return { + ...condition, + subquery: visit(condition.subquery), + }; + } return { ...condition, conditions: condition.conditions.map(bindCondition), @@ -229,6 +236,7 @@ const PERMISSIONS_EXISTS_LIMIT = 1; export function assertNoNotExists(condition: Condition): void { switch (condition.type) { case 'simple': + case 'scalarSubquery': return; case 'correlatedSubquery': @@ -250,6 +258,45 @@ export function assertNoNotExists(condition: Condition): void { } } +function rewriteScalarSubqueryConditions(condition: Condition): Condition { + if (condition.type === 'scalarSubquery') { + return rewriteScalarSubquery(condition); + } + if (condition.type === 'and' || condition.type === 'or') { + return { + type: condition.type, + conditions: condition.conditions.map(rewriteScalarSubqueryConditions), + }; + } + return condition; +} + +function rewriteScalarSubquery(condition: ScalarSubqueryCondition): Condition { + const correlated: CorrelatedSubquery = { + correlation: { + parentField: [condition.parentField], + childField: [condition.childField], + }, + subquery: condition.subquery, + }; + + if (condition.op === '=') { + // field = (SELECT col FROM ...) rewrites to EXISTS with correlation + return { + type: 'correlatedSubquery', + related: correlated, + op: 'EXISTS', + }; + } + + // field IS NOT (SELECT col FROM ...) rewrites to NOT EXISTS with correlation + return { + type: 'correlatedSubquery', + related: correlated, + op: 'NOT EXISTS', + }; +} + function buildPipelineInternal( ast: AST, delegate: BuilderDelegate, @@ -261,6 +308,13 @@ function buildPipelineInternal( if (!source) { throw new Error(`Source not found: ${ast.table}`); } + + // Rewrite scalar subquery conditions to correlated subquery conditions + // before the rest of the pipeline processing. + if (ast.where) { + ast = {...ast, where: rewriteScalarSubqueryConditions(ast.where)}; + } + ast = uniquifyCorrelatedSubqueryConditionAliases(ast); if (!delegate.enableNotExists && ast.where) { @@ -478,7 +532,7 @@ function applyFilter( condition: Condition, delegate: BuilderDelegate, name: string, -) { +): FilterInput { switch (condition.type) { case 'and': return applyAnd(input, condition, delegate, name); @@ -488,6 +542,10 @@ function applyFilter( return applyCorrelatedSubqueryCondition(input, condition, delegate, name); case 'simple': return applySimpleCondition(input, delegate, condition); + case 'scalarSubquery': + // Scalar subqueries are rewritten to correlated subqueries before + // the filter pipeline is built, so this should not be reached. + throw new Error('Unexpected scalarSubquery in applyFilter'); } } @@ -566,7 +624,10 @@ export function groupSubqueryConditions(condition: Disjunction) { export function isNotAndDoesNotContainSubquery( condition: Condition, ): condition is NoSubqueryCondition { - if (condition.type === 'correlatedSubquery') { + if ( + condition.type === 'correlatedSubquery' || + condition.type === 'scalarSubquery' + ) { return false; } if (condition.type === 'simple') { @@ -731,7 +792,7 @@ function uniquifyCorrelatedSubqueryConditionAliases(ast: AST): AST { }); const uniquify = (cond: Condition): Condition => { - if (cond.type === 'simple') { + if (cond.type === 'simple' || cond.type === 'scalarSubquery') { return cond; } else if (cond.type === 'correlatedSubquery') { return uniquifyCorrelatedSubquery(cond); @@ -764,6 +825,7 @@ export function conditionIncludesFlippedSubqueryAtAnyLevel( conditionIncludesFlippedSubqueryAtAnyLevel(c), ); } + // simple and scalarSubquery don't have flips return false; } diff --git a/packages/zql/src/builder/filter.ts b/packages/zql/src/builder/filter.ts index 4bc487960e..24effdc789 100644 --- a/packages/zql/src/builder/filter.ts +++ b/packages/zql/src/builder/filter.ts @@ -170,6 +170,7 @@ export function transformFilters(filters: Condition | undefined): { case 'simple': return {filters, conditionsRemoved: false}; case 'correlatedSubquery': + case 'scalarSubquery': return {filters: undefined, conditionsRemoved: true}; case 'and': case 'or': { diff --git a/packages/zql/src/planner/planner-builder.ts b/packages/zql/src/planner/planner-builder.ts index 774db02bf9..3a2fddff55 100644 --- a/packages/zql/src/planner/planner-builder.ts +++ b/packages/zql/src/planner/planner-builder.ts @@ -107,6 +107,7 @@ function processCondition( ): Exclude { switch (condition.type) { case 'simple': + case 'scalarSubquery': return input; case 'and': return processAnd(condition, input, graph, model, parentTable, getPlanId); @@ -286,6 +287,7 @@ function hasCorrelatedSubquery(condition: Condition): boolean { if (condition.type === 'and' || condition.type === 'or') { return condition.conditions.some(hasCorrelatedSubquery); } + // simple and scalarSubquery don't contain correlated subqueries return false; } @@ -322,7 +324,7 @@ function applyToCondition( condition: Condition, flippedIds: Set, ): Condition { - if (condition.type === 'simple') { + if (condition.type === 'simple' || condition.type === 'scalarSubquery') { return condition; } diff --git a/packages/zql/src/query/complete-ordering.ts b/packages/zql/src/query/complete-ordering.ts index 34175b0ad5..465af6639e 100644 --- a/packages/zql/src/query/complete-ordering.ts +++ b/packages/zql/src/query/complete-ordering.ts @@ -62,6 +62,12 @@ function completeOrderingInCondition( }, }; } + if (condition.type === 'scalarSubquery') { + return { + ...condition, + subquery: completeOrdering(condition.subquery, getPrimaryKey), + }; + } condition.type satisfies 'and' | 'or'; return { ...condition, diff --git a/packages/zql/src/query/expression-test-util.ts b/packages/zql/src/query/expression-test-util.ts index fb71d58a21..bd886a6753 100644 --- a/packages/zql/src/query/expression-test-util.ts +++ b/packages/zql/src/query/expression-test-util.ts @@ -174,6 +174,8 @@ export function stringify(c: Condition): string { .join(c.type === 'and' ? ' & ' : ' | '); case 'correlatedSubquery': return c.op + ' ()'; + case 'scalarSubquery': + return `${c.parentField} ${c.op} (SCALAR)`; } } function eat(tokens: string[], expectedToken: string) { diff --git a/packages/zql/src/query/expression.test.ts b/packages/zql/src/query/expression.test.ts index 33345fc438..bea065cb34 100644 --- a/packages/zql/src/query/expression.test.ts +++ b/packages/zql/src/query/expression.test.ts @@ -203,6 +203,7 @@ test('compare test framework to real framework', () => { const check = (c: Condition): boolean => c.type === 'simple' || c.type === 'correlatedSubquery' || + c.type === 'scalarSubquery' || c.conditions.every(child => child.type !== c.type && check(child)); expect(check(actual)).toBe(true); }), diff --git a/packages/zql/src/query/expression.ts b/packages/zql/src/query/expression.ts index f19afe59f0..c933ce5a4d 100644 --- a/packages/zql/src/query/expression.ts +++ b/packages/zql/src/query/expression.ts @@ -2,12 +2,15 @@ import {must} from '../../../shared/src/must.ts'; import { toStaticParam, + SUBQ_PREFIX, + type AST, type Condition, type LiteralValue, type Parameter, type SimpleOperator, } from '../../../zero-protocol/src/ast.ts'; -import type {Schema} from '../../../zero-types/src/schema.ts'; +import type {Schema as ZeroSchema} from '../../../zero-types/src/schema.ts'; +import {asQueryInternals} from './query-internals.ts'; import type { AvailableRelationships, DestTableName, @@ -22,6 +25,24 @@ export type ParameterReference = { [toStaticParam](): Parameter; }; +export const toScalarRef = Symbol('toScalarRef'); + +export type ScalarReference = { + readonly [toScalarRef]: { + readonly ast: AST; + readonly column: string; + }; +}; + +export function isScalarReference(value: unknown): value is ScalarReference { + return ( + value !== null && + value !== undefined && + typeof value === 'object' && + toScalarRef in (value as Record) + ); +} + /** * A factory function that creates a condition. This is used to create * complex conditions that can be passed to the `where` method of a query. @@ -40,14 +61,14 @@ export type ParameterReference = { */ export interface ExpressionFactory< TTable extends keyof TSchema['tables'] & string, - TSchema extends Schema, + TSchema extends ZeroSchema, > { (eb: ExpressionBuilder): Condition; } export class ExpressionBuilder< TTable extends keyof TSchema['tables'] & string, - TSchema extends Schema, + TSchema extends ZeroSchema, > { readonly #exists: ( relationship: string, @@ -64,12 +85,19 @@ export class ExpressionBuilder< ) { this.#exists = exists; this.exists = this.exists.bind(this); + this.scalar = this.scalar.bind(this); } get eb() { return this; } + cmp< + TSelector extends NoCompoundTypeSelector>, + >(field: TSelector, op: '=' | 'IS NOT', value: ScalarReference): Condition; + cmp< + TSelector extends NoCompoundTypeSelector>, + >(field: TSelector, value: ScalarReference): Condition; cmp< TSelector extends NoCompoundTypeSelector>, TOperator extends SimpleOperator, @@ -92,8 +120,13 @@ export class ExpressionBuilder< ): Condition; cmp( field: string, - opOrValue: SimpleOperator | ParameterReference | LiteralValue | undefined, - value?: ParameterReference | LiteralValue | undefined, + opOrValue: + | SimpleOperator + | ParameterReference + | ScalarReference + | LiteralValue + | undefined, + value?: ParameterReference | ScalarReference | LiteralValue | undefined, ): Condition { if (arguments.length === 2) { return cmp(field, opOrValue); @@ -129,6 +162,25 @@ export class ExpressionBuilder< ) => Query, options?: ExistsOptions, ): Condition => this.#exists(relationship, cb, options); + + /** + * EXPERIMENTAL. Use at your own risk. + * Currently this has no benefit over `whereExists` + * In future versions, scalar subqueries will unlock query optimizations + * that are not possible with `whereExists` + */ + scalar = ( + query: Query, + column: string, + ): ScalarReference => { + const qi = asQueryInternals(query); + return { + [toScalarRef]: { + ast: {...qi.ast, limit: 1}, + column, + }, + }; + }; } export function and(...conditions: (Condition | undefined)[]): Condition { @@ -177,6 +229,11 @@ export function not(expression: Condition): Condition { related: expression.related, op: negateOperator(expression.op), }; + case 'scalarSubquery': + return { + ...expression, + op: expression.op === '=' ? 'IS NOT' : '=', + }; case 'simple': return { type: 'simple', @@ -189,15 +246,28 @@ export function not(expression: Condition): Condition { export function cmp( field: string, - opOrValue: SimpleOperator | ParameterReference | LiteralValue | undefined, - value?: ParameterReference | LiteralValue | undefined, + opOrValue: + | SimpleOperator + | ParameterReference + | ScalarReference + | LiteralValue + | undefined, + value?: ParameterReference | ScalarReference | LiteralValue | undefined, ): Condition { let op: SimpleOperator; - let actualValue: ParameterReference | LiteralValue | undefined; + let actualValue: + | ParameterReference + | ScalarReference + | LiteralValue + | undefined; if (arguments.length === 2) { // 2-arg form: cmp(field, value) - defaults to '=' operator - actualValue = opOrValue as ParameterReference | LiteralValue | undefined; + actualValue = opOrValue as + | ParameterReference + | ScalarReference + | LiteralValue + | undefined; op = '='; } else { // 3-arg form: cmp(field, op, value) @@ -205,6 +275,25 @@ export function cmp( actualValue = value; } + if (isScalarReference(actualValue)) { + if (op !== '=' && op !== 'IS NOT') { + throw new Error( + `Scalar subqueries only support '=' and 'IS NOT' operators, got '${op}'`, + ); + } + const subqueryAst = actualValue[toScalarRef].ast; + return { + type: 'scalarSubquery', + op, + parentField: field, + childField: actualValue[toScalarRef].column, + subquery: { + ...subqueryAst, + alias: subqueryAst.alias ?? `${SUBQ_PREFIX}scalar_${subqueryAst.table}`, + }, + }; + } + return { type: 'simple', left: {type: 'column', name: field}, @@ -245,7 +334,11 @@ function isAlwaysFalse(condition: Condition): boolean { } export function simplifyCondition(c: Condition): Condition { - if (c.type === 'simple' || c.type === 'correlatedSubquery') { + if ( + c.type === 'simple' || + c.type === 'correlatedSubquery' || + c.type === 'scalarSubquery' + ) { return c; } if (c.conditions.length === 1) { diff --git a/packages/zql/src/query/query-impl.ast.test.ts b/packages/zql/src/query/query-impl.ast.test.ts index 1b4fe89679..fde5d9381e 100644 --- a/packages/zql/src/query/query-impl.ast.test.ts +++ b/packages/zql/src/query/query-impl.ast.test.ts @@ -6,6 +6,8 @@ import {type AnyQuery} from './query.ts'; import {newStaticQuery} from './static-query.ts'; import {schema} from './test/test-schemas.ts'; +const userQuery = newQuery(schema, 'user'); + function ast(q: AnyQuery) { return asQueryInternals(q).ast; } @@ -2123,3 +2125,209 @@ test('one in schema should not imply limit 1 in the ast -- the user needs to get ], }); }); + +describe('scalar subquery via cmp + scalar', () => { + test('scalar with default = op', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect( + ast( + issueQuery.where(({cmp, scalar}) => + cmp('ownerId', scalar(userQuery, 'id')), + ), + ), + ).toMatchInlineSnapshot(` + { + "table": "issue", + "where": { + "childField": "id", + "op": "=", + "parentField": "ownerId", + "subquery": { + "alias": "zsubq_scalar_user", + "limit": 1, + "table": "user", + }, + "type": "scalarSubquery", + }, + } + `); + }); + + test('scalar with IS NOT op', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect( + ast( + issueQuery.where(({cmp, scalar}) => + cmp('ownerId', 'IS NOT', scalar(userQuery, 'id')), + ), + ), + ).toMatchInlineSnapshot(` + { + "table": "issue", + "where": { + "childField": "id", + "op": "IS NOT", + "parentField": "ownerId", + "subquery": { + "alias": "zsubq_scalar_user", + "limit": 1, + "table": "user", + }, + "type": "scalarSubquery", + }, + } + `); + }); + + test('scalar with where condition on subquery', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect( + ast( + issueQuery.where(({cmp, scalar}) => + cmp('ownerId', scalar(userQuery.where('name', 'Alice'), 'id')), + ), + ), + ).toMatchInlineSnapshot(` + { + "table": "issue", + "where": { + "childField": "id", + "op": "=", + "parentField": "ownerId", + "subquery": { + "alias": "zsubq_scalar_user", + "limit": 1, + "table": "user", + "where": { + "left": { + "name": "name", + "type": "column", + }, + "op": "=", + "right": { + "type": "literal", + "value": "Alice", + }, + "type": "simple", + }, + }, + "type": "scalarSubquery", + }, + } + `); + }); + + test('scalar with IS NOT and where condition', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect( + ast( + issueQuery.where(({cmp, scalar}) => + cmp( + 'ownerId', + 'IS NOT', + scalar(userQuery.where('name', 'Alice'), 'id'), + ), + ), + ), + ).toMatchInlineSnapshot(` + { + "table": "issue", + "where": { + "childField": "id", + "op": "IS NOT", + "parentField": "ownerId", + "subquery": { + "alias": "zsubq_scalar_user", + "limit": 1, + "table": "user", + "where": { + "left": { + "name": "name", + "type": "column", + }, + "op": "=", + "right": { + "type": "literal", + "value": "Alice", + }, + "type": "simple", + }, + }, + "type": "scalarSubquery", + }, + } + `); + }); + + test('scalar in and combinator', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect( + ast( + issueQuery.where(({and, cmp, scalar}) => + and( + cmp('ownerId', scalar(userQuery.where('name', 'Alice'), 'id')), + cmp('title', 'LIKE', '%bug%'), + ), + ), + ).where, + ).toMatchObject({ + type: 'and', + conditions: [ + { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'id', + }, + { + type: 'simple', + op: 'LIKE', + }, + ], + }); + }); + + test('not(cmp(..., scalar(...)))', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect( + ast( + issueQuery.where(({not, cmp, scalar}) => + not(cmp('ownerId', scalar(userQuery.where('name', 'Alice'), 'id'))), + ), + ), + ).toMatchInlineSnapshot(` + { + "table": "issue", + "where": { + "childField": "id", + "op": "IS NOT", + "parentField": "ownerId", + "subquery": { + "alias": "zsubq_scalar_user", + "limit": 1, + "table": "user", + "where": { + "left": { + "name": "name", + "type": "column", + }, + "op": "=", + "right": { + "type": "literal", + "value": "Alice", + }, + "type": "simple", + }, + }, + "type": "scalarSubquery", + }, + } + `); + }); +}); diff --git a/packages/zql/src/query/query.test.ts b/packages/zql/src/query/query.test.ts index fa6696ad3b..15db6eedb1 100644 --- a/packages/zql/src/query/query.test.ts +++ b/packages/zql/src/query/query.test.ts @@ -967,6 +967,40 @@ describe('Where expression factory and builder', () => { query.where(({not, exists}) => not(exists('self'))); }); + test('scalar', () => { + const query = mockQuery as unknown as Query< + 'testWithMoreRelationships', + Schema + >; + + const selfQuery = mockQuery as unknown as Query< + 'testWithMoreRelationships', + Schema + >; + + const testRelQuery = mockQuery as unknown as Query< + 'testWithRelationships', + Schema + >; + + const testQuery = mockQuery as unknown as Query<'test', Schema>; + + // scalar in cmp - valid destination table (self) + query.where(({cmp, scalar}) => cmp('s', scalar(selfQuery, 's'))); + + // scalar in cmp with IS NOT op + query.where(({cmp, scalar}) => cmp('s', 'IS NOT', scalar(selfQuery, 's'))); + + // scalar with a related table + query.where(({cmp, scalar}) => cmp('a', scalar(testRelQuery, 'a'))); + + // scalar with test table + query.where(({cmp, scalar}) => cmp('s', scalar(testQuery, 's'))); + + // not(cmp(..., scalar(...))) + query.where(({not, cmp, scalar}) => not(cmp('s', scalar(selfQuery, 's')))); + }); + describe('allow undefined terms', () => { test('and', () => { const query = mockQuery as unknown as Query<'test', Schema>; diff --git a/packages/zqlite/src/query-builder.ts b/packages/zqlite/src/query-builder.ts index 9e8d38af4f..2c39a23c85 100644 --- a/packages/zqlite/src/query-builder.ts +++ b/packages/zqlite/src/query-builder.ts @@ -19,7 +19,7 @@ import type {Start} from '../../zql/src/ivm/operator.ts'; */ export type NoSubqueryCondition = Exclude< Condition, - {type: 'correlatedSubquery'} + {type: 'correlatedSubquery'} | {type: 'scalarSubquery'} >; export function buildSelectQuery( diff --git a/packages/zqlite/src/sqlite-cost-model.ts b/packages/zqlite/src/sqlite-cost-model.ts index 8fbd64fd84..5c10e1906c 100644 --- a/packages/zqlite/src/sqlite-cost-model.ts +++ b/packages/zqlite/src/sqlite-cost-model.ts @@ -104,7 +104,8 @@ function removeCorrelatedSubqueries( ): NoSubqueryCondition | undefined { switch (condition.type) { case 'correlatedSubquery': - // Remove correlated subqueries - we can't estimate their cost via scanstatus + case 'scalarSubquery': + // Remove subqueries - we can't estimate their cost via scanstatus return undefined; case 'simple': return condition; From 1a27fe4aebe7fecc58a7dd305fb4ab105a0fbc7c Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Wed, 4 Feb 2026 08:51:41 -1000 Subject: [PATCH 023/495] Revert "Change Zero version *down* to 0.25.13" This reverts commit 11deff3bec683fd81a7f7777ebcae1a99fe9c783. --- apps/zbugs/package.json | 2 +- package-lock.json | 1460 +++++++++++++++++++++++++++--------- packages/zero/package.json | 2 +- 3 files changed, 1107 insertions(+), 357 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 45972758cc..6b5c37d557 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -44,7 +44,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.25.13", + "@rocicorp/zero": "0.26.0", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.10.9", "classnames": "^2.5.1", diff --git a/package-lock.json b/package-lock.json index 591f106c62..71a36da753 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.25.13", + "@rocicorp/zero": "0.26.0", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.10.9", "classnames": "^2.5.1", @@ -196,7 +196,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -224,7 +223,6 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -384,7 +382,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -487,6 +484,7 @@ "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -702,7 +700,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -1766,7 +1763,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2120,6 +2116,7 @@ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -2136,6 +2133,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2149,6 +2147,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2164,6 +2163,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2173,7 +2173,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -2181,6 +2182,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -2191,6 +2193,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -2201,6 +2204,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2308,6 +2312,7 @@ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2326,6 +2331,7 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2354,6 +2360,7 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2367,6 +2374,7 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2380,6 +2388,7 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2393,6 +2402,7 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2409,6 +2419,7 @@ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2437,6 +2448,7 @@ "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2453,6 +2465,7 @@ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2499,6 +2512,7 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2512,6 +2526,7 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2540,6 +2555,7 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2553,6 +2569,7 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2566,6 +2583,7 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2579,6 +2597,7 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2592,6 +2611,7 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2605,6 +2625,7 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2618,6 +2639,7 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2634,6 +2656,7 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2952,6 +2975,7 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -3879,6 +3903,7 @@ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -4105,7 +4130,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -4128,7 +4152,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -6645,7 +6668,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6861,7 +6883,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7374,7 +7395,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7476,8 +7496,7 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.6", @@ -8391,6 +8410,7 @@ "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -8402,6 +8422,7 @@ "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -8424,6 +8445,7 @@ "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -8447,6 +8469,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8465,6 +8488,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -8475,6 +8499,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8491,6 +8516,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8507,7 +8533,8 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/config/node_modules/@babel/code-frame": { "version": "7.10.4", @@ -8515,6 +8542,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8525,6 +8553,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8543,6 +8572,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -8553,6 +8583,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8569,6 +8600,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8586,6 +8618,7 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8597,6 +8630,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8607,6 +8641,7 @@ "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8621,6 +8656,7 @@ "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -8643,7 +8679,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/fingerprint/node_modules/brace-expansion": { "version": "2.0.2", @@ -8651,6 +8688,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8661,6 +8699,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8677,6 +8716,7 @@ "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8696,6 +8736,7 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8706,6 +8747,7 @@ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -8719,6 +8761,7 @@ "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -8730,6 +8773,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8740,6 +8784,7 @@ "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -8760,6 +8805,7 @@ "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -8781,6 +8827,7 @@ "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -8795,6 +8842,7 @@ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -8810,6 +8858,7 @@ "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -8821,14 +8870,16 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8836,6 +8887,7 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8848,14 +8900,16 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/xcpretty": { "version": "4.3.2", @@ -8863,6 +8917,7 @@ "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -8879,6 +8934,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8889,6 +8945,7 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8906,6 +8963,7 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8922,6 +8980,7 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9572,6 +9631,7 @@ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -9585,6 +9645,7 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -9595,6 +9656,7 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9612,6 +9674,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -9622,6 +9685,7 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9632,6 +9696,7 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9646,6 +9711,7 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9660,6 +9726,7 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9673,6 +9740,7 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9689,6 +9757,7 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9701,6 +9770,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -9711,6 +9781,7 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9724,6 +9795,7 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9740,6 +9812,7 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9770,6 +9843,7 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9797,6 +9871,7 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10125,7 +10200,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10248,7 +10322,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10482,7 +10555,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10579,7 +10651,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12508,7 +12579,6 @@ "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.2.0" }, @@ -12896,6 +12966,7 @@ "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -12906,6 +12977,7 @@ "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -12920,6 +12992,7 @@ "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -12980,6 +13053,7 @@ "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -13003,6 +13077,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13024,6 +13099,7 @@ "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -13055,6 +13131,7 @@ "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13065,6 +13142,7 @@ "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -13089,6 +13167,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13106,6 +13185,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13116,6 +13196,7 @@ "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13126,6 +13207,7 @@ "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -13140,6 +13222,7 @@ "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -13163,6 +13246,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13180,6 +13264,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13190,6 +13275,7 @@ "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13200,6 +13286,7 @@ "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13209,7 +13296,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@react-stately/utils": { "version": "3.10.4", @@ -13624,7 +13712,6 @@ "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -13847,6 +13934,7 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -13857,6 +13945,7 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -14853,7 +14942,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -14987,7 +15075,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", "license": "MIT", - "peer": true, "dependencies": { "@tanstack/virtual-core": "3.10.9" }, @@ -15106,7 +15193,6 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15506,6 +15592,7 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -15646,7 +15733,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15680,7 +15766,6 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -15738,7 +15823,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -15889,7 +15973,8 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -15961,6 +16046,7 @@ "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -15972,6 +16058,7 @@ "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -16251,7 +16338,6 @@ "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -16275,7 +16361,6 @@ "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -16631,6 +16716,7 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" } @@ -16751,7 +16837,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16837,7 +16922,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16899,7 +16983,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -16941,7 +17024,8 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ansi-align": { "version": "3.0.1", @@ -17234,7 +17318,8 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/asn1": { "version": "0.2.6", @@ -17337,7 +17422,8 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/async-listen": { "version": "3.0.0", @@ -17479,6 +17565,7 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -17527,6 +17614,7 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -17545,6 +17633,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17566,6 +17655,7 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17581,6 +17671,7 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -17683,6 +17774,7 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -17692,7 +17784,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.29.1", @@ -17700,6 +17793,7 @@ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.29.1" } @@ -17710,6 +17804,7 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -17720,6 +17815,7 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -17747,6 +17843,7 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -17978,6 +18075,7 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -17991,6 +18089,7 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">=0.6" } @@ -18257,6 +18356,7 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -18267,6 +18367,7 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -18325,7 +18426,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -18346,6 +18446,7 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -18523,6 +18624,7 @@ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -18536,6 +18638,7 @@ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -18546,6 +18649,7 @@ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -18798,6 +18902,7 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -18826,6 +18931,7 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -18924,6 +19030,7 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -18936,6 +19043,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "peer": true, "engines": { "node": ">=6" }, @@ -18981,6 +19089,7 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8" } @@ -20241,7 +20350,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -20481,6 +20589,7 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -20904,6 +21013,7 @@ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "dotenv": "^16.4.5" }, @@ -21282,6 +21392,7 @@ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -21300,6 +21411,7 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -21378,7 +21490,6 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22078,7 +22189,8 @@ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/execa": { "version": "5.1.1", @@ -22127,6 +22239,7 @@ "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -22145,6 +22258,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -22155,6 +22269,7 @@ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.16.0" } @@ -22164,7 +22279,8 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/express": { "version": "4.22.1", @@ -22523,6 +22639,7 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", + "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -22536,6 +22653,7 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "bser": "2.1.1" } @@ -22819,7 +22937,8 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -22846,7 +22965,8 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/for-each": { "version": "0.3.5", @@ -22943,6 +23063,7 @@ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23161,6 +23282,7 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -23242,6 +23364,7 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -23877,14 +24000,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-parser": { "version": "0.29.1", @@ -23892,6 +24017,7 @@ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.29.1" } @@ -23931,7 +24057,6 @@ "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -24377,6 +24502,7 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -24622,6 +24748,7 @@ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -24996,6 +25123,7 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -25013,6 +25141,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -25088,6 +25217,7 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -25106,6 +25236,7 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25116,6 +25247,7 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -25142,6 +25274,7 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -25163,6 +25296,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25176,6 +25310,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25190,7 +25325,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-mock": { "version": "29.7.0", @@ -25198,6 +25334,7 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -25213,6 +25350,7 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25240,6 +25378,7 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -25258,6 +25397,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25271,6 +25411,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25285,7 +25426,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-worker": { "version": "29.7.0", @@ -25322,7 +25464,8 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jiti": { "version": "1.21.0", @@ -25401,7 +25544,8 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/jsdom": { "version": "26.1.0", @@ -25530,7 +25674,8 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -25634,6 +25779,7 @@ "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -25757,6 +25903,7 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -25768,6 +25915,7 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -25777,7 +25925,8 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lightningcss": { "version": "1.30.2", @@ -25823,6 +25972,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25844,6 +25994,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25865,6 +26016,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25886,6 +26038,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25907,6 +26060,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25928,6 +26082,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25949,6 +26104,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25970,6 +26126,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25991,6 +26148,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26012,6 +26170,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26033,6 +26192,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26135,7 +26295,8 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -26149,6 +26310,7 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -26162,6 +26324,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -26175,6 +26338,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26190,6 +26354,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -26199,7 +26364,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -26207,6 +26373,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -26217,6 +26384,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -26227,6 +26395,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -26363,7 +26532,6 @@ "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -26397,6 +26565,7 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -26457,7 +26626,8 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -26846,7 +27016,8 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/merge-anything": { "version": "5.1.7", @@ -26902,6 +27073,7 @@ "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -26957,6 +27129,7 @@ "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -26973,6 +27146,7 @@ "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -26989,6 +27163,7 @@ "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27002,6 +27177,7 @@ "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -27022,6 +27198,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -27032,6 +27209,7 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -27048,6 +27226,7 @@ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -27062,6 +27241,7 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -27076,6 +27256,7 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -27090,6 +27271,7 @@ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -27100,6 +27282,7 @@ "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27115,6 +27298,7 @@ "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27136,6 +27320,7 @@ "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27150,6 +27335,7 @@ "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27163,6 +27349,7 @@ "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27177,6 +27364,7 @@ "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27199,6 +27387,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27209,6 +27398,7 @@ "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27230,6 +27420,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27240,6 +27431,7 @@ "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27258,6 +27450,7 @@ "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27282,7 +27475,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", @@ -27290,6 +27484,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -27300,6 +27495,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -27313,6 +27509,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27323,6 +27520,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28339,7 +28537,6 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10.x" } @@ -28397,8 +28594,7 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", @@ -28443,7 +28639,6 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -28557,7 +28752,8 @@ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/netmask": { "version": "2.0.2", @@ -28688,7 +28884,8 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/node-releases": { "version": "2.0.27", @@ -28737,6 +28934,7 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -28753,6 +28951,7 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -28765,7 +28964,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -28853,7 +29053,8 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/nwsapi": { "version": "2.2.22", @@ -28888,6 +29089,7 @@ "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29074,6 +29276,7 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -29092,6 +29295,7 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -29102,6 +29306,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -29115,6 +29320,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29130,6 +29336,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -29139,7 +29346,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -29147,6 +29355,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -29157,6 +29366,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -29167,6 +29377,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -29180,6 +29391,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -29275,7 +29487,6 @@ "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -29311,6 +29522,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -29435,6 +29647,7 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -29619,6 +29832,7 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -29690,6 +29904,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -29780,7 +29995,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -30011,7 +30225,6 @@ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright-core": "1.53.2" }, @@ -30043,6 +30256,7 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -30058,6 +30272,7 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0.0" } @@ -30104,7 +30319,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31241,7 +31455,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31411,6 +31624,7 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -31500,7 +31714,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -31543,6 +31756,7 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -31590,6 +31804,7 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.4.0" } @@ -31600,6 +31815,7 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -31833,6 +32049,7 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, + "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -31858,6 +32075,7 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -32007,7 +32225,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32021,6 +32238,7 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -32032,6 +32250,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -32053,7 +32272,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32128,7 +32346,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -32203,7 +32420,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -32920,6 +33136,7 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, + "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -32935,6 +33152,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "path-parse": "^1.0.5" } @@ -32986,6 +33204,7 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "global-dirs": "^0.1.1" }, @@ -32999,6 +33218,7 @@ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -33025,7 +33245,8 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/resolve.exports": { "version": "2.0.3", @@ -33033,6 +33254,7 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -33058,6 +33280,7 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -33072,6 +33295,7 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -33082,6 +33306,7 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -33160,7 +33385,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33369,7 +33593,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -33567,6 +33790,7 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -33585,7 +33809,6 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" } @@ -33953,6 +34176,7 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -34042,6 +34266,7 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -34126,7 +34351,6 @@ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -34332,6 +34556,7 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -34345,6 +34570,7 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -34361,7 +34587,8 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -34369,6 +34596,7 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34382,6 +34610,7 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=8" } @@ -34412,6 +34641,7 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">= 0.10.0" } @@ -34583,7 +34813,8 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/style-to-js": { "version": "1.1.21", @@ -34669,6 +34900,7 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -34779,7 +35011,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -34926,6 +35157,7 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -34936,6 +35168,7 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -34952,7 +35185,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -35159,7 +35391,8 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/throttleit": { "version": "2.1.0", @@ -35261,7 +35494,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -35323,7 +35555,8 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -35500,15 +35733,13 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.20.5", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -35682,6 +35913,7 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -35793,7 +36025,6 @@ "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 18" }, @@ -36498,6 +36729,7 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -36576,7 +36808,6 @@ "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -36822,7 +37053,8 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -36843,6 +37075,7 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -36875,6 +37108,7 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -36890,7 +37124,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -37309,7 +37542,8 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/whatwg-mimetype": { "version": "4.0.0", @@ -37337,6 +37571,7 @@ "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -37352,6 +37587,7 @@ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=8" } @@ -37493,7 +37729,8 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/wordwrapjs": { "version": "5.1.0", @@ -37574,7 +37811,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -37635,6 +37871,7 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -37649,6 +37886,7 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -37693,6 +37931,7 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -37707,6 +37946,7 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0" } @@ -37717,6 +37957,7 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0" } @@ -37805,6 +38046,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -37943,6 +38185,7 @@ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", + "peer": true, "peerDependencies": { "zod": "^3.24.1" } @@ -38274,7 +38517,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -38375,6 +38617,7 @@ "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -38463,6 +38706,7 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -38473,6 +38717,7 @@ "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -38495,6 +38740,7 @@ "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -38518,6 +38764,7 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -38541,6 +38788,7 @@ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -38579,6 +38827,7 @@ "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -38601,6 +38850,7 @@ "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -38627,6 +38877,7 @@ "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -38637,6 +38888,7 @@ "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -38651,6 +38903,7 @@ "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -38711,6 +38964,7 @@ "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -38733,6 +38987,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -38745,6 +39000,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -38766,6 +39022,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -38779,6 +39036,7 @@ "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -38810,6 +39068,7 @@ "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -38820,6 +39079,7 @@ "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -38844,6 +39104,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -38866,6 +39127,7 @@ "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -38876,6 +39138,7 @@ "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -38890,6 +39153,7 @@ "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -38913,6 +39177,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -38923,6 +39188,7 @@ "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -38933,6 +39199,7 @@ "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -38942,7 +39209,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/@react-native/virtualized-lists": { "version": "0.83.1", @@ -38950,6 +39218,7 @@ "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -38974,6 +39243,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -38986,7 +39256,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/babel-preset-expo": { "version": "54.0.10", @@ -38994,6 +39265,7 @@ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -39038,6 +39310,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -39048,6 +39321,7 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -39058,6 +39332,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -39122,6 +39397,7 @@ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -39138,6 +39414,7 @@ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -39153,6 +39430,7 @@ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -39180,6 +39458,7 @@ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -39191,6 +39470,7 @@ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -39208,6 +39488,7 @@ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -39237,6 +39518,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -39255,6 +39537,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -39270,14 +39553,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/lru-cache": { "version": "11.2.4", @@ -39285,6 +39570,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -39295,6 +39581,7 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -39350,6 +39637,7 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -39366,6 +39654,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -39376,6 +39665,7 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -39392,6 +39682,7 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39405,6 +39696,7 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -39425,6 +39717,7 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -39440,6 +39733,7 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -39461,6 +39755,7 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -39475,6 +39770,7 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39488,6 +39784,7 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -39502,6 +39799,7 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -39524,6 +39822,7 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -39545,6 +39844,7 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -39563,6 +39863,7 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -39587,7 +39888,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/metro/node_modules/hermes-parser": { "version": "0.32.0", @@ -39595,6 +39897,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -39605,6 +39908,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39627,6 +39931,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -39637,6 +39942,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -39650,6 +39956,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -39666,6 +39973,7 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -39679,6 +39987,7 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39692,6 +40001,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -39709,6 +40019,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -39726,6 +40037,7 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -39753,6 +40065,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -39768,6 +40081,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -39793,7 +40107,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native": { "version": "0.83.1", @@ -39861,6 +40176,7 @@ "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -39882,7 +40198,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -39890,6 +40207,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -39900,6 +40218,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -39911,6 +40230,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -39922,6 +40242,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -39943,6 +40264,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -39953,6 +40275,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39966,6 +40289,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39987,14 +40311,16 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/source-map": { "version": "0.5.7", @@ -40002,6 +40328,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -40012,6 +40339,7 @@ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -40043,6 +40371,7 @@ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18.17" } @@ -40053,6 +40382,7 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -40150,7 +40480,7 @@ }, "packages/zero": { "name": "@rocicorp/zero", - "version": "0.25.13", + "version": "0.26.0", "license": "Apache-2.0", "dependencies": { "@badrap/valita": "0.3.11", @@ -40584,6 +40914,7 @@ "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -40673,6 +41004,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -40690,6 +41022,7 @@ "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -40712,6 +41045,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -40729,6 +41063,7 @@ "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -40767,6 +41102,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -40784,6 +41120,7 @@ "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -40806,6 +41143,7 @@ "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -40832,6 +41170,7 @@ "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -40854,6 +41193,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -40866,6 +41206,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40887,6 +41228,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40897,6 +41239,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -40910,6 +41253,7 @@ "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -40933,7 +41277,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/babel-preset-expo": { "version": "54.0.4", @@ -40941,6 +41286,7 @@ "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -40985,6 +41331,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -41035,6 +41382,7 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -41045,6 +41393,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -41109,6 +41458,7 @@ "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -41125,6 +41475,7 @@ "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -41140,6 +41491,7 @@ "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -41167,6 +41519,7 @@ "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -41178,6 +41531,7 @@ "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -41239,7 +41593,8 @@ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/minimatch": { "version": "9.0.5", @@ -41247,6 +41602,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -41263,6 +41619,7 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -41294,6 +41651,7 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -41321,6 +41679,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -41342,6 +41701,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -41355,6 +41715,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -41370,6 +41731,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -41393,7 +41755,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native": { "version": "0.82.0", @@ -41460,7 +41823,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -41468,6 +41832,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -41478,6 +41843,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41490,6 +41856,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41511,6 +41878,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41521,6 +41889,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41534,6 +41903,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -41555,14 +41925,16 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/tar": { "version": "7.5.1", @@ -41570,6 +41942,7 @@ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -41601,6 +41974,7 @@ "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18.17" } @@ -41747,6 +42121,7 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -42117,6 +42492,7 @@ "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, + "peer": true, "requires": {} }, "@ai-sdk/gateway": { @@ -42256,7 +42632,6 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", - "peer": true, "requires": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -43091,7 +43466,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -43333,6 +43707,7 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, + "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -43345,6 +43720,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -43354,6 +43730,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -43365,6 +43742,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -43373,25 +43751,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -43455,6 +43837,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, + "peer": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -43466,6 +43849,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43481,6 +43865,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43490,6 +43875,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43499,6 +43885,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -43508,6 +43895,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -43517,6 +43905,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43534,6 +43923,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43543,6 +43933,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43568,6 +43959,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -43577,6 +43969,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43594,6 +43987,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -43603,6 +43997,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43612,6 +44007,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -43621,6 +44017,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43630,6 +44027,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43639,6 +44037,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43648,6 +44047,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -43657,6 +44057,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -43835,6 +44236,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -44404,6 +44806,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -44528,14 +44931,12 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "peer": true + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -45569,7 +45970,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -45734,7 +46134,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "peer": true, "requires": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -46093,8 +46492,7 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "peer": true + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" }, "which": { "version": "4.0.0", @@ -46155,8 +46553,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true, - "peer": true + "dev": true }, "@electric-sql/pglite-socket": { "version": "0.0.6", @@ -46567,6 +46964,7 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -46577,6 +46975,7 @@ "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -46598,6 +46997,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -46607,6 +47007,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -46617,13 +47018,15 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -46633,6 +47036,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -46645,6 +47049,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, + "peer": true, "requires": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -46667,6 +47072,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -46677,13 +47083,15 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -46693,6 +47101,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -46704,13 +47113,15 @@ "version": "54.0.10", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true + "dev": true, + "peer": true }, "@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, + "peer": true, "requires": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -46721,6 +47132,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "peer": true, "requires": { "ms": "^2.1.1" } @@ -46732,6 +47144,7 @@ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, + "peer": true, "requires": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -46745,6 +47158,7 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -46763,13 +47177,15 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -46779,6 +47195,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -46790,6 +47207,7 @@ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -46807,13 +47225,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true + "dev": true, + "peer": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -46825,6 +47245,7 @@ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -46835,6 +47256,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -46846,6 +47268,7 @@ "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, + "peer": true, "requires": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -46857,6 +47280,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, + "peer": true, "requires": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -46877,6 +47301,7 @@ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -46887,6 +47312,7 @@ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, + "peer": true, "requires": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -46901,6 +47327,7 @@ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, + "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -46911,19 +47338,22 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true + "dev": true, + "peer": true }, "@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true + "dev": true, + "peer": true }, "@expo/spawn-async": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.3" } @@ -46932,19 +47362,22 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true + "dev": true, + "peer": true }, "@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true + "dev": true, + "peer": true }, "@expo/xcpretty": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -46957,6 +47390,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -46966,6 +47400,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -46976,6 +47411,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -46985,6 +47421,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -47488,6 +47925,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "peer": true, "requires": { "minipass": "^7.0.4" } @@ -47496,13 +47934,15 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true + "dev": true, + "peer": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "peer": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -47516,6 +47956,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -47524,13 +47965,15 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "peer": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -47541,6 +47984,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -47551,6 +47995,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -47560,6 +48005,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "requires": { "p-try": "^2.0.0" } @@ -47569,6 +48015,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -47579,13 +48026,15 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true + "dev": true, + "peer": true }, "@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3" } @@ -47595,6 +48044,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "peer": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -47607,6 +48057,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -47629,6 +48080,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -47652,6 +48104,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -47875,7 +48328,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "peer": true, "requires": { "@types/mdx": "^2.0.0" } @@ -47969,8 +48421,7 @@ "@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "peer": true + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" }, "@noble/curves": { "version": "1.8.1", @@ -48149,8 +48600,7 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "peer": true + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, "@opentelemetry/api-logs": { "version": "0.203.0", @@ -48225,7 +48675,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", - "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -49366,7 +49815,6 @@ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, - "peer": true, "requires": { "@prisma/client-runtime-utils": "7.2.0" } @@ -49668,13 +50116,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -49685,6 +50135,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -49738,6 +50189,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -49753,6 +50205,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -49769,6 +50222,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, + "peer": true, "requires": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -49783,13 +50237,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true + "dev": true, + "peer": true }, "@react-native/dev-middleware": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -49810,6 +50266,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -49820,6 +50277,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -49830,13 +50288,15 @@ "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true + "dev": true, + "peer": true }, "@react-native/debugger-shell": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -49847,6 +50307,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -49866,6 +50327,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -49876,6 +50338,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -49886,19 +50349,22 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/js-polyfills": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/normalize-colors": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true + "dev": true, + "peer": true }, "@react-stately/utils": { "version": "3.10.4", @@ -50019,6 +50485,7 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -50091,6 +50558,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50103,6 +50571,7 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, + "peer": true, "requires": { "chalk": "^4.1.2" }, @@ -50112,6 +50581,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50124,6 +50594,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -50153,6 +50624,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50165,6 +50637,7 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -50183,6 +50656,7 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, + "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -50197,6 +50671,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50212,6 +50687,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -50222,6 +50698,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50236,6 +50713,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -50245,6 +50723,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -50256,6 +50735,7 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -50265,13 +50745,15 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "babel-preset-expo": { "version": "54.0.4", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -50302,6 +50784,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -50331,13 +50814,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true + "dev": true, + "peer": true }, "expo": { "version": "54.0.13", @@ -50374,6 +50859,7 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, + "peer": true, "requires": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -50384,6 +50870,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -50394,6 +50881,7 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, + "peer": true, "requires": {} }, "expo-font": { @@ -50411,6 +50899,7 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, + "peer": true, "requires": {} }, "expo-modules-core": { @@ -50418,6 +50907,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4" } @@ -50449,13 +50939,15 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -50465,6 +50957,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "peer": true, "requires": { "minipass": "^7.1.2" } @@ -50478,13 +50971,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true + "dev": true, + "peer": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -50495,7 +50990,8 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -50504,6 +51000,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -50514,7 +51011,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -50529,7 +51027,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true }, "react-native": { "version": "0.82.0", @@ -50579,13 +51078,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -50595,6 +51096,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -50605,6 +51107,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50619,6 +51122,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -50628,6 +51132,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -50637,6 +51142,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50652,19 +51158,22 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true + "dev": true, + "peer": true }, "tar": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, + "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -50683,7 +51192,8 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true + "dev": true, + "peer": true }, "vite": { "version": "7.2.7", @@ -50729,7 +51239,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -50924,7 +51435,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -51100,6 +51610,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "peer": true, "requires": { "type-detect": "4.0.8" } @@ -51109,6 +51620,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "peer": true, "requires": { "@sinonjs/commons": "^3.0.0" } @@ -51760,7 +52272,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "requires": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -51843,7 +52354,6 @@ "version": "3.10.9", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", - "peer": true, "requires": { "@tanstack/virtual-core": "3.10.9" } @@ -51920,7 +52430,6 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -52265,6 +52774,7 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -52391,7 +52901,6 @@ "version": "22.18.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", - "peer": true, "requires": { "undici-types": "~6.21.0" }, @@ -52423,7 +52932,6 @@ "version": "8.15.4", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", - "peer": true, "requires": { "@types/node": "*", "pg-protocol": "*", @@ -52474,7 +52982,6 @@ "version": "18.3.23", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", - "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -52613,7 +53120,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "peer": true }, "@types/strip-ansi": { "version": "3.0.0", @@ -52676,6 +53184,7 @@ "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -52686,6 +53195,7 @@ "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, + "peer": true, "requires": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -52893,7 +53403,6 @@ "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, - "peer": true, "requires": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -52918,7 +53427,6 @@ "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, - "peer": true, "requires": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -53176,7 +53684,8 @@ "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true + "dev": true, + "peer": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -53265,8 +53774,7 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "peer": true + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" }, "acorn-import-attributes": { "version": "1.9.5", @@ -53319,7 +53827,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -53363,7 +53870,6 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", - "peer": true, "requires": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -53418,7 +53924,8 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true + "dev": true, + "peer": true }, "ansi-align": { "version": "3.0.1", @@ -53619,7 +54126,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "dev": true, + "peer": true }, "asn1": { "version": "0.2.6", @@ -53712,7 +54220,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "dev": true, + "peer": true }, "async-listen": { "version": "3.0.0", @@ -53796,6 +54305,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "peer": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -53828,6 +54338,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -53841,6 +54352,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -53855,6 +54367,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "peer": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -53868,6 +54381,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -53945,6 +54459,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, + "peer": true, "requires": { "@babel/types": "^7.26.0" } @@ -53953,13 +54468,15 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.29.1" } @@ -53969,6 +54486,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, + "peer": true, "requires": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -53978,6 +54496,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, + "peer": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -54001,6 +54520,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "peer": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -54150,6 +54670,7 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, + "peer": true, "requires": { "open": "^8.0.4" } @@ -54158,7 +54679,8 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true + "dev": true, + "peer": true }, "big.js": { "version": "5.2.2", @@ -54338,6 +54860,7 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, + "peer": true, "requires": { "stream-buffers": "2.2.x" } @@ -54347,6 +54870,7 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, + "peer": true, "requires": { "big-integer": "1.6.x" } @@ -54378,7 +54902,6 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "peer": true, "requires": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -54392,6 +54915,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "peer": true, "requires": { "node-int64": "^0.4.0" } @@ -54502,6 +55026,7 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, + "peer": true, "requires": { "callsites": "^2.0.0" }, @@ -54510,7 +55035,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -54519,6 +55045,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, + "peer": true, "requires": { "caller-callsite": "^2.0.0" } @@ -54678,6 +55205,7 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -54695,6 +55223,7 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -54763,6 +55292,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -54771,7 +55301,8 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true + "dev": true, + "peer": true }, "cli-table3": { "version": "0.6.5", @@ -54815,7 +55346,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true + "dev": true, + "peer": true }, "clone-deep": { "version": "4.0.1", @@ -55615,8 +56147,7 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "peer": true + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-timer": { "version": "3.0.1", @@ -55787,6 +56318,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "peer": true, "requires": { "clone": "^1.0.2" } @@ -56072,6 +56604,7 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, + "peer": true, "requires": { "dotenv": "^16.4.5" } @@ -56257,7 +56790,8 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true + "dev": true, + "peer": true }, "error-ex": { "version": "1.3.2", @@ -56272,6 +56806,7 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, + "peer": true, "requires": { "stackframe": "^1.3.4" } @@ -56325,7 +56860,6 @@ "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "peer": true, "requires": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", @@ -56698,7 +57232,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true + "dev": true, + "peer": true }, "execa": { "version": "5.1.1", @@ -56732,6 +57267,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -56745,7 +57281,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -56753,13 +57290,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true + "dev": true, + "peer": true }, "exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true + "dev": true, + "peer": true }, "express": { "version": "4.22.1", @@ -57029,13 +57568,15 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true + "dev": true, + "peer": true }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "peer": true, "requires": { "bser": "2.1.1" } @@ -57224,7 +57765,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true + "dev": true, + "peer": true }, "follow-redirects": { "version": "1.15.11", @@ -57235,7 +57777,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true + "dev": true, + "peer": true }, "for-each": { "version": "0.3.5", @@ -57292,7 +57835,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true + "dev": true, + "peer": true }, "fresh": { "version": "0.5.2", @@ -57445,7 +57989,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "peer": true }, "get-port": { "version": "7.1.0", @@ -57495,7 +58040,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true + "dev": true, + "peer": true }, "giget": { "version": "2.0.0", @@ -57938,19 +58484,22 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true + "dev": true, + "peer": true }, "hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true + "dev": true, + "peer": true }, "hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.29.1" } @@ -57987,8 +58536,7 @@ "version": "4.10.6", "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true, - "peer": true + "dev": true }, "hpack.js": { "version": "2.1.6", @@ -58282,6 +58830,7 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, + "peer": true, "requires": { "queue": "6.0.2" } @@ -58442,7 +58991,8 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true + "dev": true, + "peer": true }, "is-docker": { "version": "2.2.1", @@ -58659,6 +59209,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -58671,7 +59222,8 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -58728,6 +59280,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -58741,13 +59294,15 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true + "dev": true, + "peer": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -58768,6 +59323,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -58784,13 +59340,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -58801,7 +59359,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -58810,6 +59369,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -58820,7 +59380,8 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true + "dev": true, + "peer": true }, "jest-util": { "version": "29.7.0", @@ -58840,6 +59401,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -58853,13 +59415,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -58870,7 +59434,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -58899,7 +59464,8 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true + "dev": true, + "peer": true }, "jiti": { "version": "1.21.0", @@ -58963,7 +59529,8 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true + "dev": true, + "peer": true }, "jsdom": { "version": "26.1.0", @@ -59056,7 +59623,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "peer": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -59139,7 +59707,8 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true + "dev": true, + "peer": true }, "latest-version": { "version": "7.0.0", @@ -59232,6 +59801,7 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, + "peer": true, "requires": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -59242,6 +59812,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "requires": { "ms": "2.0.0" } @@ -59250,7 +59821,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59280,77 +59852,88 @@ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-freebsd-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-x64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-x64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-win32-arm64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-win32-x64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lilconfig": { "version": "2.1.0", @@ -59438,7 +60021,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true + "dev": true, + "peer": true }, "lodash.uniq": { "version": "4.5.0", @@ -59450,6 +60034,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, + "peer": true, "requires": { "chalk": "^2.0.1" }, @@ -59459,6 +60044,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -59468,6 +60054,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -59479,6 +60066,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -59487,25 +60075,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -59595,7 +60187,6 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, - "peer": true, "requires": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -59621,6 +60212,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "peer": true, "requires": { "tmpl": "1.0.5" } @@ -59658,7 +60250,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true + "dev": true, + "peer": true }, "math-intrinsics": { "version": "1.1.0", @@ -59947,7 +60540,8 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true + "dev": true, + "peer": true }, "merge-anything": { "version": "5.1.7", @@ -59983,6 +60577,7 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -60030,19 +60625,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "peer": true, "requires": { "mime-db": "1.52.0" } @@ -60051,13 +60649,15 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -60067,6 +60667,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -60079,6 +60680,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, + "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -60091,6 +60693,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60100,6 +60703,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, + "peer": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -60116,6 +60720,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -60125,6 +60730,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, + "peer": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -60137,6 +60743,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, + "peer": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -60147,6 +60754,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -60157,6 +60765,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "peer": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -60166,7 +60775,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60175,6 +60785,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -60186,6 +60797,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, + "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -60203,6 +60815,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -60213,6 +60826,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60222,6 +60836,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -60232,6 +60847,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -60249,7 +60865,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60258,6 +60875,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -60271,7 +60889,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60280,6 +60899,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -60294,6 +60914,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -60928,8 +61549,7 @@ "version": "15.10.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true, - "peer": true + "dev": true }, "graphql-subscriptions": { "version": "1.2.1", @@ -60972,8 +61592,7 @@ "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "peer": true + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" }, "mri": { "version": "1.2.0", @@ -61004,7 +61623,6 @@ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, - "peer": true, "requires": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -61085,7 +61703,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true + "dev": true, + "peer": true }, "netmask": { "version": "2.0.2", @@ -61176,7 +61795,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "peer": true }, "node-releases": { "version": "2.0.27", @@ -61206,6 +61826,7 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, + "peer": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -61218,6 +61839,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, + "peer": true, "requires": { "lru-cache": "^10.0.1" } @@ -61226,7 +61848,8 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -61287,7 +61910,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true + "dev": true, + "peer": true }, "nwsapi": { "version": "2.2.22", @@ -61313,6 +61937,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -61432,6 +62057,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, + "peer": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -61445,13 +62071,15 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true + "dev": true, + "peer": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -61461,6 +62089,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -61472,6 +62101,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -61480,25 +62110,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -61508,6 +62142,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -61590,7 +62225,6 @@ "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.8.5.tgz", "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", "dev": true, - "peer": true, "requires": { "@oxlint-tsgolint/darwin-arm64": "0.8.5", "@oxlint-tsgolint/darwin-x64": "0.8.5", @@ -61615,6 +62249,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -61688,7 +62323,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "peer": true }, "pac-proxy-agent": { "version": "7.2.0", @@ -61825,6 +62461,7 @@ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, + "peer": true, "requires": { "pngjs": "^3.3.0" } @@ -61877,7 +62514,8 @@ "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 + "dev": true, + "peer": true }, "path-is-absolute": { "version": "1.0.1", @@ -61944,7 +62582,6 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -62107,7 +62744,6 @@ "version": "1.53.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", - "peer": true, "requires": { "fsevents": "2.3.2", "playwright-core": "1.53.2" @@ -62123,6 +62759,7 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, + "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -62133,7 +62770,8 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true + "dev": true, + "peer": true }, "portfinder": { "version": "1.0.38", @@ -62154,7 +62792,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -62782,7 +63419,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -62880,7 +63516,8 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true + "dev": true, + "peer": true }, "pretty-error": { "version": "4.0.0", @@ -62937,7 +63574,6 @@ "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", "dev": true, - "peer": true, "requires": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -62956,7 +63592,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true + "dev": true, + "peer": true }, "process": { "version": "0.11.10", @@ -62991,13 +63628,15 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "peer": true }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "peer": true, "requires": { "asap": "~2.0.6" } @@ -63167,7 +63806,8 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true + "dev": true, + "peer": true }, "qs": { "version": "6.14.0", @@ -63182,6 +63822,7 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, + "peer": true, "requires": { "inherits": "~2.0.3" } @@ -63281,7 +63922,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -63291,6 +63931,7 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, + "peer": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -63301,6 +63942,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -63309,7 +63951,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -63358,7 +63999,6 @@ "version": "npm:@docusaurus/react-loadable@6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "peer": true, "requires": { "@types/react": "*" } @@ -63405,7 +64045,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "peer": true, "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -63909,6 +64548,7 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -63980,6 +64620,7 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.3.3" } @@ -63989,6 +64630,7 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, + "peer": true, "requires": { "chalk": "^4.1.2" } @@ -63998,6 +64640,7 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -64017,6 +64660,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, + "peer": true, "requires": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -64039,6 +64683,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -64068,6 +64713,7 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -64086,6 +64732,7 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, + "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -64099,13 +64746,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true + "dev": true, + "peer": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -64116,6 +64765,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -64169,6 +64819,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -64184,6 +64835,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -64194,6 +64846,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -64208,6 +64861,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -64219,6 +64873,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, + "peer": true, "requires": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -64233,13 +64888,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true + "dev": true, + "peer": true }, "@react-native/dev-middleware": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -64260,6 +64917,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -64268,13 +64926,15 @@ "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true + "dev": true, + "peer": true }, "@react-native/debugger-shell": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -64285,6 +64945,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -64304,6 +64965,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -64314,25 +64976,29 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true + "dev": true, + "peer": true }, "@react-native/js-polyfills": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true + "dev": true, + "peer": true }, "@react-native/normalize-colors": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true + "dev": true, + "peer": true }, "@react-native/virtualized-lists": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -64342,19 +65008,22 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "babel-preset-expo": { "version": "54.0.10", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -64385,6 +65054,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -64393,13 +65063,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true }, "expo": { "version": "54.0.32", @@ -64436,6 +65108,7 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, + "peer": true, "requires": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -64446,6 +65119,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -64456,6 +65130,7 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, + "peer": true, "requires": {} }, "expo-font": { @@ -64473,6 +65148,7 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, + "peer": true, "requires": {} }, "expo-modules-autolinking": { @@ -64480,6 +65156,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -64493,6 +65170,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4" } @@ -64511,6 +65189,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -64522,6 +65201,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -64532,25 +65212,29 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true + "dev": true, + "peer": true }, "hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true + "dev": true, + "peer": true }, "lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -64598,13 +65282,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -64614,6 +65300,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -64623,6 +65310,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -64635,6 +65323,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -64646,6 +65335,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, + "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -64658,6 +65348,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -64667,6 +65358,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, + "peer": true, "requires": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -64683,6 +65375,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -64694,6 +65387,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, + "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -64711,6 +65405,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -64721,6 +65416,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -64730,6 +65426,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -64740,6 +65437,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -64758,6 +65456,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -64772,6 +65471,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -64786,6 +65486,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -64806,13 +65507,15 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "peer": true, "requires": { "mime-db": "1.52.0" } @@ -64822,6 +65525,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -64831,6 +65535,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "peer": true, "requires": { "minipass": "^7.1.2" } @@ -64840,6 +65545,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -64849,6 +65555,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -64859,6 +65566,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -64868,13 +65576,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true + "dev": true, + "peer": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -64886,6 +65596,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -64903,7 +65614,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true }, "react-native": { "version": "0.83.1", @@ -64954,6 +65666,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -64968,13 +65681,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -64984,6 +65699,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -64993,13 +65709,15 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true + "dev": true, + "peer": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -65014,6 +65732,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65023,6 +65742,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65032,6 +65752,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -65040,25 +65761,29 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true + "dev": true, + "peer": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true }, "tar": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, + "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -65077,13 +65802,15 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true + "dev": true, + "peer": true }, "yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -65153,8 +65880,7 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "peer": true + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" }, "typescript": { "version": "5.9.3", @@ -65207,6 +65933,7 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, + "peer": true, "requires": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -65218,6 +65945,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, + "peer": true, "requires": { "path-parse": "^1.0.5" } @@ -65254,6 +65982,7 @@ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, + "peer": true, "requires": { "global-dirs": "^0.1.1" }, @@ -65263,6 +65992,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, + "peer": true, "requires": { "ini": "^1.3.4" } @@ -65283,13 +66013,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true + "dev": true, + "peer": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true + "dev": true, + "peer": true }, "responselike": { "version": "3.0.0", @@ -65304,6 +66036,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -65313,13 +66046,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "dev": true, + "peer": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -65373,7 +66108,6 @@ "version": "4.46.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", - "peer": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", @@ -65504,7 +66238,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -65639,7 +66372,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true + "dev": true, + "peer": true }, "serialize-javascript": { "version": "6.0.2", @@ -65653,8 +66387,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true, - "peer": true + "dev": true }, "seroval-plugins": { "version": "1.1.1", @@ -65953,6 +66686,7 @@ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, + "peer": true, "requires": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -66020,7 +66754,8 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true + "dev": true, + "peer": true }, "smart-buffer": { "version": "4.2.0", @@ -66084,7 +66819,6 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, - "peer": true, "requires": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -66248,6 +66982,7 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "peer": true, "requires": { "escape-string-regexp": "^2.0.0" }, @@ -66256,7 +66991,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -66270,13 +67006,15 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "dev": true, + "peer": true }, "stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, + "peer": true, "requires": { "type-fest": "^0.7.1" }, @@ -66285,7 +67023,8 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -66308,7 +67047,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true + "dev": true, + "peer": true }, "stream-shift": { "version": "1.0.3", @@ -66427,7 +67167,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true + "dev": true, + "peer": true }, "style-to-js": { "version": "1.1.21", @@ -66490,6 +67231,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -66566,7 +67308,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, - "peer": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -66675,13 +67416,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true + "dev": true, + "peer": true }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -66691,7 +67434,6 @@ "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", - "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -66839,7 +67581,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true + "dev": true, + "peer": true }, "throttleit": { "version": "2.1.0", @@ -66899,8 +67642,7 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "peer": true + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" } } }, @@ -66940,7 +67682,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "peer": true }, "to-regex-range": { "version": "5.0.1", @@ -67043,14 +67786,12 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "peer": true + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tsx": { "version": "4.20.5", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", - "peer": true, "requires": { "esbuild": "~0.25.0", "fsevents": "~2.3.3", @@ -67156,7 +67897,8 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "peer": true }, "type-fest": { "version": "4.41.0", @@ -67247,7 +67989,6 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, - "peer": true, "requires": {} }, "typescript": { @@ -67657,7 +68398,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true + "dev": true, + "peer": true }, "value-equal": { "version": "1.0.1", @@ -67724,7 +68466,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fsevents": "~2.3.3", @@ -67819,7 +68560,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true + "dev": true, + "peer": true }, "w3c-xmlserializer": { "version": "5.0.0", @@ -67835,6 +68577,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "peer": true, "requires": { "makeerror": "1.0.12" } @@ -67861,6 +68604,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "peer": true, "requires": { "defaults": "^1.0.3" } @@ -67874,7 +68618,6 @@ "version": "5.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", - "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -68138,7 +68881,8 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true + "dev": true, + "peer": true }, "whatwg-mimetype": { "version": "4.0.0", @@ -68160,6 +68904,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, + "peer": true, "requires": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -68170,7 +68915,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -68261,7 +69007,8 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true + "dev": true, + "peer": true }, "wordwrapjs": { "version": "5.1.0", @@ -68319,7 +69066,6 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "peer": true, "requires": {} }, "wsl-utils": { @@ -68350,6 +69096,7 @@ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, + "peer": true, "requires": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -68359,7 +69106,8 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -68387,6 +69135,7 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "peer": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -68396,7 +69145,8 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -68404,7 +69154,8 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true + "dev": true, + "peer": true }, "xmlchars": { "version": "2.2.0", @@ -68461,7 +69212,8 @@ "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 + "dev": true, + "peer": true }, "z2s": { "version": "file:packages/z2s", @@ -68495,7 +69247,7 @@ "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", "@rocicorp/prettier-config": "^0.4.0", - "@rocicorp/zero": "0.25.13", + "@rocicorp/zero": "0.26.0", "@schickling/fps-meter": "^0.1.2", "@tailwindcss/forms": "^0.5.0", "@tanstack/react-virtual": "^3.10.9", @@ -68580,8 +69332,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "peer": true + "dev": true }, "typescript": { "version": "5.9.3", @@ -68594,7 +69345,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -68900,6 +69650,7 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, + "peer": true, "requires": {} }, "zql": { @@ -69023,8 +69774,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "peer": true + "dev": true }, "typescript": { "version": "5.9.3", diff --git a/packages/zero/package.json b/packages/zero/package.json index 032ab74066..ca974512fe 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero", - "version": "0.25.13", + "version": "0.26.0", "description": "Zero is a web framework for serverless web development.", "author": "Rocicorp, Inc.", "repository": { From 7f7479f9c80fa48449a067aa74a2cef78c004ca3 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 4 Feb 2026 13:03:15 -0800 Subject: [PATCH 024/495] chore(zero-cache): define and handle `backfill` change messages (#5518) Defines a new `backfill` message in the change stream protocol, and implements the handling of them at the replication level, as specified in the [backfill algorithm](https://www.notion.so/replicache/Auto-backfill-Schema-Change-Replication-2cb3bed8954580ee8c92e3a730c38772?source=copy_link#2cc3bed89545801c9f74dd255c6ffdef). Key points: * The changeLog metadata tracked in https://github.com/rocicorp/mono/pull/5505 is used to determine which rows / column values to backfill, avoiding re-introducing deleted rows or overwriting columns from newer replicated updates. * Care is taken not to change row versions during the backfill. In other words, no changes to any syncable columns should occur while the backfill is in progress. * To avoid unnecessary IVM processing, no replica-changed notifications are sent if nothing has been added to the changeLog (e.g. transactions consisting only of backfill messages). * A completed backfill is handled similarly to a schema change: all row versions in the table are bumped, and a reset signal is inserted into the changeLog so that pipelines are rehydrated. Upcoming: * change-source logic for producing backfill messages --- .../change-source/protocol/current/data.ts | 45 + .../change-source/protocol/version.test.ts | 4 +- .../change-streamer-http.pg.test.ts | 4 +- .../change-streamer/change-streamer.ts | 4 +- .../replicator/change-processor.test.ts | 868 +++++++++++++++++- .../services/replicator/change-processor.ts | 151 ++- .../replicator/incremental-sync.test.ts | 143 +++ .../services/replicator/incremental-sync.ts | 2 +- .../replicator/schema/change-log.test.ts | 24 + .../services/replicator/schema/change-log.ts | 25 + 10 files changed, 1244 insertions(+), 26 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.ts index e9b450a7ce..30fda30968 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/data.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.ts @@ -77,6 +77,14 @@ export const relationSchema = v }; }); +// The eventual fate of relationSchema +export const newRelationSchema = v.object({ + schema: v.string(), + name: v.string(), + + rowKey: rowKeySchema, +}); + // TableMetadata contains table-related configuration that does not affect the // actual data in the table, but rather how the table's change messages are // handled. @@ -232,6 +240,40 @@ export const dropIndexSchema = v.object({ id: identifierSchema, }); +// A batch of rows from a single table containing column values +// to be backfilled. +export const backfillSchema = v.object({ + tag: v.literal('backfill'), + + relation: newRelationSchema, + + // The columns to be backfilled. `rowKey` columns are automatically excluded, + // which means that this field may be empty. + columns: v.array(v.string()), + + // The watermark at which the backfill data was queried. Note that this + // generally will be different from the commit watermarks of the main change + // stream, and in particular, the commit watermark of the backfill change's + // enclosing transaction. + watermark: v.string(), + + // A batch of row values, each row consisting of the `rowKey` + // values, followed by the `column` values, in the same order in which + // the column names appear in their respective fields, e.g. + // + // ``` + // [ + // [...rowKeyValues, ...columnValues], // row 1 + // [...rowKeyValues, ...columnValues], // row 2 + // ] + // ``` + rowValues: v.array(v.array(jsonValueSchema)), + + // Indicates that the backfill for the specified columns have + // been successfully backfilled and can be published to clients. + completed: v.boolean().optional(), +}); + export type MessageBegin = v.Infer; export type MessageCommit = v.Infer; export type MessageRollback = v.Infer; @@ -242,6 +284,8 @@ export type MessageUpdate = v.Infer; export type MessageDelete = v.Infer; export type MessageTruncate = v.Infer; +export type MessageBackfill = v.Infer; + export type TableCreate = v.Infer; export type TableRename = v.Infer; export type TableUpdateMetadata = v.Infer; @@ -266,6 +310,7 @@ export const dataChangeSchema = v.union( dropTableSchema, createIndexSchema, dropIndexSchema, + backfillSchema, ); export type DataChange = Satisfies< diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index c1b869d68c..aec6a516b6 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '4zimue6d5cl1', '/changes/v0/stream'); + t(current, '3o21eprg77jzi', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '4zimue6d5cl1', '/changes/v0/stream'); + t(v0, '3o21eprg77jzi', '/changes/v0/stream'); }); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-http.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-http.pg.test.ts index 971c2e6116..16ad739cb9 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-http.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-http.pg.test.ts @@ -204,13 +204,13 @@ describe('change-streamer/http', () => { ], [ // Change the error message as necessary - `Cannot service client at protocol v6. Supported protocols: [v1 ... v5]`, + `Cannot service client at protocol v7. Supported protocols: [v1 ... v6]`, `/replication/v${PROTOCOL_VERSION + 1}/changes` + `?id=foo&replicaVersion=bar&watermark=123&initial=true`, ], [ // Change the error message as necessary - `Cannot service client at protocol v6. Supported protocols: [v1 ... v5]`, + `Cannot service client at protocol v7. Supported protocols: [v1 ... v6]`, `/replication/v${PROTOCOL_VERSION + 1}/snapshot` + `?id=foo&replicaVersion=bar&watermark=123&initial=true`, ], diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer.ts b/packages/zero-cache/src/services/change-streamer/change-streamer.ts index 9d73c7d5dd..75728ff80f 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer.ts @@ -64,8 +64,10 @@ export interface ChangeStreamer { // - Adds `metadata` to `create-table` message // - Adds `tableMetadata` to `add-column` message // - Adds `table-update-metadata` message +// v6: v0.26 +// - Adds support for `backfill` messages -export const PROTOCOL_VERSION = 5; +export const PROTOCOL_VERSION = 6; export type SubscriberContext = { /** diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index 2391425be4..3bbf4ca848 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -14,6 +14,7 @@ import {StatementRunner} from '../../db/statements.ts'; import {expectTables, initDB} from '../../test/lite.ts'; import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import {ChangeProcessor} from './change-processor.ts'; +import {DEL_OP, SET_OP} from './schema/change-log.ts'; import {ColumnMetadataStore} from './schema/column-metadata.ts'; import { getSubscriptionState, @@ -57,6 +58,7 @@ describe('replicator/change-processor', () => { data: Record[]>; tableSpecs?: LiteTableSpecWithReplicationStatus[]; indexSpecs?: LiteIndexSpec[]; + expectedTablesInBackupReplicatorChangeLog?: string[]; }; const issues = new ReplicationMessages({issues: ['issueID', 'bool']}); @@ -70,6 +72,7 @@ describe('replicator/change-processor', () => { }); const fooBarBaz = new ReplicationMessages({foo: 'id', bar: 'id', baz: 'id'}); const tables = new ReplicationMessages({transaction: 'column'}); + const bff = new ReplicationMessages({bff: ['b', 'a', 'c']}); const cases: Case[] = [ { @@ -1128,6 +1131,7 @@ describe('replicator/change-processor', () => { }, ], }, + expectedTablesInBackupReplicatorChangeLog: ['foo'], tableSpecs: [ { name: 'foo', @@ -1395,6 +1399,7 @@ describe('replicator/change-processor', () => { }, ], }, + expectedTablesInBackupReplicatorChangeLog: ['foo'], tableSpecs: [ { name: 'foo', @@ -2518,6 +2523,851 @@ describe('replicator/change-processor', () => { }, ], }, + { + name: 'in-progress table backfill', + setup: ``, + downstream: [ + // Create a table that needs backfilling. + ['begin', bff.begin(), {commitWatermark: '0e'}], + [ + 'data', + bff.createTable( + { + schema: 'public', + name: 'bff', + primaryKey: ['b', 'a', 'c'], + columns: { + a: {dataType: 'int', pos: 0}, + b: {dataType: 'int', pos: 1}, + c: {dataType: 'int', pos: 2}, + d: {dataType: 'int', pos: 3}, + e: {dataType: 'int', pos: 4}, + }, + }, + { + metadata: {rowKey: {columns: ['b', 'a', 'c']}}, + backfill: { + a: {id: 1}, + b: {id: 2}, + c: {id: 3}, + d: {id: 4}, + e: {id: 5}, + }, + }, + ), + ], + [ + 'data', + bff.createIndex({ + name: 'bff_pkey', + schema: 'public', + tableName: 'bff', + unique: true, + columns: { + b: 'ASC', + a: 'ASC', + c: 'ASC', + }, + }), + ], + ['commit', bff.commit(), {watermark: '0e'}], + + // Partial update at 101 + ['begin', bff.begin(), {commitWatermark: '101'}], + ['data', bff.update('bff', {a: 1, b: 2, c: 3, d: 500, e: 700})], + ['data', bff.update('bff', {a: 23, b: 45, c: 67, d: 98})], + ['data', bff.update('bff', {a: 32, b: 54, c: 76, e: 87})], + ['data', bff.delete('bff', {a: 10, b: 20, c: 30})], + ['commit', fooBarBaz.commit(), {watermark: '101'}], + + // Another partial update at 123 + ['begin', bff.begin(), {commitWatermark: '123'}], + ['data', bff.update('bff', {a: 23, b: 45, c: 67, e: 77})], + ['data', bff.update('bff', {a: 32, b: 54, c: 76, d: 90})], + // Row will be deleted later than the backfill + ['data', bff.delete('bff', {a: 100, b: 200, c: 300})], + // Row full row, so nothing to backfill + ['data', bff.update('bff', {a: 1000, b: 2000, c: 3000, d: 4, e: 5})], + ['commit', fooBarBaz.commit(), {watermark: '123'}], + + // Backfill at a snapshot in between (115) + ['begin', bff.begin(), {commitWatermark: '123.01'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [ + [2, 1, 3, 501, 701], + [54, 32, 76, 1000, 2000], + ], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.01'}], + ['begin', bff.begin(), {commitWatermark: '123.02'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [ + [45, 23, 67, 3000, 4000], + [20, 10, 30, 5000, 6000], + [200, 100, 300, 7000, 8000], + ], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.02'}], + ['begin', bff.begin(), {commitWatermark: '123.03'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [[2000, 1000, 3000, -1, -2]], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.03'}], + ], + data: { + bff: [ + { + // Note: The version is unchanged even though backfill updated + // a replicated row. + _0_version: '101', + a: 1n, + b: 2n, + c: 3n, + d: 501n, + e: 701n, + }, + { + _0_version: '123', + a: 23n, + b: 45n, + c: 67n, + d: 3000n, // 98@101 overwritten by backfill 3000 + e: 77n, // 77@123 not overwritten by backfill 4000 + }, + { + _0_version: '123', + a: 32n, + b: 54n, + c: 76n, + d: 90n, // 90@123 not overwritten by backfill 1000 + e: 2000n, // 87@101 not overwritten by backfill 2000 + }, + { + // rows introduced by backfill use the watermark as the version + _0_version: '115', + a: 10n, + b: 20n, + c: 30n, + d: 5000n, + e: 6000n, + }, + { + _0_version: '123', + a: 1000n, + b: 2000n, + c: 3000n, + d: 4n, // 4@123 not overwritten by backfill -1 + e: 5n, // 5@123 not overwritten by backfill -2 + }, + ], + ['_zero.changeLog2']: [ + { + backfillingColumnVersions: + '{"a":"101","b":"101","c":"101","d":"101","e":"101"}', + op: 's', + pos: 0n, + rowKey: '{"a":1,"b":2,"c":3}', + stateVersion: '101', + table: 'bff', + }, + { + backfillingColumnVersions: + '{"a":"123","b":"123","c":"123","d":"101","e":"123"}', + op: 's', + pos: 0n, + rowKey: '{"a":23,"b":45,"c":67}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: + '{"a":"123","b":"123","c":"123","e":"101","d":"123"}', + op: 's', + pos: 1n, + rowKey: '{"a":32,"b":54,"c":76}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'd', + pos: 3n, + rowKey: '{"a":10,"b":20,"c":30}', + stateVersion: '101', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'd', + pos: 2n, + rowKey: '{"a":100,"b":200,"c":300}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: + '{"a":"123","b":"123","c":"123","d":"123","e":"123"}', + op: 's', + pos: 3n, + rowKey: '{"a":1000,"b":2000,"c":3000}', + stateVersion: '123', + table: 'bff', + }, + ], + }, + expectedTablesInBackupReplicatorChangeLog: ['bff'], + }, + { + name: 'in-progress column backfill', + setup: /*sql*/ ` + CREATE TABLE bff(a int, b int, c int, _0_version TEXT, PRIMARY KEY(a, b, c)); + INSERT INTO bff(a, b, c, _0_version) VALUES (1, 2, 3, '03'); + INSERT INTO bff(a, b, c, _0_version) VALUES (23, 45, 67, '03'); + INSERT INTO bff(a, b, c, _0_version) VALUES (32, 54, 76, '06'); + INSERT INTO bff(a, b, c, _0_version) VALUES (10, 20, 30, '09'); + INSERT INTO bff(a, b, c, _0_version) VALUES (100, 200, 300, '0a'); + INSERT INTO bff(a, b, c, _0_version) VALUES (1000, 2000, 3000, '0b'); + `, + downstream: [ + // Add 'e' and 'd' columns to be backfilled + ['begin', bff.begin(), {commitWatermark: '0e'}], + [ + 'data', + bff.addColumn( + 'bff', + 'd', + {dataType: 'int', pos: 3}, + { + tableMetadata: {rowKey: {columns: ['b', 'a', 'c']}}, + backfill: {id: 4}, + }, + ), + ], + [ + 'data', + bff.addColumn( + 'bff', + 'e', + {dataType: 'int', pos: 4}, + { + tableMetadata: {rowKey: {columns: ['b', 'a', 'c']}}, + backfill: {id: 5}, + }, + ), + ], + ['commit', bff.commit(), {watermark: '0e'}], + + // Partial update at 101 + ['begin', bff.begin(), {commitWatermark: '101'}], + ['data', bff.update('bff', {a: 23, b: 45, c: 67, d: 98})], + ['data', bff.update('bff', {a: 32, b: 54, c: 76, e: 87})], + ['data', bff.delete('bff', {a: 10, b: 20, c: 30})], + ['commit', fooBarBaz.commit(), {watermark: '101'}], + + // Another partial update at 123 + ['begin', bff.begin(), {commitWatermark: '123'}], + ['data', bff.update('bff', {a: 23, b: 45, c: 67, e: 77})], + ['data', bff.update('bff', {a: 32, b: 54, c: 76, d: 90})], + // Row will be deleted later than the backfill + ['data', bff.delete('bff', {a: 100, b: 200, c: 300})], + // Row full row, so nothing to backfill + ['data', bff.update('bff', {a: 1000, b: 2000, c: 3000, d: 4, e: 5})], + ['commit', fooBarBaz.commit(), {watermark: '123'}], + + // Backfill at a snapshot in between (115) + ['begin', bff.begin(), {commitWatermark: '123.01'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [ + [2, 1, 3, 4, 5], + [54, 32, 76, 1000, 2000], + ], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.01'}], + ['begin', bff.begin(), {commitWatermark: '123.02'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [ + [45, 23, 67, 3000, 4000], + [20, 10, 30, 5000, 6000], + [200, 100, 300, 7000, 8000], + ], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.02'}], + ['begin', bff.begin(), {commitWatermark: '123.03'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [[2000, 1000, 3000, -1, -2]], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.03'}], + ], + data: { + bff: [ + { + // Note: Versions are unchanged even though backfill values + // are added. + _0_version: '03', + a: 1n, + b: 2n, + c: 3n, + d: 4n, + e: 5n, + }, + { + _0_version: '123', + a: 23n, + b: 45n, + c: 67n, + d: 3000n, // 98@101 overwritten by backfill 3000 + e: 77n, // 77@123 not overwritten by backfill 4000 + }, + { + _0_version: '123', + a: 32n, + b: 54n, + c: 76n, + d: 90n, // 90@123 not overwritten by backfill 1000 + e: 2000n, // 87@101 not overwritten by backfill 2000 + }, + { + // rows introduced by backfill use the watermark as the version. + // In practice this would correspond with an INSERT from the + // replication stream. + _0_version: '115', + a: 10n, + b: 20n, + c: 30n, + d: 5000n, + e: 6000n, + }, + { + _0_version: '123', + a: 1000n, + b: 2000n, + c: 3000n, + d: 4n, // 4@123 not overwritten by backfill -1 + e: 5n, // 5@123 not overwritten by backfill -2 + }, + ], + ['_zero.changeLog2']: [ + { + backfillingColumnVersions: '{"d":"101","e":"123"}', + op: 's', + pos: 0n, + rowKey: '{"a":23,"b":45,"c":67}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{"e":"101","d":"123"}', + op: 's', + pos: 1n, + rowKey: '{"a":32,"b":54,"c":76}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'd', + pos: 2n, + rowKey: '{"a":10,"b":20,"c":30}', + stateVersion: '101', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'd', + pos: 2n, + rowKey: '{"a":100,"b":200,"c":300}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{"d":"123","e":"123"}', + op: 's', + pos: 3n, + rowKey: '{"a":1000,"b":2000,"c":3000}', + stateVersion: '123', + table: 'bff', + }, + ], + }, + expectedTablesInBackupReplicatorChangeLog: ['bff'], + }, + { + name: 'completed table backfill', + setup: ``, + downstream: [ + // Create a table that needs backfilling. + ['begin', bff.begin(), {commitWatermark: '0e'}], + [ + 'data', + bff.createTable( + { + schema: 'public', + name: 'bff', + primaryKey: ['b', 'a', 'c'], + columns: { + a: {dataType: 'int', pos: 0}, + b: {dataType: 'int', pos: 1}, + c: {dataType: 'int', pos: 2}, + d: {dataType: 'int', pos: 3}, + e: {dataType: 'int', pos: 4}, + }, + }, + { + metadata: {rowKey: {columns: ['b', 'a', 'c']}}, + backfill: { + a: {id: 1}, + b: {id: 2}, + c: {id: 3}, + d: {id: 4}, + e: {id: 5}, + }, + }, + ), + ], + [ + 'data', + bff.createIndex({ + name: 'bff_pkey', + schema: 'public', + tableName: 'bff', + unique: true, + columns: { + b: 'ASC', + a: 'ASC', + c: 'ASC', + }, + }), + ], + ['commit', bff.commit(), {watermark: '0e'}], + + // Partial update at 101 + ['begin', bff.begin(), {commitWatermark: '101'}], + ['data', bff.update('bff', {a: 1, b: 2, c: 3, d: 500, e: 700})], + ['data', bff.update('bff', {a: 23, b: 45, c: 67, d: 98})], + ['data', bff.update('bff', {a: 32, b: 54, c: 76, e: 87})], + ['data', bff.delete('bff', {a: 10, b: 20, c: 30})], + ['commit', fooBarBaz.commit(), {watermark: '101'}], + + // Another partial update at 123 + ['begin', bff.begin(), {commitWatermark: '123'}], + ['data', bff.update('bff', {a: 23, b: 45, c: 67, e: 77})], + ['data', bff.update('bff', {a: 32, b: 54, c: 76, d: 90})], + // Row will be deleted later than the backfill + ['data', bff.delete('bff', {a: 100, b: 200, c: 300})], + // Row full row, so nothing to backfill + ['data', bff.update('bff', {a: 1000, b: 2000, c: 3000, d: 4, e: 5})], + ['commit', fooBarBaz.commit(), {watermark: '123'}], + + // Backfill at a snapshot in between (115) + ['begin', bff.begin(), {commitWatermark: '123.01'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [ + [2, 1, 3, 501, 701], + [54, 32, 76, 1000, 2000], + [45, 23, 67, 3000, 4000], + [20, 10, 30, 5000, 6000], + [200, 100, 300, 7000, 8000], + ], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.01'}], + ['begin', bff.begin(), {commitWatermark: '123.02'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [[2000, 1000, 3000, -1, -2]], + completed: true, + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.02'}], + ], + data: { + bff: [ + { + _0_version: '123.02', + a: 1n, + b: 2n, + c: 3n, + d: 501n, + e: 701n, + }, + { + _0_version: '123.02', + a: 23n, + b: 45n, + c: 67n, + d: 3000n, // 98@101 overwritten by backfill 3000 + e: 77n, // 77@123 not overwritten by backfill 4000 + }, + { + _0_version: '123.02', + a: 32n, + b: 54n, + c: 76n, + d: 90n, // 90@123 not overwritten by backfill 1000 + e: 2000n, // 87@101 not overwritten by backfill 2000 + }, + { + _0_version: '123.02', + a: 10n, + b: 20n, + c: 30n, + d: 5000n, + e: 6000n, + }, + { + _0_version: '123.02', + a: 1000n, + b: 2000n, + c: 3000n, + d: 4n, // 4@123 not overwritten by backfill -1 + e: 5n, // 5@123 not overwritten by backfill -2 + }, + ], + ['_zero.changeLog2']: [ + { + backfillingColumnVersions: + '{"a":"101","b":"101","c":"101","d":"101","e":"101"}', + op: 's', + pos: 0n, + rowKey: '{"a":1,"b":2,"c":3}', + stateVersion: '101', + table: 'bff', + }, + { + backfillingColumnVersions: + '{"a":"123","b":"123","c":"123","d":"101","e":"123"}', + op: 's', + pos: 0n, + rowKey: '{"a":23,"b":45,"c":67}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: + '{"a":"123","b":"123","c":"123","e":"101","d":"123"}', + op: 's', + pos: 1n, + rowKey: '{"a":32,"b":54,"c":76}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'd', + pos: 3n, + rowKey: '{"a":10,"b":20,"c":30}', + stateVersion: '101', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'd', + pos: 2n, + rowKey: '{"a":100,"b":200,"c":300}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: + '{"a":"123","b":"123","c":"123","d":"123","e":"123"}', + op: 's', + pos: 3n, + rowKey: '{"a":1000,"b":2000,"c":3000}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'r', + pos: -1n, + rowKey: '123.02', + stateVersion: '123.02', + table: 'bff', + }, + ], + }, + expectedTablesInBackupReplicatorChangeLog: ['bff'], + }, + { + name: 'completed column backfill', + setup: /*sql*/ ` + CREATE TABLE bff(a int, b int, c int, _0_version TEXT, PRIMARY KEY(a, b, c)); + INSERT INTO bff(a, b, c, _0_version) VALUES (1, 2, 3, '03'); + INSERT INTO bff(a, b, c, _0_version) VALUES (23, 45, 67, '03'); + INSERT INTO bff(a, b, c, _0_version) VALUES (32, 54, 76, '06'); + INSERT INTO bff(a, b, c, _0_version) VALUES (10, 20, 30, '09'); + INSERT INTO bff(a, b, c, _0_version) VALUES (100, 200, 300, '0a'); + INSERT INTO bff(a, b, c, _0_version) VALUES (1000, 2000, 3000, '0b'); + `, + downstream: [ + // Add 'e' and 'd' columns to be backfilled + ['begin', bff.begin(), {commitWatermark: '0e'}], + [ + 'data', + bff.addColumn( + 'bff', + 'd', + {dataType: 'int', pos: 3}, + { + tableMetadata: {rowKey: {columns: ['b', 'a', 'c']}}, + backfill: {id: 4}, + }, + ), + ], + [ + 'data', + bff.addColumn( + 'bff', + 'e', + {dataType: 'int', pos: 4}, + { + tableMetadata: {rowKey: {columns: ['b', 'a', 'c']}}, + backfill: {id: 5}, + }, + ), + ], + ['commit', bff.commit(), {watermark: '0e'}], + + // Partial update at 101 + ['begin', bff.begin(), {commitWatermark: '101'}], + ['data', bff.update('bff', {a: 23, b: 45, c: 67, d: 98})], + ['data', bff.update('bff', {a: 32, b: 54, c: 76, e: 87})], + ['data', bff.delete('bff', {a: 10, b: 20, c: 30})], + ['commit', fooBarBaz.commit(), {watermark: '101'}], + + // Another partial update at 123 + ['begin', bff.begin(), {commitWatermark: '123'}], + ['data', bff.update('bff', {a: 23, b: 45, c: 67, e: 77})], + ['data', bff.update('bff', {a: 32, b: 54, c: 76, d: 90})], + // Row will be deleted later than the backfill + ['data', bff.delete('bff', {a: 100, b: 200, c: 300})], + // Row full row, so nothing to backfill + ['data', bff.update('bff', {a: 1000, b: 2000, c: 3000, d: 4, e: 5})], + ['commit', fooBarBaz.commit(), {watermark: '123'}], + + // Backfill at a snapshot in between (115) + ['begin', bff.begin(), {commitWatermark: '123.01'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [ + [2, 1, 3, 4, 5], + [54, 32, 76, 1000, 2000], + [45, 23, 67, 3000, 4000], + [20, 10, 30, 5000, 6000], + [200, 100, 300, 7000, 8000], + [2000, 1000, 3000, -1, -2], + ], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.01'}], + ['begin', bff.begin(), {commitWatermark: '123.02'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + watermark: '115', + columns: ['d', 'e'], + rowValues: [], + completed: true, + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.02'}], + ], + data: { + bff: [ + { + _0_version: '123.02', + a: 1n, + b: 2n, + c: 3n, + d: 4n, + e: 5n, + }, + { + _0_version: '123.02', + a: 23n, + b: 45n, + c: 67n, + d: 3000n, // 98@101 overwritten by backfill 3000 + e: 77n, // 77@123 not overwritten by backfill 4000 + }, + { + _0_version: '123.02', + a: 32n, + b: 54n, + c: 76n, + d: 90n, // 90@123 not overwritten by backfill 1000 + e: 2000n, // 87@101 not overwritten by backfill 2000 + }, + { + _0_version: '123.02', + a: 10n, + b: 20n, + c: 30n, + d: 5000n, + e: 6000n, + }, + { + _0_version: '123.02', + a: 1000n, + b: 2000n, + c: 3000n, + d: 4n, // 4@123 not overwritten by backfill -1 + e: 5n, // 5@123 not overwritten by backfill -2 + }, + ], + ['_zero.changeLog2']: [ + { + backfillingColumnVersions: '{"d":"101","e":"123"}', + op: 's', + pos: 0n, + rowKey: '{"a":23,"b":45,"c":67}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{"e":"101","d":"123"}', + op: 's', + pos: 1n, + rowKey: '{"a":32,"b":54,"c":76}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'd', + pos: 2n, + rowKey: '{"a":10,"b":20,"c":30}', + stateVersion: '101', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'd', + pos: 2n, + rowKey: '{"a":100,"b":200,"c":300}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{"d":"123","e":"123"}', + op: 's', + pos: 3n, + rowKey: '{"a":1000,"b":2000,"c":3000}', + stateVersion: '123', + table: 'bff', + }, + { + backfillingColumnVersions: '{}', + op: 'r', + pos: -1n, + rowKey: '123.02', + stateVersion: '123.02', + table: 'bff', + }, + ], + }, + expectedTablesInBackupReplicatorChangeLog: ['bff'], + }, ]; for (const c of cases) { @@ -2538,16 +3388,22 @@ describe('replicator/change-processor', () => { if (log === 'all-entries') { expectTables(replica, c.data, 'bigint'); - } else { - // Only log entries relevant to backfill + } else if (c.data['_zero.changeLog2']) { + const fullChangeLog = c.data['_zero.changeLog2'] as { + table: string; + op: string; + }[]; + const backfillingTables = + c.expectedTablesInBackupReplicatorChangeLog ?? []; expectTables( replica, { ...c.data, - ['_zero.changeLog2']: - c.data['_zero.changeLog2']?.filter( - log => log.backfillingColumnVersions !== '{}', - ) ?? [], + ['_zero.changeLog2']: fullChangeLog.filter( + entry => + (entry.op === SET_OP || entry.op === DEL_OP) && + backfillingTables.includes(entry.table), + ), }, 'bigint', ); diff --git a/packages/zero-cache/src/services/replicator/change-processor.ts b/packages/zero-cache/src/services/replicator/change-processor.ts index 11de710911..c4bb3a9188 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.ts @@ -40,6 +40,7 @@ import type { ColumnUpdate, IndexCreate, IndexDrop, + MessageBackfill, MessageCommit, MessageDelete, MessageInsert, @@ -53,7 +54,7 @@ import type { } from '../change-source/protocol/current/data.ts'; import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import type {ReplicatorMode} from './replicator.ts'; -import {ChangeLog} from './schema/change-log.ts'; +import {ChangeLog, DEL_OP, SET_OP} from './schema/change-log.ts'; import {ColumnMetadataStore} from './schema/column-metadata.ts'; import { ZERO_VERSION_COLUMN_NAME, @@ -66,6 +67,7 @@ export type ChangeProcessorMode = ReplicatorMode | 'initial-sync'; export type CommitResult = { watermark: string; schemaUpdated: boolean; + changeLogUpdated: boolean; }; /** @@ -221,8 +223,11 @@ export class ChangeProcessor { this.#currentTx = null; assert(watermark, 'watermark is required for commit messages'); - const schemaUpdated = tx.processCommit(msg, watermark); - return {watermark, schemaUpdated}; + const {schemaUpdated, changeLogUpdated} = tx.processCommit( + msg, + watermark, + ); + return {watermark, schemaUpdated, changeLogUpdated}; } if (msg.tag === 'rollback') { @@ -271,6 +276,9 @@ export class ChangeProcessor { case 'drop-index': tx.processDropIndex(msg); break; + case 'backfill': + tx.processBackfill(msg); + break; default: unreachable(msg); } @@ -314,6 +322,7 @@ class TransactionProcessor { #pos = 0; #schemaChanged = false; + #numChangeLogEntries = 0; constructor( lc: LogContext, @@ -459,14 +468,11 @@ class TransactionProcessor { // https://www.postgresql.org/docs/current/protocol-logicalrep-message-formats.html#PROTOCOL-LOGICALREP-MESSAGE-FORMATS-TUPLEDATA // // However, in certain cases an UPDATE may be received for a row that - // was not initially synced, such as when: - // (1) an existing table is added to the app's publication, or - // (2) a new sharding key is added to a shard during resharding. + // was not initially synced, such as when, an existing table is added + // to the app's publication. // // In order to facilitate "resumptive" replication, the logic falls back to // an INSERT if the update did not change any rows. - // TODO: Figure out a solution for resumptive replication of rows - // with TOASTed values. processUpdate(update: MessageUpdate) { const table = liteTableName(update.relation); const tableSpec = this.#tableSpec(table); @@ -537,6 +543,7 @@ class TransactionProcessor { this.#logTruncateOp(table); } } + processCreateTable(create: TableCreate) { if (create.metadata) { this.#tableMetadata.set(create.spec, create.metadata); @@ -554,7 +561,17 @@ class TransactionProcessor { ); } - this.#logResetOp(table.name); + if ( + Object.keys(create.backfill ?? {}).length === + Object.keys(create.spec.columns).length + ) { + this.#reloadTableSpecs(); + } else { + // Make the table visible immediately unless all of the columns are + // being backfilled. In the backfill case, the version bump will happen + // with the backfill is complete. + this.#logResetOp(table.name); + } this.#lc.info?.(create.tag, table.name); } @@ -591,7 +608,13 @@ class TransactionProcessor { // Write to metadata table this.#columnMetadata.insert(table, name, msg.column.spec, msg.backfill); - this.#bumpVersions(table); + if (msg.backfill) { + this.#reloadTableSpecs(); + } else { + // Make the new column visible immediately if it's not being backfilled. + // Otherwise, the version bump will happen with the backfill is complete. + this.#bumpVersions(table); + } this.#lc.info?.(msg.tag, table, msg.column); } @@ -690,7 +713,17 @@ class TransactionProcessor { // indexes affect tables visibility (e.g. sync-ability is gated on // having a unique index), so reset pipelines to refresh table schemas. - this.#logResetOp(index.tableName); + // However, the reset is not necessary if the index is for a table + // that is not yet visible due to backfilling. + const tableSpec = must(this.#tableSpecs.get(index.tableName)); + if ( + (tableSpec.backfilling ?? []).length === + Object.entries(tableSpec.columns).length - 1 // don't count _0_version + ) { + this.#reloadTableSpecs(); + } else { + this.#logResetOp(index.tableName); + } this.#lc.info?.(create.tag, index.name); } @@ -727,6 +760,7 @@ class TransactionProcessor { key, backfilledColumns, ); + this.#numChangeLogEntries++; } } @@ -736,12 +770,14 @@ class TransactionProcessor { // when writing columns that are being backfilled. if (this.#mode === 'serving' || backfilling?.length) { this.#changeLog.logDeleteOp(this.#version, this.#pos++, table, key); + this.#numChangeLogEntries++; } } #logTruncateOp(table: string) { if (this.#mode === 'serving') { this.#changeLog.logTruncateOp(this.#version, table); + this.#numChangeLogEntries++; } } @@ -749,12 +785,96 @@ class TransactionProcessor { this.#schemaChanged = true; if (this.#mode === 'serving') { this.#changeLog.logResetOp(this.#version, table); + this.#numChangeLogEntries++; } this.#reloadTableSpecs(); } - /** @returns `true` if the schema was updated. */ - processCommit(commit: MessageCommit, watermark: string): boolean { + processBackfill({ + relation, + watermark, + columns, + rowValues, + completed, + }: MessageBackfill) { + const tableName = liteTableName(relation); + const tableSpec = must(this.#tableSpecs.get(tableName)); + const rowKeyCols = relation.rowKey.columns; + const cols = [...rowKeyCols, ...columns]; + + // Common parts of the INSERT sql statement. + const insertColsStr = [...cols, ZERO_VERSION_COLUMN_NAME].map(id).join(','); + const qMarks = Array.from({length: cols.length + 1}, () => '?').join(','); + const rowKeyColsStr = rowKeyCols.map(id).join(','); + + let backfilled = 0; + let skipped = 0; + for (const v of rowValues) { + const row = liteRow( + Object.fromEntries(cols.map((c, i) => [c, v[i]])), + tableSpec, + this.#jsonFormat, + ); + const rowKey = this.#getKey(row, {relation}); + const rowOp = this.#changeLog.getLatestRowOp(tableName, rowKey); + if (rowOp?.op === DEL_OP && rowOp.stateVersion > watermark) { + skipped++; + continue; // the row was deleted after the backfill snapshot + } + const updates = + rowOp?.op === SET_OP + ? columns.filter( + c => (rowOp.backfillingColumnVersions[c] ?? '') <= watermark, + ) + : columns; + if (updates.length === 0) { + // row already has newer values for all backfilling columns. + skipped++; + continue; + } + const updateStmts = updates.map(col => `${id(col)}=excluded.${id(col)}`); + this.#db.run( + /*sql*/ ` + INSERT INTO ${id(tableName)} (${insertColsStr}) VALUES (${qMarks}) + ON CONFLICT (${rowKeyColsStr}) + DO UPDATE SET ${updateStmts.join(',')}; + `, + ...Object.values(row.row), + watermark, // the _0_version for new rows (i.e. table backfill) + ); + backfilled++; + } + + this.#lc.debug?.( + `backfilled ${backfilled} rows (skipped ${skipped}) into ${tableName}`, + ); + + if (completed) { + const columnMetadata = must(ColumnMetadataStore.getInstance(this.#db.db)); + for (const col of cols) { + columnMetadata.clearBackfilling(tableName, col); + } + // Given that new columns are being exposed for every row in the table, bump the + // row version for all rows. + this.#bumpVersions(tableName); + this.#lc.info?.(`finished backfilling ${tableName}`); + + // Note that there is no need to clear the backfillingColumnVersions values + // in the changeLog. It could theoretically be done for clarity but: + // (1) it could be non-trivial in terms of latency introduced and + // (2) the data must be preserved if _other_ columns are in the process + // of being backfilled + // + // Thus, for speed and simplicity, the values are left as is. (Note that + // subsequent replicated changes to those rows will clear the values if + // no backfills are in progress). + } + } + + processCommit( + commit: MessageCommit, + watermark: string, + ): {schemaUpdated: boolean; changeLogUpdated: boolean} { if (watermark !== this.#version) { throw new Error( `'commit' version ${watermark} does not match 'begin' version ${ @@ -779,7 +899,10 @@ class TransactionProcessor { const elapsedMs = Date.now() - this.#startMs; this.#lc.debug?.(`Committed tx@${this.#version} (${elapsedMs} ms)`); - return this.#schemaChanged; + return { + schemaUpdated: this.#schemaChanged, + changeLogUpdated: this.#numChangeLogEntries > 0, + }; } abort(lc: LogContext) { diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index 677019db20..9a37f02362 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -16,6 +16,7 @@ import {Database} from '../../../../zqlite/src/db.ts'; import {initEventSinkForTesting} from '../../observability/events.ts'; import {expectTables, initDB} from '../../test/lite.ts'; import {Subscription} from '../../types/subscription.ts'; +import {orTimeoutWith} from '../../types/timeout.ts'; import { PROTOCOL_VERSION, type Downstream, @@ -512,6 +513,148 @@ describe('replicator/incremental-sync', () => { `); }); + async function noNotification( + notification: Promise>, + ) { + expect(await orTimeoutWith(notification, 50, 'timed-out')).toBe( + 'timed-out', + ); + } + + test('does not notify on incomplete backfills', async () => { + const issues = new ReplicationMessages({issues: ['issueID']}); + + initReplicationState(replica, ['zero_data'], '09'); + + initDB( + replica, + /*sql*/ ` + CREATE TABLE issues( + issueID INTEGER PRIMARY KEY, + big INTEGER, + _0_version TEXT + ); + CREATE UNIQUE INDEX issues_pkey ON issues ("issueID"); + + INSERT INTO issues ("issueID", big, _0_version) VALUES (1, 2, '100'); + INSERT INTO issues ("issueID", big, _0_version) VALUES (2, 3, '100'); + `, + ); + + void syncer.run(lc); + const notifications = syncer.subscribe(); + const versionReady = notifications[Symbol.asyncIterator](); + await versionReady.next(); // Get the initial nextStateVersion. + expect(subscribeFn.mock.calls[0][0]).toEqual({ + protocolVersion: PROTOCOL_VERSION, + taskID: 'task-id', + id: 'incremental_sync_test_id', + mode: 'serving', + replicaVersion: '09', + watermark: '09', + initial: true, + }); + + const next = versionReady.next(); + + for (const change of [ + ['status', {tag: 'status'}], + ['begin', issues.begin(), {commitWatermark: '110'}], + [ + 'data', + issues.addColumn( + 'issues', + 'new_column', + {pos: 4, dataType: 'text'}, + {backfill: {id: 123}}, + ), + ], + ['commit', issues.commit(), {watermark: '110'}], + ['begin', issues.begin(), {commitWatermark: '110.01'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'issues', + rowKey: {columns: ['issueID']}, + }, + watermark: '110', + columns: ['new_column'], + rowValues: [[1, 'hello']], + }, + ], + ['commit', issues.commit(), {watermark: '110.01'}], + ] satisfies Downstream[]) { + downstream.push(change); + } + + // Ensure no notifications have been published. + await noNotification(next); + + // And that row versions have not changed, even for backfilled rows. + const issuesDump = replica.prepare(/*sql*/ `SELECT * FROM issues`); + expect(issuesDump.all()).toEqual([ + { + _0_version: '100', + big: 2, + issueID: 1, + new_column: 'hello', + }, + { + _0_version: '100', + big: 3, + issueID: 2, + new_column: null, + }, + ]); + + // Complete the backfill. + for (const change of [ + ['begin', issues.begin(), {commitWatermark: '110.02'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'issues', + rowKey: {columns: ['issueID']}, + }, + watermark: '110', + columns: ['new_column'], + rowValues: [[2, 'world']], + completed: true, + }, + ], + ['commit', issues.commit(), {watermark: '110.02'}], + ] satisfies Downstream[]) { + downstream.push(change); + } + + // Now there should be a notification. + expect( + await orTimeoutWith(next, 5000, new Error('timed-out')), + ).not.toBeInstanceOf(Error); + + // And row versions should be bumped. + expect(issuesDump.all()).toEqual([ + { + _0_version: '110.02', + big: 2, + issueID: 1, + new_column: 'hello', + }, + { + _0_version: '110.02', + big: 3, + issueID: 2, + new_column: 'world', + }, + ]); + }); + test('retry on initial change-streamer connection failure', async () => { initReplicationState(replica, ['zero_data'], '02'); diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.ts b/packages/zero-cache/src/services/replicator/incremental-sync.ts index 550ce2d4ae..995f2cbd23 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.ts @@ -114,7 +114,7 @@ export class IncrementalSyncer { if (result?.schemaUpdated) { statusPublisher?.publish(lc, 'Replicating', 'Schema updated'); } - if (result?.watermark) { + if (result?.watermark && result?.changeLogUpdated) { void this.#notifier.notifySubscribers({state: 'version-ready'}); } break; diff --git a/packages/zero-cache/src/services/replicator/schema/change-log.test.ts b/packages/zero-cache/src/services/replicator/schema/change-log.test.ts index b20371e498..31a0da0a79 100644 --- a/packages/zero-cache/src/services/replicator/schema/change-log.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/change-log.test.ts @@ -532,4 +532,28 @@ describe('replicator/schema/change-log', () => { backfillingColumnVersions: '{}', }); }); + + test('getLatestRowOp', () => { + changeLog.logSetOp('123', 0, 'foo', {a: 1, b: 2}, ['c', 'b']); + changeLog.logSetOp('123', 1, 'bar', {b: 1, a: 2}, undefined); + + expect(changeLog.getLatestRowOp('bar', {a: 3, b: 4})).toBeUndefined(); + expect(changeLog.getLatestRowOp('foo', {b: 2, a: 1})).toEqual({ + stateVersion: '123', + table: 'foo', + rowKey: '{"a":1,"b":2}', + op: 's', + backfillingColumnVersions: { + b: '123', + c: '123', + }, + }); + expect(changeLog.getLatestRowOp('bar', {a: 2, b: 1})).toEqual({ + stateVersion: '123', + table: 'bar', + rowKey: '{"a":2,"b":1}', + op: 's', + backfillingColumnVersions: {}, + }); + }); }); diff --git a/packages/zero-cache/src/services/replicator/schema/change-log.ts b/packages/zero-cache/src/services/replicator/schema/change-log.ts index 8397713c6a..fa55c76e86 100644 --- a/packages/zero-cache/src/services/replicator/schema/change-log.ts +++ b/packages/zero-cache/src/services/replicator/schema/change-log.ts @@ -107,10 +107,23 @@ export const changeLogEntrySchema = v export type ChangeLogEntry = v.Infer; +const rawChangeLogEntrySchema = v.object({ + stateVersion: v.string(), + table: v.string(), + rowKey: v.string(), + op: v.literalUnion(SET_OP, DEL_OP, TRUNCATE_OP, RESET_OP), + backfillingColumnVersions: v + .string() + .map(val => v.record(v.string()).parse(JSON.parse(val))), +}); + +export type RawChangeLogEntry = v.Infer; + export class ChangeLog { readonly #logRowOpStmt: Statement; readonly #logRowOpWithBackfillStmt: Statement; readonly #logTableWideOpStmt; + readonly #getRowOpStmt: Statement; constructor(db: Database) { this.#logRowOpStmt = db.prepare(/*sql*/ ` @@ -144,6 +157,10 @@ export class ChangeLog { (stateVersion, pos, "table", rowKey, op) VALUES (@version, -1, @table, @version, @op) `); + + this.#getRowOpStmt = db.prepare(/*sql*/ ` + SELECT * FROM "_zero.changeLog2" WHERE "table" = ? AND "rowKey" = JSON(?) + `); } /** @@ -179,6 +196,14 @@ export class ChangeLog { return this.#logRowOp(version, pos, table, row, DEL_OP, undefined); } + getLatestRowOp(table: string, row: LiteRowKey) { + const rowKey = stringify(normalizedKeyOrder(row)); + const result = this.#getRowOpStmt.get(table, rowKey); + return result === undefined + ? undefined + : v.parse(result, rawChangeLogEntrySchema, 'passthrough'); + } + #logRowOp( version: LexiVersion, pos: number, From fa33c75895536d465718c868d77fff829ca8d05b Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Thu, 5 Feb 2026 11:51:27 -0500 Subject: [PATCH 025/495] feat(zqlite): resolve simple scalar subqueries by inlining literal values (#5519) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a resolver that evaluates "simple" scalar subqueries — those where all columns of at least one unique index are equality-constrained by literals — and replaces them with literal conditions in the parent AST. Non-simple subqueries are left for the existing EXISTS rewrite path. Companion subquery ASTs are collected so their rows can be synced to the client. --- .../src/resolve-scalar-subqueries.test.ts | 614 ++++++++++++++++++ .../zqlite/src/resolve-scalar-subqueries.ts | 215 ++++++ 2 files changed, 829 insertions(+) create mode 100644 packages/zqlite/src/resolve-scalar-subqueries.test.ts create mode 100644 packages/zqlite/src/resolve-scalar-subqueries.ts diff --git a/packages/zqlite/src/resolve-scalar-subqueries.test.ts b/packages/zqlite/src/resolve-scalar-subqueries.test.ts new file mode 100644 index 0000000000..0a9412ad9e --- /dev/null +++ b/packages/zqlite/src/resolve-scalar-subqueries.test.ts @@ -0,0 +1,614 @@ +import {expect, test} from 'vitest'; +import type { + AST, + Condition, + SimpleCondition, +} from '../../zero-protocol/src/ast.ts'; +import type {PrimaryKey} from '../../zero-protocol/src/primary-key.ts'; +import { + extractLiteralEqualityConstraints, + isSimpleSubquery, + resolveSimpleScalarSubqueries, +} from './resolve-scalar-subqueries.ts'; + +function makeTableSpecs( + entries: Record, +): Map { + const map = new Map(); + for (const [table, uniqueKeys] of Object.entries(entries)) { + map.set(table, {tableSpec: {uniqueKeys}}); + } + return map; +} + +const ALWAYS_FALSE: SimpleCondition = { + type: 'simple', + op: '=', + left: {type: 'literal', value: 1}, + right: {type: 'literal', value: 0}, +}; + +// ---------- extractLiteralEqualityConstraints ---------- + +test('extractLiteralEqualityConstraints: simple column = literal', () => { + const cond: Condition = { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '42'}, + }; + const constraints = extractLiteralEqualityConstraints(cond); + expect(constraints).toEqual(new Map([['id', '42']])); +}); + +test('extractLiteralEqualityConstraints: ignores non-equality operators', () => { + const cond: Condition = { + type: 'simple', + op: '>', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 10}, + }; + const constraints = extractLiteralEqualityConstraints(cond); + expect(constraints.size).toBe(0); +}); + +test('extractLiteralEqualityConstraints: collects from AND', () => { + const cond: Condition = { + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'a'}, + right: {type: 'literal', value: 1}, + }, + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'b'}, + right: {type: 'literal', value: 2}, + }, + ], + }; + const constraints = extractLiteralEqualityConstraints(cond); + expect(constraints).toEqual( + new Map([ + ['a', 1], + ['b', 2], + ]), + ); +}); + +test('extractLiteralEqualityConstraints: does not descend into OR', () => { + const cond: Condition = { + type: 'or', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'a'}, + right: {type: 'literal', value: 1}, + }, + ], + }; + const constraints = extractLiteralEqualityConstraints(cond); + expect(constraints.size).toBe(0); +}); + +test('extractLiteralEqualityConstraints: ignores column = column', () => { + // Column references are excluded from the `right` position in the type, + // but at runtime they could appear via JSON. Cast to test defensive behavior. + const cond = { + type: 'simple', + op: '=', + left: {type: 'column', name: 'a'}, + right: {type: 'column', name: 'b'}, + } as unknown as Condition; + const constraints = extractLiteralEqualityConstraints(cond); + expect(constraints.size).toBe(0); +}); + +// ---------- isSimpleSubquery ---------- + +test('isSimpleSubquery: true when unique key fully constrained', () => { + const specs = makeTableSpecs({users: [['id']]}); + const subquery: AST = { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, + }; + expect(isSimpleSubquery(subquery, specs)).toBe(true); +}); + +test('isSimpleSubquery: true with composite unique key', () => { + const specs = makeTableSpecs({issueLabel: [['issueId', 'labelId']]}); + const subquery: AST = { + table: 'issueLabel', + where: { + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'issueId'}, + right: {type: 'literal', value: '1'}, + }, + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'labelId'}, + right: {type: 'literal', value: '2'}, + }, + ], + }, + }; + expect(isSimpleSubquery(subquery, specs)).toBe(true); +}); + +test('isSimpleSubquery: false when unique key partially constrained', () => { + const specs = makeTableSpecs({issueLabel: [['issueId', 'labelId']]}); + const subquery: AST = { + table: 'issueLabel', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'issueId'}, + right: {type: 'literal', value: '1'}, + }, + }; + expect(isSimpleSubquery(subquery, specs)).toBe(false); +}); + +test('isSimpleSubquery: false when no where clause', () => { + const specs = makeTableSpecs({users: [['id']]}); + const subquery: AST = {table: 'users'}; + expect(isSimpleSubquery(subquery, specs)).toBe(false); +}); + +test('isSimpleSubquery: false when table not in specs', () => { + const specs = makeTableSpecs({}); + const subquery: AST = { + table: 'unknown', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '1'}, + }, + }; + expect(isSimpleSubquery(subquery, specs)).toBe(false); +}); + +test('isSimpleSubquery: true if any unique key is satisfied', () => { + const specs = makeTableSpecs({ + users: [['id'], ['email', 'tenant']], + }); + const subquery: AST = { + table: 'users', + where: { + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'email'}, + right: {type: 'literal', value: 'a@b.com'}, + }, + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'tenant'}, + right: {type: 'literal', value: 't1'}, + }, + ], + }, + }; + expect(isSimpleSubquery(subquery, specs)).toBe(true); +}); + +// ---------- resolveSimpleScalarSubqueries ---------- + +test('resolves a simple scalar subquery to a literal condition', () => { + const specs = makeTableSpecs({users: [['id']]}); + const ast: AST = { + table: 'issues', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'name', + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, + }, + }, + }; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + (_subAST, _field) => 'Alice', + ); + + expect(resolved.where).toEqual({ + type: 'simple', + op: '=', + left: {type: 'column', name: 'ownerId'}, + right: {type: 'literal', value: 'Alice'}, + }); + expect(companions).toHaveLength(1); + expect(companions[0].ast.table).toBe('users'); +}); + +test('preserves the operator from the scalar subquery condition', () => { + const specs = makeTableSpecs({users: [['id']]}); + const ast: AST = { + table: 'issues', + where: { + type: 'scalarSubquery', + op: 'IS NOT', + parentField: 'ownerId', + childField: 'name', + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, + }, + }, + }; + + const {ast: resolved} = resolveSimpleScalarSubqueries( + ast, + specs, + () => 'Alice', + ); + + expect((resolved.where as SimpleCondition).op).toBe('IS NOT'); +}); + +test('returns ALWAYS_FALSE when executor returns undefined', () => { + const specs = makeTableSpecs({users: [['id']]}); + const ast: AST = { + table: 'issues', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'name', + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 'nonexistent'}, + }, + }, + }, + }; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + () => undefined, + ); + + expect(resolved.where).toEqual(ALWAYS_FALSE); + expect(companions).toHaveLength(1); +}); + +test('returns ALWAYS_FALSE when executor returns null', () => { + const specs = makeTableSpecs({users: [['id']]}); + const ast: AST = { + table: 'issues', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'name', + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, + }, + }, + }; + + const {ast: resolved} = resolveSimpleScalarSubqueries(ast, specs, () => null); + + expect(resolved.where).toEqual(ALWAYS_FALSE); +}); + +test('leaves non-simple scalar subquery untouched', () => { + const specs = makeTableSpecs({users: [['id']]}); + const ast: AST = { + table: 'issues', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'name', + subquery: { + // No where clause → not simple + table: 'users', + }, + }, + }; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + () => 'should not be called', + ); + + expect(resolved.where).toEqual(ast.where); + expect(companions).toHaveLength(0); +}); + +test('resolves scalar subqueries inside AND conditions', () => { + const specs = makeTableSpecs({users: [['id']]}); + const ast: AST = { + table: 'issues', + where: { + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'closed'}, + right: {type: 'literal', value: false}, + }, + { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'id', + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, + }, + }, + ], + }, + }; + + const {ast: resolved} = resolveSimpleScalarSubqueries( + ast, + specs, + () => '0001', + ); + + expect(resolved.where).toEqual({ + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'closed'}, + right: {type: 'literal', value: false}, + }, + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'ownerId'}, + right: {type: 'literal', value: '0001'}, + }, + ], + }); +}); + +test('resolves scalar subqueries inside OR conditions', () => { + const specs = makeTableSpecs({users: [['id']]}); + const ast: AST = { + table: 'issues', + where: { + type: 'or', + conditions: [ + { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'id', + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, + }, + }, + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0003'}, + }, + ], + }, + }; + + const {ast: resolved} = resolveSimpleScalarSubqueries( + ast, + specs, + () => '0001', + ); + + expect(resolved.where).toEqual({ + type: 'or', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'ownerId'}, + right: {type: 'literal', value: '0001'}, + }, + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0003'}, + }, + ], + }); +}); + +test('resolves scalar subqueries in related subqueries', () => { + const specs = makeTableSpecs({users: [['id']]}); + const ast: AST = { + table: 'issues', + related: [ + { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'users', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'name', + childField: 'name', + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0002'}, + }, + }, + }, + }, + }, + ], + }; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + () => 'Bob', + ); + + expect(resolved.related?.[0].subquery.where).toEqual({ + type: 'simple', + op: '=', + left: {type: 'column', name: 'name'}, + right: {type: 'literal', value: 'Bob'}, + }); + expect(companions).toHaveLength(1); +}); + +test('returns original AST when nothing to resolve', () => { + const specs = makeTableSpecs({}); + const ast: AST = { + table: 'issues', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '1'}, + }, + }; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + () => undefined, + ); + + expect(resolved).toBe(ast); + expect(companions).toHaveLength(0); +}); + +test('resolves nested scalar subqueries in subquery where clause', () => { + const specs = makeTableSpecs({ + config: [['key']], + users: [['id']], + }); + + const ast: AST = { + table: 'issues', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'id', + subquery: { + table: 'users', + where: { + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, + { + type: 'scalarSubquery', + op: '=', + parentField: 'role', + childField: 'value', + subquery: { + table: 'config', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'key'}, + right: {type: 'literal', value: 'default_role'}, + }, + }, + }, + ], + }, + }, + }, + }; + + const values: Record = { + value: 'admin', + id: '0001', + }; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + (_subAST, field) => values[field], + ); + + // The inner scalar subquery (config lookup) should be resolved first, + // then the outer one (users lookup) should also be resolved. + expect(resolved.where).toEqual({ + type: 'simple', + op: '=', + left: {type: 'column', name: 'ownerId'}, + right: {type: 'literal', value: '0001'}, + }); + // Both the config and users subqueries become companions. + expect(companions).toHaveLength(2); +}); diff --git a/packages/zqlite/src/resolve-scalar-subqueries.ts b/packages/zqlite/src/resolve-scalar-subqueries.ts new file mode 100644 index 0000000000..132bf9c351 --- /dev/null +++ b/packages/zqlite/src/resolve-scalar-subqueries.ts @@ -0,0 +1,215 @@ +import type { + AST, + Condition, + LiteralValue, + ScalarSubqueryCondition, + SimpleCondition, +} from '../../zero-protocol/src/ast.ts'; +import type {PrimaryKey} from '../../zero-protocol/src/primary-key.ts'; + +type TableSpecWithUniqueKeys = { + tableSpec: { + uniqueKeys: PrimaryKey[]; + }; +}; + +export type CompanionSubquery = { + /** The original scalar subquery AST (the subquery table query). */ + ast: AST; +}; + +export type ResolveResult = { + ast: AST; + companions: CompanionSubquery[]; +}; + +/** + * Callback that executes a scalar subquery and returns the value of + * `childField` from the (at most one) matching row, or `undefined` + * if no rows match. + */ +export type ScalarExecutor = ( + subqueryAST: AST, + childField: string, +) => LiteralValue | null | undefined; + +/** + * Resolves "simple" scalar subqueries by calling the provided executor + * and replacing them with literal conditions. A scalar subquery is simple + * when all columns of at least one unique index on the subquery table are + * equality-constrained by literal values in the subquery's WHERE clause + * (using only AND conjunctions). + * + * Non-simple scalar subqueries are left untouched for the existing + * EXISTS rewrite in buildPipelineInternal. + * + * Returns the resolved AST and a list of companion subquery ASTs whose + * rows need to be synced to the client for the EXISTS rewrite to work. + */ +export function resolveSimpleScalarSubqueries( + ast: AST, + tableSpecs: Map, + execute: ScalarExecutor, +): ResolveResult { + const companions: CompanionSubquery[] = []; + const resolved = resolveASTRecursive(ast, tableSpecs, execute, companions); + return {ast: resolved, companions}; +} + +function resolveASTRecursive( + ast: AST, + tableSpecs: Map, + execute: ScalarExecutor, + companions: CompanionSubquery[], +): AST { + const where = ast.where + ? resolveCondition(ast.where, tableSpecs, execute, companions) + : undefined; + + const related = ast.related?.map(r => ({ + ...r, + subquery: resolveASTRecursive(r.subquery, tableSpecs, execute, companions), + })); + + if (where !== ast.where || related !== ast.related) { + return {...ast, where, related}; + } + return ast; +} + +function resolveCondition( + condition: Condition, + tableSpecs: Map, + execute: ScalarExecutor, + companions: CompanionSubquery[], +): Condition { + switch (condition.type) { + case 'scalarSubquery': + return resolveScalarSubquery(condition, tableSpecs, execute, companions); + case 'and': + case 'or': { + const resolved = condition.conditions.map(c => + resolveCondition(c, tableSpecs, execute, companions), + ); + if (resolved.every((c, i) => c === condition.conditions[i])) { + return condition; + } + return {type: condition.type, conditions: resolved}; + } + default: + return condition; + } +} + +function resolveScalarSubquery( + condition: ScalarSubqueryCondition, + tableSpecs: Map, + execute: ScalarExecutor, + companions: CompanionSubquery[], +): Condition { + // Recursively resolve any scalar subqueries nested in the + // subquery's own WHERE (and related) before evaluating this one. + const subquery = resolveASTRecursive( + condition.subquery, + tableSpecs, + execute, + companions, + ); + + if (!isSimpleSubquery(subquery, tableSpecs)) { + // Return with the (possibly partially-resolved) subquery. + if (subquery !== condition.subquery) { + return {...condition, subquery}; + } + return condition; + } + + const value = execute(subquery, condition.childField); + + // Record the companion subquery AST so its rows are synced to the client. + // The client rewrites scalar subqueries to EXISTS and needs those rows. + companions.push({ast: subquery}); + + if (value === undefined || value === null) { + // No rows or NULL value — both x = NULL and x != NULL are false in SQL + return ALWAYS_FALSE; + } + + return { + type: 'simple', + op: condition.op, + left: {type: 'column', name: condition.parentField}, + right: {type: 'literal', value}, + } satisfies SimpleCondition; +} + +const ALWAYS_FALSE: SimpleCondition = { + type: 'simple', + op: '=', + left: {type: 'literal', value: 1}, + right: {type: 'literal', value: 0}, +}; + +/** + * Checks if the subquery has at least one unique index whose columns + * are all equality-constrained by literal values. + */ +export function isSimpleSubquery( + subquery: AST, + tableSpecs: Map, +): boolean { + const spec = tableSpecs.get(subquery.table); + if (!spec) { + return false; + } + + if (!subquery.where) { + return false; + } + + const constraints = extractLiteralEqualityConstraints(subquery.where); + if (constraints.size === 0) { + return false; + } + + const {uniqueKeys} = spec.tableSpec; + return uniqueKeys.some(key => key.every(col => constraints.has(col))); +} + +/** + * Extracts column=literal equality constraints from a condition tree, + * only following AND conjunctions (not OR). + */ +export function extractLiteralEqualityConstraints( + condition: Condition, +): Map { + const constraints = new Map(); + collectConstraints(condition, constraints); + return constraints; +} + +function collectConstraints( + condition: Condition, + constraints: Map, +): void { + switch (condition.type) { + case 'simple': + if (condition.op === '=') { + if ( + condition.left.type === 'column' && + condition.right.type === 'literal' + ) { + constraints.set(condition.left.name, condition.right.value); + } + } + break; + case 'and': + for (const c of condition.conditions) { + collectConstraints(c, constraints); + } + break; + // OR, correlatedSubquery, scalarSubquery — don't contribute constraints + default: + break; + } +} From 740b4f731fe46dce8e1191103b3a93513c27ad44 Mon Sep 17 00:00:00 2001 From: jbingen Date: Thu, 5 Feb 2026 20:44:16 +0100 Subject: [PATCH 026/495] fix(push): forward fresh auth token with each push message (#5503) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes expired token errors when zero-cache pushes mutations to upstream API when client token expires after connection was established: 1. client connects with valid JWT → zero-cache stores in `#token` 2. time passes, original token expires 3. client sends mutation with fresh token in push body 4. zero-cache pushes to API using stale `#token` 5. API returns 401, mutation fails and is marked processed (data loss) the fix implements the DEPRECATED comment on `#token` - forward auth from the push message instead of using the cached connection token: - add optional `auth` field to `PushBody` schema - client includes `auth: currentToken` with each push - zero-cache uses `msg[1].auth ?? this.#token` backwards compatible - falls back to connection token if push auth is absent. ## test plan - added tests for auth forwarding in syncer-ws-message-handler - tests verify push auth is preferred over connection token - tests verify fallback when push auth is absent - all existing tests pass --------- Co-authored-by: Matt Wonlaw --- .../workers/syncer-ws-message-handler.test.ts | 232 ++++++++++++++++++ .../src/workers/syncer-ws-message-handler.ts | 8 +- .../src/client/protocol-version-url.test.ts | 2 +- packages/zero-client/src/client/zero.test.ts | 3 + packages/zero-client/src/client/zero.ts | 2 + packages/zero-protocol/src/ast.test.ts | 2 +- .../src/protocol-version.test.ts | 4 +- .../zero-protocol/src/protocol-version.ts | 3 +- packages/zero-protocol/src/push.ts | 3 + 9 files changed, 250 insertions(+), 9 deletions(-) create mode 100644 packages/zero-cache/src/workers/syncer-ws-message-handler.test.ts diff --git a/packages/zero-cache/src/workers/syncer-ws-message-handler.test.ts b/packages/zero-cache/src/workers/syncer-ws-message-handler.test.ts new file mode 100644 index 0000000000..b4e06ed0a1 --- /dev/null +++ b/packages/zero-cache/src/workers/syncer-ws-message-handler.test.ts @@ -0,0 +1,232 @@ +import {beforeEach, describe, expect, test, vi} from 'vitest'; +import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; +import type {Mutagen} from '../services/mutagen/mutagen.ts'; +import type {Pusher} from '../services/mutagen/pusher.ts'; +import type {ViewSyncer} from '../services/view-syncer/view-syncer.ts'; +import type {ConnectParams} from './connect-params.ts'; +import {SyncerWsMessageHandler} from './syncer-ws-message-handler.ts'; + +const lc = createSilentLogContext(); + +function createMockPusher() { + return { + enqueuePush: vi.fn().mockReturnValue({type: 'ok'}), + initConnection: vi.fn(), + } as unknown as Pusher; +} + +function createMockMutagen() { + return { + processMutation: vi.fn().mockResolvedValue(undefined), + } as unknown as Mutagen; +} + +function createMockViewSyncer() { + return {} as unknown as ViewSyncer; +} + +function createConnectParams( + overrides: Partial = {}, +): ConnectParams { + return { + clientGroupID: 'test-client-group', + clientID: 'test-client', + profileID: 'test-profile', + wsID: 'test-ws', + baseCookie: null, + protocolVersion: 30, + timestamp: Date.now(), + lmID: 0, + debugPerf: false, + auth: undefined, + userID: 'test-user', + initConnectionMsg: undefined, + httpCookie: undefined, + origin: undefined, + ...overrides, + }; +} + +describe('SyncerWsMessageHandler push auth handling', () => { + let pusher: ReturnType; + let mutagen: ReturnType; + let viewSyncer: ReturnType; + + beforeEach(() => { + pusher = createMockPusher(); + mutagen = createMockMutagen(); + viewSyncer = createMockViewSyncer(); + }); + + test('uses auth from push message when provided', async () => { + const connectionToken = 'old-connection-token'; + const freshPushToken = 'fresh-push-token'; + + const handler = new SyncerWsMessageHandler( + lc, + createConnectParams(), + {raw: connectionToken, decoded: {sub: 'user-1'}}, + viewSyncer, + mutagen, + pusher, + ); + + await handler.handleMessage([ + 'push', + { + clientGroupID: 'test-client-group', + mutations: [ + { + type: 'custom', + id: 1, + clientID: 'test-client', + name: 'testMutation', + args: [], + timestamp: Date.now(), + }, + ], + pushVersion: 1, + schemaVersion: 1, + timestamp: Date.now(), + requestID: 'req-1', + auth: freshPushToken, // fresh auth sent with push + }, + ]); + + // should use the fresh token from push, not the stale connection token + expect(pusher.enqueuePush).toHaveBeenCalledWith( + 'test-client', + expect.any(Object), + freshPushToken, // this is the key assertion + undefined, + undefined, + ); + }); + + test('falls back to connection token when push auth is not provided', async () => { + const connectionToken = 'connection-token'; + + const handler = new SyncerWsMessageHandler( + lc, + createConnectParams(), + {raw: connectionToken, decoded: {sub: 'user-1'}}, + viewSyncer, + mutagen, + pusher, + ); + + await handler.handleMessage([ + 'push', + { + clientGroupID: 'test-client-group', + mutations: [ + { + type: 'custom', + id: 1, + clientID: 'test-client', + name: 'testMutation', + args: [], + timestamp: Date.now(), + }, + ], + pushVersion: 1, + schemaVersion: 1, + timestamp: Date.now(), + requestID: 'req-1', + // no auth field - should fall back to connection token + }, + ]); + + expect(pusher.enqueuePush).toHaveBeenCalledWith( + 'test-client', + expect.any(Object), + connectionToken, // falls back to connection token + undefined, + undefined, + ); + }); + + test('handles undefined connection token with push auth', async () => { + const freshPushToken = 'fresh-push-token'; + + const handler = new SyncerWsMessageHandler( + lc, + createConnectParams(), + undefined, // no token data at connection time + viewSyncer, + mutagen, + pusher, + ); + + await handler.handleMessage([ + 'push', + { + clientGroupID: 'test-client-group', + mutations: [ + { + type: 'custom', + id: 1, + clientID: 'test-client', + name: 'testMutation', + args: [], + timestamp: Date.now(), + }, + ], + pushVersion: 1, + schemaVersion: 1, + timestamp: Date.now(), + requestID: 'req-1', + auth: freshPushToken, + }, + ]); + + expect(pusher.enqueuePush).toHaveBeenCalledWith( + 'test-client', + expect.any(Object), + freshPushToken, + undefined, + undefined, + ); + }); + + test('handles both undefined - no auth forwarded', async () => { + const handler = new SyncerWsMessageHandler( + lc, + createConnectParams(), + undefined, // no token data + viewSyncer, + mutagen, + pusher, + ); + + await handler.handleMessage([ + 'push', + { + clientGroupID: 'test-client-group', + mutations: [ + { + type: 'custom', + id: 1, + clientID: 'test-client', + name: 'testMutation', + args: [], + timestamp: Date.now(), + }, + ], + pushVersion: 1, + schemaVersion: 1, + timestamp: Date.now(), + requestID: 'req-1', + // no auth field either + }, + ]); + + expect(pusher.enqueuePush).toHaveBeenCalledWith( + 'test-client', + expect.any(Object), + undefined, // both undefined = undefined + undefined, + undefined, + ); + }); +}); diff --git a/packages/zero-cache/src/workers/syncer-ws-message-handler.ts b/packages/zero-cache/src/workers/syncer-ws-message-handler.ts index 74cd975152..5bfe0f25df 100644 --- a/packages/zero-cache/src/workers/syncer-ws-message-handler.ts +++ b/packages/zero-cache/src/workers/syncer-ws-message-handler.ts @@ -30,9 +30,7 @@ export class SyncerWsMessageHandler implements MessageHandler { readonly #clientGroupID: string; readonly #syncContext: SyncContext; readonly #pusher: Pusher | undefined; - // DEPRECATED: remove #token - // and forward auth and cookie headers that were - // sent with the push. + // Fallback token from connection time - prefer auth from push message readonly #token: string | undefined; constructor( @@ -125,11 +123,13 @@ export class SyncerWsMessageHandler implements MessageHandler { this.#pusher, 'A ZERO_MUTATE_URL must be set in order to process custom mutations.', ); + // prefer fresh auth from push message over cached connection token + const authToken = msg[1].auth ?? this.#token; return [ this.#pusher.enqueuePush( this.#syncContext.clientID, msg[1], - this.#token, + authToken, this.#syncContext.httpCookie, this.#syncContext.origin, ), diff --git a/packages/zero-client/src/client/protocol-version-url.test.ts b/packages/zero-client/src/client/protocol-version-url.test.ts index 93d8ee5335..71c05924e2 100644 --- a/packages/zero-client/src/client/protocol-version-url.test.ts +++ b/packages/zero-client/src/client/protocol-version-url.test.ts @@ -34,5 +34,5 @@ test('When the URL changes we need to update the protocol version', async () => // might not understand it. You may need to bump the PROTOCOL_VERSION and // update the expected values. expect(hash).toBe('10r2tfvet9a3s'); - expect(PROTOCOL_VERSION).toBe(46); + expect(PROTOCOL_VERSION).toBe(47); }); diff --git a/packages/zero-client/src/client/zero.test.ts b/packages/zero-client/src/client/zero.test.ts index b5ea08af4b..237eab817e 100644 --- a/packages/zero-client/src/client/zero.test.ts +++ b/packages/zero-client/src/client/zero.test.ts @@ -4175,6 +4175,7 @@ test('custom mutations get pushed', async () => { [ 'push', { + auth: 'test-auth', timestamp: 1678829450000, clientGroupID: await z.clientGroupID, mutations: [ @@ -4193,6 +4194,7 @@ test('custom mutations get pushed', async () => { [ 'push', { + auth: 'test-auth', timestamp: 1678829450000, clientGroupID: await z.clientGroupID, mutations: [ @@ -4211,6 +4213,7 @@ test('custom mutations get pushed', async () => { [ 'push', { + auth: 'test-auth', timestamp: 1678829450000, clientGroupID: await z.clientGroupID, mutations: [ diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index a223dcf708..938e167cf1 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -1857,6 +1857,8 @@ export class Zero< mutations: [zeroM], pushVersion: req.pushVersion, requestID, + // include fresh auth with each push to avoid stale token issues + auth: fromReplicacheAuthToken(this.#rep.auth), }, ]; send(socket, msg); diff --git a/packages/zero-protocol/src/ast.test.ts b/packages/zero-protocol/src/ast.test.ts index ae3dc10cd5..bc07c233c5 100644 --- a/packages/zero-protocol/src/ast.test.ts +++ b/packages/zero-protocol/src/ast.test.ts @@ -607,5 +607,5 @@ test('protocol version', () => { // old code will not understand the new schema, bump the // PROTOCOL_VERSION and update the expected values. expect(hash).toEqual('1b4tkghe24u7q'); - expect(PROTOCOL_VERSION).toBe(46); + expect(PROTOCOL_VERSION).toBe(47); }); diff --git a/packages/zero-protocol/src/protocol-version.test.ts b/packages/zero-protocol/src/protocol-version.test.ts index d3f9ba85f0..3a9f89335a 100644 --- a/packages/zero-protocol/src/protocol-version.test.ts +++ b/packages/zero-protocol/src/protocol-version.test.ts @@ -11,6 +11,6 @@ test('protocol version', () => { // If this test fails upstream or downstream schema has changed such that // old code will not understand the new schema, bump the // PROTOCOL_VERSION and update the expected values. - expect(hash).toEqual('2yts97hw5kfv0'); - expect(PROTOCOL_VERSION).toBe(46); + expect(hash).toEqual('7uu5tlrbke7p'); + expect(PROTOCOL_VERSION).toBe(47); }); diff --git a/packages/zero-protocol/src/protocol-version.ts b/packages/zero-protocol/src/protocol-version.ts index 534422cc48..3c1b47f2cc 100644 --- a/packages/zero-protocol/src/protocol-version.ts +++ b/packages/zero-protocol/src/protocol-version.ts @@ -52,7 +52,8 @@ import {assert} from '../../shared/src/asserts.ts'; // -- version 44 adds profileID to connection URL (0.25) // -- version 45 adds userPushHeaders and userQueryHeaders to initConnection (0.25) // -- version 46 adds scalarSubquery condition type to AST -export const PROTOCOL_VERSION = 46; +// -- version 47 adds optional auth token to push body +export const PROTOCOL_VERSION = 47; /** * The minimum server-supported sync protocol version (i.e. the version diff --git a/packages/zero-protocol/src/push.ts b/packages/zero-protocol/src/push.ts index 1a8419f37e..0b39266623 100644 --- a/packages/zero-protocol/src/push.ts +++ b/packages/zero-protocol/src/push.ts @@ -125,6 +125,9 @@ export const pushBodySchema = v.object({ schemaVersion: v.number().optional(), timestamp: v.number(), requestID: v.string(), + // Fresh auth token sent with each push - used instead of cached connection token + // to avoid expired token issues when pushing to upstream API + auth: v.string().optional(), }); export const pushMessageSchema = v.tuple([v.literal('push'), pushBodySchema]); From 14b5c03097b5d55118e9f34699322c63ad96e356 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Thu, 5 Feb 2026 15:20:33 -0500 Subject: [PATCH 027/495] =?UTF-8?q?feat(zero-cache):=20resolve=20scalar=20?= =?UTF-8?q?subqueries=20in=20addQuery=20before=20buildi=E2=80=A6=20(#5520)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …ng the IVM pipeline Before building the main IVM pipeline, resolve simple scalar subqueries by building a throwaway pipeline for each, fetching the value, and inlining the resulting literal into the AST. A future PR will keep track the companion subqueries so we can: 1. sync the data they fetched to the client 2. reactively update the parent query when an inlined subquery changes --- .../view-syncer/pipeline-driver.test.ts | 262 ++++++++++++++++++ .../services/view-syncer/pipeline-driver.ts | 190 ++++++++----- 2 files changed, 388 insertions(+), 64 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts index d2f47c3ced..1751470fa7 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts @@ -361,6 +361,48 @@ describe('view-syncer/pipeline-driver', () => { orderBy: [['id', 'desc']], }; + const ISSUES_WITH_SCALAR_SUBQUERY: AST = { + table: 'issues', + orderBy: [['id', 'asc']], + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'id', + childField: 'issueID', + subquery: { + table: 'comments', + orderBy: [['id', 'asc']], + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '10'}, + }, + }, + }, + }; + + const ISSUES_WITH_NONEXISTENT_SCALAR_SUBQUERY: AST = { + table: 'issues', + orderBy: [['id', 'asc']], + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'id', + childField: 'issueID', + subquery: { + table: 'comments', + orderBy: [['id', 'asc']], + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 'nonexistent'}, + }, + }, + }, + }; + const messages = new ReplicationMessages({ issues: 'id', comments: 'id', @@ -1768,4 +1810,224 @@ describe('view-syncer/pipeline-driver', () => { expect(() => changes()).toThrowError(); }); + + test('scalar subquery resolves to literal', () => { + pipelines.init(clientSchema); + + // Comment '10' has issueID='1', so the subquery resolves to id = '1' + const results = [ + ...pipelines.addQuery( + 'hash-scalar', + 'queryScalar', + ISSUES_WITH_SCALAR_SUBQUERY, + startTimer(), + ), + ]; + + expect(results).toMatchInlineSnapshot(` + [ + { + "queryID": "queryScalar", + "row": { + "_0_version": "123", + "closed": false, + "id": "1", + }, + "rowKey": { + "id": "1", + }, + "table": "issues", + "type": "add", + }, + { + "queryID": "queryScalar", + "row": { + "_0_version": "123", + "id": "10", + "issueID": "1", + "upvotes": 0, + }, + "rowKey": { + "id": "10", + }, + "table": "comments", + "type": "add", + }, + ] + `); + + // The transformedAst should have the scalar subquery resolved to a simple condition + expect( + pipelines.queries().get('queryScalar')?.transformedAst.where, + ).toEqual({ + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '1'}, + }); + }); + + test('scalar subquery with no matching rows', () => { + pipelines.init(clientSchema); + + const results = [ + ...pipelines.addQuery( + 'hash-scalar-none', + 'queryScalarNone', + ISSUES_WITH_NONEXISTENT_SCALAR_SUBQUERY, + startTimer(), + ), + ]; + + expect(results).toEqual([]); + + // The transformedAst should have ALWAYS_FALSE + expect( + pipelines.queries().get('queryScalarNone')?.transformedAst.where, + ).toEqual({ + type: 'simple', + op: '=', + left: {type: 'literal', value: 1}, + right: {type: 'literal', value: 0}, + }); + }); + + test('scalar subquery in AND with other conditions', () => { + pipelines.init(clientSchema); + + const queryWithAnd: AST = { + table: 'issues', + orderBy: [['id', 'asc']], + where: { + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'closed'}, + right: {type: 'literal', value: false}, + }, + { + type: 'scalarSubquery', + op: '=', + parentField: 'id', + childField: 'issueID', + subquery: { + table: 'comments', + orderBy: [['id', 'asc']], + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '10'}, + }, + }, + }, + ], + }, + }; + + const results = [ + ...pipelines.addQuery( + 'hash-scalar-and', + 'queryScalarAnd', + queryWithAnd, + startTimer(), + ), + ]; + + // Issue '1' is not closed and matches the subquery + expect(results).toMatchInlineSnapshot(` + [ + { + "queryID": "queryScalarAnd", + "row": { + "_0_version": "123", + "closed": false, + "id": "1", + }, + "rowKey": { + "id": "1", + }, + "table": "issues", + "type": "add", + }, + { + "queryID": "queryScalarAnd", + "row": { + "_0_version": "123", + "id": "10", + "issueID": "1", + "upvotes": 0, + }, + "rowKey": { + "id": "10", + }, + "table": "comments", + "type": "add", + }, + ] + `); + + // The transformedAst should have the scalar subquery resolved within the AND + expect( + pipelines.queries().get('queryScalarAnd')?.transformedAst.where, + ).toEqual({ + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'closed'}, + right: {type: 'literal', value: false}, + }, + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '1'}, + }, + ], + }); + }); + + test('advancement after scalar subquery resolution', () => { + pipelines.init(clientSchema); + + // This resolves to `issues WHERE id = '1'` + [ + ...pipelines.addQuery( + 'hash-scalar', + 'queryScalar', + ISSUES_WITH_SCALAR_SUBQUERY, + startTimer(), + ), + ]; + + replicator.processTransaction( + '134', + messages.insert('issues', {id: '5', closed: 0}), + messages.update('issues', {id: '1', closed: 1}), + ); + + // Only the edit to issue '1' should appear (it matches the resolved filter), + // NOT the insert of issue '5' (which doesn't match id = '1'). + expect(changes()).toMatchInlineSnapshot(` + [ + { + "queryID": "queryScalar", + "row": { + "_0_version": "134", + "closed": true, + "id": "1", + }, + "rowKey": { + "id": "1", + }, + "table": "issues", + "type": "edit", + }, + ] + `); + }); }); diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 875bcc85ad..7f06e92da4 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -2,7 +2,7 @@ import type {LogContext} from '@rocicorp/logger'; import {assert, unreachable} from '../../../../shared/src/asserts.ts'; import {deepEqual, type JSONValue} from '../../../../shared/src/json.ts'; import {must} from '../../../../shared/src/must.ts'; -import type {AST} from '../../../../zero-protocol/src/ast.ts'; +import type {AST, LiteralValue} from '../../../../zero-protocol/src/ast.ts'; import type {ClientSchema} from '../../../../zero-protocol/src/client-schema.ts'; import type {Row} from '../../../../zero-protocol/src/data.ts'; import type {PrimaryKey} from '../../../../zero-protocol/src/primary-key.ts'; @@ -13,7 +13,12 @@ import { } from '../../../../zql/src/builder/debug-delegate.ts'; import type {Change} from '../../../../zql/src/ivm/change.ts'; import type {Node} from '../../../../zql/src/ivm/data.ts'; -import {type Input, type Storage} from '../../../../zql/src/ivm/operator.ts'; +import { + type Input, + skipYields, + type Storage, +} from '../../../../zql/src/ivm/operator.ts'; +import {first} from '../../../../zql/src/ivm/stream.ts'; import type {SourceSchema} from '../../../../zql/src/ivm/schema.ts'; import type { Source, @@ -24,6 +29,7 @@ import type {ConnectionCostModel} from '../../../../zql/src/planner/planner-conn import {MeasurePushOperator} from '../../../../zql/src/query/measure-push-operator.ts'; import type {ClientGroupStorage} from '../../../../zqlite/src/database-storage.ts'; import type {Database} from '../../../../zqlite/src/db.ts'; +import {resolveSimpleScalarSubqueries} from '../../../../zqlite/src/resolve-scalar-subqueries.ts'; import {createSQLiteCostModel} from '../../../../zqlite/src/sqlite-cost-model.ts'; import {TableSource} from '../../../../zqlite/src/table-source.ts'; import { @@ -308,6 +314,48 @@ export class PipelineDriver { return total; } + #resolveScalarSubqueries(ast: AST): { + ast: AST; + companionRows: {table: string; row: Row}[]; + } { + const companionRows: {table: string; row: Row}[] = []; + + const executor = ( + subqueryAST: AST, + childField: string, + ): LiteralValue | null | undefined => { + const input = buildPipeline( + subqueryAST, + { + getSource: name => this.#getSource(name), + createStorage: () => this.#createStorage(), + decorateSourceInput: (input: SourceInput): Input => input, + decorateInput: input => input, + addEdge() {}, + decorateFilterInput: input => input, + }, + 'scalar-subquery', + ); + try { + const node = first(skipYields(input.fetch({}))); + if (!node) { + return undefined; + } + companionRows.push({table: subqueryAST.table, row: node.row as Row}); + return (node.row[childField] as LiteralValue) ?? null; + } finally { + input.destroy(); + } + }; + + const {ast: resolved} = resolveSimpleScalarSubqueries( + ast, + this.#tableSpecs, + executor, + ); + return {ast: resolved, companionRows}; + } + /** * Adds a pipeline for the query. The method will hydrate the query using the * driver's current snapshot of the database and return a stream of results. @@ -342,37 +390,6 @@ export class PipelineDriver { this.#snapshotter.current().db.db, ); - const input = buildPipeline( - query, - { - debug: debugDelegate, - enableNotExists: true, // Server-side can handle NOT EXISTS - getSource: name => this.#getSource(name), - createStorage: () => this.#createStorage(), - decorateSourceInput: (input: SourceInput, _queryID: string): Input => - new MeasurePushOperator( - input, - queryID, - this.#inspectorDelegate, - 'query-update-server', - ), - decorateInput: input => input, - addEdge() {}, - decorateFilterInput: input => input, - }, - queryID, - costModel, - ); - const schema = input.getSchema(); - input.setOutput({ - push: change => { - const streamer = this.#streamer; - assert(streamer, 'must #startAccumulating() before pushing changes'); - streamer.accumulate(queryID, schema, [change]); - return []; - }, - }); - assert( this.#advanceContext === null, 'Cannot hydrate while advance is in progress', @@ -381,42 +398,87 @@ export class PipelineDriver { timer, }; try { + const {ast: resolvedQuery, companionRows} = + this.#resolveScalarSubqueries(query); + + const input = buildPipeline( + resolvedQuery, + { + debug: debugDelegate, + enableNotExists: true, // Server-side can handle NOT EXISTS + getSource: name => this.#getSource(name), + createStorage: () => this.#createStorage(), + decorateSourceInput: (input: SourceInput, _queryID: string): Input => + new MeasurePushOperator( + input, + queryID, + this.#inspectorDelegate, + 'query-update-server', + ), + decorateInput: input => input, + addEdge() {}, + decorateFilterInput: input => input, + }, + queryID, + costModel, + ); + const schema = input.getSchema(); + input.setOutput({ + push: change => { + const streamer = this.#streamer; + assert(streamer, 'must #startAccumulating() before pushing changes'); + streamer.accumulate(queryID, schema, [change]); + return []; + }, + }); + yield* hydrateInternal(input, queryID, must(this.#primaryKeys)); - } finally { - this.#hydrateContext = null; - } - const hydrationTimeMs = timer.totalElapsed(); - if (runtimeDebugFlags.trackRowCountsVended) { - if (hydrationTimeMs > this.#logConfig.slowHydrateThreshold) { - let totalRowsConsidered = 0; - const lc = this.#lc - .withContext('queryID', queryID) - .withContext('hydrationTimeMs', hydrationTimeMs); - for (const tableName of this.#tables.keys()) { - const entries = Object.entries( - debugDelegate?.getVendedRowCounts()[tableName] ?? {}, - ); - totalRowsConsidered += entries.reduce( - (acc, entry) => acc + entry[1], - 0, - ); - lc.info?.(tableName + ' VENDED: ', entries); + for (const {table, row} of companionRows) { + const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table); + yield { + type: 'add', + queryID, + table, + rowKey: getRowKey(primaryKey, row), + row, + } as RowChange; + } + + const hydrationTimeMs = timer.totalElapsed(); + if (runtimeDebugFlags.trackRowCountsVended) { + if (hydrationTimeMs > this.#logConfig.slowHydrateThreshold) { + let totalRowsConsidered = 0; + const lc = this.#lc + .withContext('queryID', queryID) + .withContext('hydrationTimeMs', hydrationTimeMs); + for (const tableName of this.#tables.keys()) { + const entries = Object.entries( + debugDelegate?.getVendedRowCounts()[tableName] ?? {}, + ); + totalRowsConsidered += entries.reduce( + (acc, entry) => acc + entry[1], + 0, + ); + lc.info?.(tableName + ' VENDED: ', entries); + } + lc.info?.(`Total rows considered: ${totalRowsConsidered}`); } - lc.info?.(`Total rows considered: ${totalRowsConsidered}`); } + debugDelegate?.reset(); + + // Note: This hydrationTime is a wall-clock overestimate, as it does + // not take time slicing into account. The view-syncer resets this + // to a more precise processing-time measurement with setHydrationTime(). + this.#pipelines.set(queryID, { + input, + hydrationTimeMs, + transformedAst: resolvedQuery, + transformationHash, + }); + } finally { + this.#hydrateContext = null; } - debugDelegate?.reset(); - - // Note: This hydrationTime is a wall-clock overestimate, as it does - // not take time slicing into account. The view-syncer resets this - // to a more precise processing-time measurement with setHydrationTime(). - this.#pipelines.set(queryID, { - input, - hydrationTimeMs, - transformedAst: query, - transformationHash, - }); } /** From 8a25fda0f5099983de876813839226e08ede3934 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 5 Feb 2026 16:59:22 -0800 Subject: [PATCH 028/495] chore(zero-cache): add change-source multiplexing in preparation for backfill streams (#5523) Adds a `ChangeStreamMultiplexer` class to facilitate multiplexing of streams into downstream changes. This will allow the replication stream and upcoming backfill stream to: * cooperatively push their messages, isolated at correct transaction boundaries * prioritize replication messages over backfill messages by having each entity implement respective yielding policies Currently there is still only one "producer" (the replication stream). However, some of the streaming internals have been changed (including the addition of a buffer in the pipeline) so that the replication logic can determine if upstream changes are immediately available. --- .../change-source/pg/change-source.ts | 53 +++++-- .../pg/change-stream-multiplexer.test.ts | 117 ++++++++++++++ .../pg/change-stream-multiplexer.ts | 144 ++++++++++++++++++ .../pg/logical-replication/stream.ts | 22 ++- packages/zero-cache/src/types/streams.ts | 52 +++++-- packages/zero-cache/src/types/subscription.ts | 2 +- 6 files changed, 364 insertions(+), 26 deletions(-) create mode 100644 packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.test.ts create mode 100644 packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.ts diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 9510c53e64..018f0510ff 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -34,7 +34,6 @@ import { majorVersionToString, } from '../../../types/state-version.ts'; import type {Sink} from '../../../types/streams.ts'; -import {Subscription, type PendingResult} from '../../../types/subscription.ts'; import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; import { getSubscriptionState, @@ -53,6 +52,7 @@ import type { ChangeStreamMessage, Data, } from '../protocol/current/downstream.ts'; +import {ChangeStreamMultiplexer} from './change-stream-multiplexer.ts'; import {type InitialSyncOptions} from './initial-sync.ts'; import type { Message, @@ -205,6 +205,9 @@ async function checkAndUpdateUpstream( return upstreamReplica; } +// Parameterize this if necessary. In practice starvation may never happen. +const MAX_LOW_PRIORITY_DELAY_MS = 1000; + /** * Postgres implementation of a {@link ChangeSource} backed by a logical * replication stream. @@ -266,9 +269,15 @@ class PostgresChangeSource implements ChangeSource { clientStart, ); - const changes = Subscription.create({ - cleanup: () => messages.cancel(), - }); + // At the moment the replication stream is the only producer of changes, + // so the ChangeStreamMultiplexer is largely a no-op, but these is where + // backfill streams will enter the picture. + const changes = new ChangeStreamMultiplexer( + this.#lc, + clientWatermark, + [messages], + [], + ); const acker = new Acker(acks); const changeMaker = new ChangeMaker( @@ -281,22 +290,48 @@ class PostgresChangeSource implements ChangeSource { void (async function () { try { + let reserved = false; + for await (const [lsn, msg] of messages) { + // Note: no reservation is needed for pushStatus(). if (msg.tag === 'keepalive') { - changes.push([ + changes.pushStatus([ 'status', msg, {watermark: majorVersionToString(lsn)}, ]); continue; } - let last: PendingResult | undefined; + + if (!reserved) { + const res = changes.reserve('replication'); + typeof res === 'string' || (await res); // awaits should be uncommon + reserved = true; + } + + let lastChange: ChangeStreamMessage | undefined; for (const change of await changeMaker.makeChanges(lsn, msg)) { - last = changes.push(change); + await changes.push(change); // Allow the change-streamer to push back. + lastChange = change; + } + + if ( + lastChange?.[0] === 'commit' && + (messages.queued === 0 || + changes.waiterDelay() > MAX_LOW_PRIORITY_DELAY_MS) + ) { + // After each transaction, release the reservation: + // - if there are no pending upstream messages + // - or if a low priority request has been waiting for longer + // than MAX_LOW_PRIORITY_DELAY_MS. This is to prevent + // (backfill) starvation on very active upstreams. + changes.release(lastChange[2].watermark); + reserved = false; } - await last?.result; // Allow the change-streamer to push back. } } catch (e) { + // Note: no need to worry about reservations here since downstream + // is being completely canceled. changes.fail(translateError(e)); } })(); @@ -308,7 +343,7 @@ class PostgresChangeSource implements ChangeSource { ); return { - changes, + changes: changes.asSource(), acks: {push: status => acker.ack(status[2].watermark)}, }; } diff --git a/packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.test.ts b/packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.test.ts new file mode 100644 index 0000000000..ddc2e9e7c5 --- /dev/null +++ b/packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.test.ts @@ -0,0 +1,117 @@ +import { + type MockedFunction, + beforeEach, + describe, + expect, + test, + vi, +} from 'vitest'; +import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import type {ChangeStreamMessage} from '../protocol/current.ts'; +import {ChangeStreamMultiplexer} from './change-stream-multiplexer.ts'; + +type CancelFn = () => void; +type ListenFn = (message: ChangeStreamMessage) => void; + +describe('change-stream-multiplexer', () => { + let stream: ChangeStreamMultiplexer; + let cancelFn1: MockedFunction; + let cancelFn2: MockedFunction; + let listenFn1: MockedFunction; + let listenFn2: MockedFunction; + + beforeEach(() => { + cancelFn1 = vi.fn(); + cancelFn2 = vi.fn(); + listenFn1 = vi.fn(); + listenFn2 = vi.fn(); + + stream = new ChangeStreamMultiplexer( + createSilentLogContext(), + '123', + [{cancel: cancelFn1}, {cancel: cancelFn2}], + [{onChange: listenFn1}, {onChange: listenFn2}], + ); + }); + + test('reservations', async () => { + // pushStatus() does not require a reservation. + stream.pushStatus(['status', {tag: 'status'}, {watermark: 'foo'}]); + + // However, other pushes should fail with an assert. + expect(() => + stream.push(['begin', {tag: 'begin'}, {commitWatermark: '123'}]), + ).toThrowError(); + + const res1 = stream.reserve('foo'); + expect(res1).toBe('123'); + + expect(stream.waiterDelay()).toBeLessThan(0); + + // Already reserved, should be a promise. + const res2 = stream.reserve('bar'); + expect(res2).toBeInstanceOf(Promise); + + expect(stream.waiterDelay()).toBeGreaterThan(0); + + // A third request waits in line. + const res3 = stream.reserve('baz'); + expect(res3).toBeInstanceOf(Promise); + + expect(stream.waiterDelay()).toBeGreaterThan(0); + + // The first producer releases the reservation. + stream.release('156'); + expect(await res2).toBe('156'); + + // There's still one producer in line + expect(stream.waiterDelay()).toBeGreaterThan(0); + + stream.release('28da'); + expect(await res3).toBe('28da'); + + expect(stream.waiterDelay()).toBeLessThan(0); + + // Relinquish the final reservation. + stream.release('2e82'); + + // No Promise required to reserve. + expect(stream.reserve('foo')).toBe('2e82'); + }); + + test('cancelation', () => { + expect(cancelFn1).not.toBeCalled(); + expect(cancelFn2).not.toBeCalled(); + + stream.fail(new Error('foo')); + + expect(cancelFn1).toHaveBeenCalledOnce(); + expect(cancelFn2).toHaveBeenCalledOnce(); + }); + + test('listeners', () => { + expect(listenFn1).not.toBeCalled(); + expect(listenFn1).not.toBeCalled(); + + const begin: ChangeStreamMessage = [ + 'begin', + {tag: 'begin'}, + {commitWatermark: '123'}, + ]; + void stream.reserve('foo'); + void stream.push(begin); + + expect(listenFn1).toHaveBeenCalledExactlyOnceWith(begin); + expect(listenFn2).toHaveBeenCalledExactlyOnceWith(begin); + + const commit: ChangeStreamMessage = [ + 'commit', + {tag: 'commit'}, + {watermark: '123'}, + ]; + void stream.push(commit); + + expect(listenFn1).toHaveBeenNthCalledWith(2, commit); + expect(listenFn2).toHaveBeenNthCalledWith(2, commit); + }); +}); diff --git a/packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.ts b/packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.ts new file mode 100644 index 0000000000..9d45599f75 --- /dev/null +++ b/packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.ts @@ -0,0 +1,144 @@ +import type {LogContext} from '@rocicorp/logger'; +import {resolver} from '@rocicorp/resolver'; +import {assert} from '../../../../../shared/src/asserts.ts'; +import type {Source} from '../../../types/streams.ts'; +import {Subscription} from '../../../types/subscription.ts'; +import type {ChangeStreamMessage, StatusMessage} from '../protocol/current.ts'; + +type Cancelable = { + cancel(): void; +}; + +type Listener = { + onChange(change: ChangeStreamMessage): void; +}; + +type Waiter = { + producer: string; + startTime: number; + grantReservation: (watermark: string) => void; +}; + +/** + * Facilitates cooperative multiplexing of transactions from + * multiple producers into a single change stream. + */ +export class ChangeStreamMultiplexer { + readonly #lc: LogContext; + readonly #sub: Subscription; + readonly #listeners: Listener[]; + + /** + * The `#lastWatermark` tracks the watermark of the last transaction + * committed to stream. It is set to null when a producer has reserved + * the stream, and set to the new watermark when the producer releases + * the reservation. + */ + #lastWatermark: string | null; + + /** + * Tracks the queue of producers waiting for a reservation. + */ + readonly #waiters: Waiter[] = []; + + constructor( + lc: LogContext, + lastWatermark: string, + producers: Cancelable[], + listeners: Listener[], + ) { + this.#lc = lc; + this.#sub = Subscription.create({ + cleanup: () => producers.forEach(p => p.cancel()), + }); + this.#listeners = listeners; + this.#lastWatermark = lastWatermark; + } + + /** + * Called by a producer to "reserve" the exclusive right to push data + * changes to the stream. If the stream is currently reserved, + * the resulting Promise must be awaited. + * + * The producer must then {@link release()} the reservation when it sees + * fit. + * + * @param producer The name of the producer, purely for debugging output + */ + reserve(producer: string): string | Promise { + if (this.#lastWatermark !== null) { + // If the stream is not reserved, reserve it and return the + // watermark. + const lastWatermark = this.#lastWatermark; + this.#lastWatermark = null; + return lastWatermark; + } + + // Otherwise, wait for the current reservation to be released. + const startTime = performance.now(); + const {promise, resolve: grantReservation} = resolver(); + this.#waiters.push({producer, startTime, grantReservation}); + + return promise; + } + + /** + * If there are producers currently awaiting a reservation, returns + * the duration (in milliseconds) of the oldest reservation request. + * Returns a negative number if there are no waiters. + */ + waiterDelay(): number { + if (this.#waiters.length === 0) { + return -1; + } + return performance.now() - this.#waiters[0].startTime; + } + + /** + * Called by a producer to release its reservation after committing its + * last transaction. + */ + release(newWatermark: string) { + const waiter = this.#waiters.shift(); + if (!waiter) { + this.#lastWatermark = newWatermark; + } else { + const {producer, startTime, grantReservation} = waiter; + grantReservation(newWatermark); + const elapsed = performance.now() - startTime; + this.#lc.info?.( + `${producer} waited ${elapsed.toFixed(3)} ms for stream reservation`, + ); + } + } + + /** + * `pushStatus()` can be called without a reservation, as it + * does not constitute a data change and can appear anywhere + * in the stream. + */ + pushStatus(message: StatusMessage) { + this.#sub.push(message); + } + + /** + * `push()` must only be called by a producer after it has + * {@link reserve}d the stream. + */ + push(message: ChangeStreamMessage): Promise { + assert( + this.#lastWatermark === null, + `push() called without reserve()-ing the stream`, + ); + this.#listeners.forEach(l => l.onChange(message)); + return this.#sub.push(message).result; + } + + fail(err: Error) { + this.#sub.fail(err); + } + + asSource(): Source { + return this.#sub; + } +} diff --git a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts index cdabdf3352..eefd874d04 100644 --- a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts @@ -21,6 +21,13 @@ const DEFAULT_RETRIES_IF_REPLICATION_SLOT_ACTIVE = 5; export type StreamMessage = [lsn: bigint, Message | {tag: 'keepalive'}]; +// Expose the `queued` variable of the Subscription to allow +// the change-source to determine if there are more messages +// immediately available. +type SourceWithPendingQueue = Source & { + queued: number; +}; + export async function subscribe( lc: LogContext, db: PostgresDB, @@ -29,7 +36,10 @@ export async function subscribe( lsn: bigint, retriesIfReplicationSlotActive = DEFAULT_RETRIES_IF_REPLICATION_SLOT_ACTIVE, applicationName = 'zero-replicator', -): Promise<{messages: Source; acks: Sink}> { +): Promise<{ + messages: SourceWithPendingQueue; + acks: Sink; +}> { const session = postgres( defu( { @@ -117,7 +127,15 @@ export async function subscribe( lc.error?.(`error from ${db.options.host}`, e), ); - pipe(readable, messages, buffer => parseStreamMessage(lc, buffer, parser)); + pipe({ + source: readable, + sink: messages, + parse: buffer => parseStreamMessage(lc, buffer, parser), + // Allow a small buffer of messages to be queued in the subscription so + // that the change-source loop can check the queue to determine if more + // messages are immediately available. + bufferMessages: 5, + }); return { messages, diff --git a/packages/zero-cache/src/types/streams.ts b/packages/zero-cache/src/types/streams.ts index 362ce0ea01..640c338e67 100644 --- a/packages/zero-cache/src/types/streams.ts +++ b/packages/zero-cache/src/types/streams.ts @@ -14,6 +14,7 @@ import { type MessageEvent, type WebSocket, } from 'ws'; +import {assert} from '../../../shared/src/asserts.ts'; import {BigIntJSON, type JSONValue} from '../../../shared/src/bigint-json.ts'; import {Queue} from '../../../shared/src/queue.ts'; import * as v from '../../../shared/src/valita.ts'; @@ -128,9 +129,13 @@ export function stream( } // Incoming transform. - pipe(duplex, instream, chunk => { - const json = BigIntJSON.parse(chunk.toString()); - return v.parse(json, inSchema, 'passthrough'); + pipe({ + source: duplex, + sink: instream, + parse: chunk => { + const json = BigIntJSON.parse(chunk.toString()); + return v.parse(json, inSchema, 'passthrough'); + }, }); sendPingsForLiveness(lc, ws, PING_INTERVAL_MS); @@ -138,11 +143,18 @@ export function stream( return {outstream, instream}; } -export function pipe( - source: Readable, - sink: Subscription, - parse: (buffer: Buffer) => T | null, -) { +type PipeOptions = { + source: Readable; + sink: Subscription; + parse: (buffer: Buffer) => T | null; + bufferMessages?: number; +}; + +export function pipe({source, sink, parse, bufferMessages}: PipeOptions) { + bufferMessages ??= 0; + assert(bufferMessages >= 0); + const pending: Promise[] = []; + pipeline( source, new Writable({ @@ -158,13 +170,25 @@ export function pipe( callback(ensureError(err)); return; } + // Inbound backpressure is exerted by unconsumed messages in the + // subscription. A buffer can be used to allow messages to queue up in + // in the Subscription object, which allows the consumer to "peek" at + // whether there are more messages immediately available + // (via {@link Subscription.queued}. const {result} = sink.push(msg); - // Inbound backpressure is exerted by unconsumed - // messages in the subscription. - void result.then( - () => callback(), - err => callback(ensureError(err)), - ); + pending.push(result); + void result.then(() => pending.shift()); + + if (pending.length <= bufferMessages) { + // immediately allow more messages + callback(); + } else { + // wait for the oldest result in the pending queue + pending[0].then( + () => callback(), + err => callback(ensureError(err)), + ); + } }, destroy: (err, callback) => { if (err) { diff --git a/packages/zero-cache/src/types/subscription.ts b/packages/zero-cache/src/types/subscription.ts index b7615bac02..729ac2229e 100644 --- a/packages/zero-cache/src/types/subscription.ts +++ b/packages/zero-cache/src/types/subscription.ts @@ -173,7 +173,7 @@ export class Subscription implements Source, Sink { return this.#sentinel === undefined; } - /** The number messages waiting to be consumed. This is largely for testing. */ + /** The number messages waiting to be consumed. */ get queued(): number { return this.#messages.length; } From 7f0a21857dd6b68d34e1e200bb94bf4d5442c279 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 5 Feb 2026 18:06:46 -0800 Subject: [PATCH 029/495] chore(zero-cache): use an options object for configuring pg type serialization/parsing (#5524) Pure refactoring, helpful for an upcoming change --- .../src/services/change-source/pg/change-source.ts | 7 ++++++- .../src/services/change-source/pg/initial-sync.ts | 2 +- packages/zero-cache/src/types/pg.ts | 13 +++++++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 018f0510ff..f57ed5b57b 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -237,7 +237,12 @@ class PostgresChangeSource implements ChangeSource { if (backfillRequests.length) { throw new Error('not implemented yet'); } - const db = pgClient(this.#lc, this.#upstreamUri, {}, 'json-as-string'); + const db = pgClient( + this.#lc, + this.#upstreamUri, + {}, + {returnJsonAsString: true}, + ); const {slot} = this.#replica; let cleanup = promiseVoid; diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index c70ab75772..6ba54fac64 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -163,7 +163,7 @@ export async function initialSync( max: numWorkers, connection: {['application_name']: 'initial-sync-copy-worker'}, }, - 'json-as-string', + {returnJsonAsString: true}, ); const copiers = startTableCopyWorkers( lc, diff --git a/packages/zero-cache/src/types/pg.ts b/packages/zero-cache/src/types/pg.ts index 09fa13e035..aea573dca4 100644 --- a/packages/zero-cache/src/types/pg.ts +++ b/packages/zero-cache/src/types/pg.ts @@ -184,12 +184,17 @@ function dateToUTCMidnight(date: string): number { */ export type PostgresValueType = JSONValue | Uint8Array; +type TypeOptions = { + /** Returns JSON values as raw JSON strings (i.e. unparsed). */ + returnJsonAsString?: boolean; +}; + /** * Configures types for the Postgres.js client library (`postgres`). * * @param jsonAsString Keep JSON / JSONB values as strings instead of parsing. */ -export const postgresTypeConfig = (jsonAsString?: 'json-as-string') => ({ +export const postgresTypeConfig = ({returnJsonAsString}: TypeOptions = {}) => ({ // Type the type IDs as `number` so that Typescript doesn't complain about // referencing external types during type inference. types: { @@ -198,7 +203,7 @@ export const postgresTypeConfig = (jsonAsString?: 'json-as-string') => ({ to: JSON, from: [JSON, JSONB], serialize: BigIntJSON.stringify, - parse: jsonAsString ? (x: string) => x : BigIntJSON.parse, + parse: returnJsonAsString ? (x: string) => x : BigIntJSON.parse, }, // Timestamps are converted to PreciseDate objects. timestamp: { @@ -260,7 +265,7 @@ export function pgClient( bigint: PostgresType; json: PostgresType; }>, - jsonAsString?: 'json-as-string', + opts?: TypeOptions, ): PostgresDB { const onnotice = (n: Notice) => { // https://www.postgresql.org/docs/current/plpgsql-errors-and-messages.html#PLPGSQL-STATEMENTS-RAISE @@ -297,7 +302,7 @@ export function pgClient( const maxLifetimeSeconds = randInt(5 * 60, 10 * 60); return postgres(connectionURI, { - ...postgresTypeConfig(jsonAsString), + ...postgresTypeConfig(opts), onnotice, ['max_lifetime']: maxLifetimeSeconds, ssl, From 11e0711616064116e4f722d54589de8f3fa9897a Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Thu, 5 Feb 2026 21:40:33 -0500 Subject: [PATCH 030/495] feat(zbugs): use scalar subqueries instead of whereExists for foreign key lookups (#5522) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Summary - Refactor zbugs queries to use the new scalar() subquery API instead of whereExists() for foreign key lookups (project, creator, assignee, labels) - This produces more efficient queries — instead of EXISTS (SELECT ... JOIN ...), the query resolves to a direct equality comparison like WHERE projectID = '' - Add issueLabels relationship to the issue schema to support scalar-based label filtering through the join table # Test plan - Run zbugs locally and verify issue list loads correctly with project filtering - Verify label, creator, and assignee filters work in the list view - Verify the user list page filters (creators, assignees) work correctly - Verify label ordering in the sidebar --- apps/zbugs/shared/queries.ts | 73 +++++++++++++++---- apps/zbugs/shared/schema.ts | 5 ++ .../services/view-syncer/pipeline-driver.ts | 9 ++- 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/apps/zbugs/shared/queries.ts b/apps/zbugs/shared/queries.ts index e9e19bbbde..1a56d3128b 100644 --- a/apps/zbugs/shared/queries.ts +++ b/apps/zbugs/shared/queries.ts @@ -55,8 +55,14 @@ function labelsOrderByName({ orderBy?: 'asc' | 'desc' | undefined; }; }) { - let q = builder.label.whereExists('project', q => - q.where('lowerCaseName', projectName.toLocaleLowerCase()), + let q = builder.label.where(({cmp, scalar}) => + cmp( + 'projectID', + scalar( + builder.project.where('lowerCaseName', projectName.toLocaleLowerCase()), + 'id', + ), + ), ); if (orderBy !== undefined) { q = q.orderBy('name', orderBy); @@ -103,8 +109,17 @@ export const queries = defineQueries({ ({ctx: auth, args: {userID, projectName}}) => applyIssuePermissions( builder.issue - .whereExists('project', p => - p.where('lowerCaseName', projectName.toLocaleLowerCase()), + .where(({cmp, scalar}) => + cmp( + 'projectID', + scalar( + builder.project.where( + 'lowerCaseName', + projectName.toLocaleLowerCase(), + ), + 'id', + ), + ), ) .related('labels') .related('viewState', q => q.where('userID', userID)) @@ -147,14 +162,32 @@ export const queries = defineQueries({ ); } else if (filter === 'creators') { q = q.whereExists('createdIssues', i => - i.whereExists('project', p => - p.where('lowerCaseName', projectName.toLocaleLowerCase()), + i.where(({cmp, scalar}) => + cmp( + 'projectID', + scalar( + builder.project.where( + 'lowerCaseName', + projectName.toLocaleLowerCase(), + ), + 'id', + ), + ), ), ); } else if (filter === 'assignees') { q = q.whereExists('assignedIssues', i => - i.whereExists('project', p => - p.where('lowerCaseName', projectName.toLocaleLowerCase()), + i.where(({cmp, scalar}) => + cmp( + 'projectID', + scalar( + builder.project.where( + 'lowerCaseName', + projectName.toLocaleLowerCase(), + ), + 'id', + ), + ), ), ); } else { @@ -390,8 +423,14 @@ export function buildListQuery(args: ListQueryArgs) { const {projectName = ZERO_PROJECT_NAME} = listContext; - q = q.whereExists('project', q => - q.where('lowerCaseName', projectName.toLocaleLowerCase()), + q = q.where(({cmp, scalar}) => + cmp( + 'projectID', + scalar( + builder.project.where('lowerCaseName', projectName.toLocaleLowerCase()), + 'id', + ), + ), ); const {sortField, sortDirection} = listContext; @@ -411,13 +450,15 @@ export function buildListQuery(args: ListQueryArgs) { } const {open, creator, assignee, labels, textFilter} = listContext; - q = q.where(({and, cmp, exists, or}) => + q = q.where(({and, cmp, exists, or, scalar}) => and( // oxlint-disable-next-line eqeqeq open != null ? cmp('open', open) : undefined, - creator ? exists('creator', q => q.where('login', creator)) : undefined, + creator + ? cmp('creatorID', scalar(builder.user.where('login', creator), 'id')) + : undefined, assignee - ? exists('assignee', q => q.where('login', assignee)) + ? cmp('assigneeID', scalar(builder.user.where('login', assignee), 'id')) : undefined, textFilter ? or( @@ -429,7 +470,11 @@ export function buildListQuery(args: ListQueryArgs) { ) : undefined, ...(labels ?? []).map(label => - exists('labels', q => q.where('name', label)), + exists('issueLabels', q => + q.where(({cmp: c, scalar: s}) => + c('labelID', s(builder.label.where('name', label), 'id')), + ), + ), ), ), ); diff --git a/apps/zbugs/shared/schema.ts b/apps/zbugs/shared/schema.ts index 9e54e78673..d71d50f1a0 100644 --- a/apps/zbugs/shared/schema.ts +++ b/apps/zbugs/shared/schema.ts @@ -144,6 +144,11 @@ const issueRelationships = relationships(issue, ({many, one}) => ({ destField: ['id'], destSchema: project, }), + issueLabels: many({ + sourceField: ['id'], + destField: ['issueID'], + destSchema: issueLabel, + }), labels: many( { sourceField: ['id'], diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 7f06e92da4..60486c80d4 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -18,7 +18,6 @@ import { skipYields, type Storage, } from '../../../../zql/src/ivm/operator.ts'; -import {first} from '../../../../zql/src/ivm/stream.ts'; import type {SourceSchema} from '../../../../zql/src/ivm/schema.ts'; import type { Source, @@ -337,7 +336,13 @@ export class PipelineDriver { 'scalar-subquery', ); try { - const node = first(skipYields(input.fetch({}))); + // Consume the full stream rather than using first() to avoid + // triggering early return on Take's #initialFetch assertion. + // The subquery AST already has limit: 1, so at most one row is produced. + let node: Node | undefined; + for (const n of skipYields(input.fetch({}))) { + node ??= n; + } if (!node) { return undefined; } From 5eb1c4a1b37a7ad3db641e6a5ae08184734b1836 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Thu, 5 Feb 2026 22:13:37 -0500 Subject: [PATCH 031/495] Revert "feat(zbugs): use scalar subqueries instead of whereExists for foreign key lookups " (#5526) Reverts rocicorp/mono#5522 --- apps/zbugs/shared/queries.ts | 73 ++++--------------- apps/zbugs/shared/schema.ts | 5 -- .../services/view-syncer/pipeline-driver.ts | 9 +-- 3 files changed, 16 insertions(+), 71 deletions(-) diff --git a/apps/zbugs/shared/queries.ts b/apps/zbugs/shared/queries.ts index 1a56d3128b..e9e19bbbde 100644 --- a/apps/zbugs/shared/queries.ts +++ b/apps/zbugs/shared/queries.ts @@ -55,14 +55,8 @@ function labelsOrderByName({ orderBy?: 'asc' | 'desc' | undefined; }; }) { - let q = builder.label.where(({cmp, scalar}) => - cmp( - 'projectID', - scalar( - builder.project.where('lowerCaseName', projectName.toLocaleLowerCase()), - 'id', - ), - ), + let q = builder.label.whereExists('project', q => + q.where('lowerCaseName', projectName.toLocaleLowerCase()), ); if (orderBy !== undefined) { q = q.orderBy('name', orderBy); @@ -109,17 +103,8 @@ export const queries = defineQueries({ ({ctx: auth, args: {userID, projectName}}) => applyIssuePermissions( builder.issue - .where(({cmp, scalar}) => - cmp( - 'projectID', - scalar( - builder.project.where( - 'lowerCaseName', - projectName.toLocaleLowerCase(), - ), - 'id', - ), - ), + .whereExists('project', p => + p.where('lowerCaseName', projectName.toLocaleLowerCase()), ) .related('labels') .related('viewState', q => q.where('userID', userID)) @@ -162,32 +147,14 @@ export const queries = defineQueries({ ); } else if (filter === 'creators') { q = q.whereExists('createdIssues', i => - i.where(({cmp, scalar}) => - cmp( - 'projectID', - scalar( - builder.project.where( - 'lowerCaseName', - projectName.toLocaleLowerCase(), - ), - 'id', - ), - ), + i.whereExists('project', p => + p.where('lowerCaseName', projectName.toLocaleLowerCase()), ), ); } else if (filter === 'assignees') { q = q.whereExists('assignedIssues', i => - i.where(({cmp, scalar}) => - cmp( - 'projectID', - scalar( - builder.project.where( - 'lowerCaseName', - projectName.toLocaleLowerCase(), - ), - 'id', - ), - ), + i.whereExists('project', p => + p.where('lowerCaseName', projectName.toLocaleLowerCase()), ), ); } else { @@ -423,14 +390,8 @@ export function buildListQuery(args: ListQueryArgs) { const {projectName = ZERO_PROJECT_NAME} = listContext; - q = q.where(({cmp, scalar}) => - cmp( - 'projectID', - scalar( - builder.project.where('lowerCaseName', projectName.toLocaleLowerCase()), - 'id', - ), - ), + q = q.whereExists('project', q => + q.where('lowerCaseName', projectName.toLocaleLowerCase()), ); const {sortField, sortDirection} = listContext; @@ -450,15 +411,13 @@ export function buildListQuery(args: ListQueryArgs) { } const {open, creator, assignee, labels, textFilter} = listContext; - q = q.where(({and, cmp, exists, or, scalar}) => + q = q.where(({and, cmp, exists, or}) => and( // oxlint-disable-next-line eqeqeq open != null ? cmp('open', open) : undefined, - creator - ? cmp('creatorID', scalar(builder.user.where('login', creator), 'id')) - : undefined, + creator ? exists('creator', q => q.where('login', creator)) : undefined, assignee - ? cmp('assigneeID', scalar(builder.user.where('login', assignee), 'id')) + ? exists('assignee', q => q.where('login', assignee)) : undefined, textFilter ? or( @@ -470,11 +429,7 @@ export function buildListQuery(args: ListQueryArgs) { ) : undefined, ...(labels ?? []).map(label => - exists('issueLabels', q => - q.where(({cmp: c, scalar: s}) => - c('labelID', s(builder.label.where('name', label), 'id')), - ), - ), + exists('labels', q => q.where('name', label)), ), ), ); diff --git a/apps/zbugs/shared/schema.ts b/apps/zbugs/shared/schema.ts index d71d50f1a0..9e54e78673 100644 --- a/apps/zbugs/shared/schema.ts +++ b/apps/zbugs/shared/schema.ts @@ -144,11 +144,6 @@ const issueRelationships = relationships(issue, ({many, one}) => ({ destField: ['id'], destSchema: project, }), - issueLabels: many({ - sourceField: ['id'], - destField: ['issueID'], - destSchema: issueLabel, - }), labels: many( { sourceField: ['id'], diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 60486c80d4..7f06e92da4 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -18,6 +18,7 @@ import { skipYields, type Storage, } from '../../../../zql/src/ivm/operator.ts'; +import {first} from '../../../../zql/src/ivm/stream.ts'; import type {SourceSchema} from '../../../../zql/src/ivm/schema.ts'; import type { Source, @@ -336,13 +337,7 @@ export class PipelineDriver { 'scalar-subquery', ); try { - // Consume the full stream rather than using first() to avoid - // triggering early return on Take's #initialFetch assertion. - // The subquery AST already has limit: 1, so at most one row is produced. - let node: Node | undefined; - for (const n of skipYields(input.fetch({}))) { - node ??= n; - } + const node = first(skipYields(input.fetch({}))); if (!node) { return undefined; } From ffd8fed9991622d3b56f8817ee4d689b311cfadc Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Thu, 5 Feb 2026 17:17:52 -1000 Subject: [PATCH 032/495] fix(replicache): prevent IDB collection from deleting active databases (#5499) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://discord.com/channels/830183651022471199/1466749773334974600 See also https://github.com/rocicorp/mono/pull/5321 which was related to this same problem. The IDB database garbage collector was using `lastOpenedTimestampMS` to determine if a database was stale enough to collect. However, this timestamp was only set once when the database was opened, not updated during the database's lifetime. For long-running tabs (>48 hours), the collector would incorrectly mark the database as stale and attempt to delete all its clients—including the currently active one—triggering "cannot delete self in onClientsDeleted" assertion failures. The fix removes `lastOpenedTimestampMS` entirely and instead checks client `heartbeatTimestampMs` to determine if a database has active clients. Since clients update their heartbeat every 60 seconds, this provides an accurate and already-maintained signal for database activity. This eliminates redundant state and makes the collection logic consistent with how client GC already works. - Remove `lastOpenedTimestampMS` check from collection logic - Add heartbeat-based activity check in `canDatabaseBeCollectedAndGetDeletedClientIDs` - Deprecate `lastOpenedTimestampMS` field (kept for backwards compat) - Add regression test for the fix --- .../src/persist/collect-idb-databases.test.ts | 89 +++++++++++++---- .../src/persist/collect-idb-databases.ts | 31 +++--- .../src/persist/idb-databases-store.test.ts | 97 ++++--------------- .../src/persist/idb-databases-store.ts | 5 +- 4 files changed, 109 insertions(+), 113 deletions(-) diff --git a/packages/replicache/src/persist/collect-idb-databases.test.ts b/packages/replicache/src/persist/collect-idb-databases.test.ts index 245aadd10a..cd2908c262 100644 --- a/packages/replicache/src/persist/collect-idb-databases.test.ts +++ b/packages/replicache/src/persist/collect-idb-databases.test.ts @@ -47,13 +47,11 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { const makeIndexedDBDatabase = ({ name, - lastOpenedTimestampMS = Date.now(), replicacheFormatVersion = FormatVersion.Latest, schemaVersion = 'schemaVersion-' + name, replicacheName = 'replicacheName-' + name, }: { name: string; - lastOpenedTimestampMS?: number; replicacheFormatVersion?: number; schemaVersion?: string; replicacheName?: string; @@ -62,7 +60,6 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { replicacheFormatVersion, schemaVersion, replicacheName, - lastOpenedTimestampMS, }); const t = ({ @@ -206,7 +203,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { { const entries: Entries = [ [ - makeIndexedDBDatabase({name: 'a', lastOpenedTimestampMS: 0}), + makeIndexedDBDatabase({name: 'a'}), makeClientMap({ clientA1: { headHash: fakeHash('a1'), @@ -240,7 +237,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { { const entries: Entries = [ [ - makeIndexedDBDatabase({name: 'a', lastOpenedTimestampMS: 0}), + makeIndexedDBDatabase({name: 'a'}), makeClientMap({ clientA1: { headHash: fakeHash('a1'), @@ -249,7 +246,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { }), ], [ - makeIndexedDBDatabase({name: 'b', lastOpenedTimestampMS: 1000}), + makeIndexedDBDatabase({name: 'b'}), makeClientMap({ clientB1: { headHash: fakeHash('b1'), @@ -288,7 +285,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { { const entries: Entries = [ [ - makeIndexedDBDatabase({name: 'a', lastOpenedTimestampMS: 2000}), + makeIndexedDBDatabase({name: 'a'}), makeClientMap({ clientA1: { headHash: fakeHash('a1'), @@ -303,7 +300,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { }), ], [ - makeIndexedDBDatabase({name: 'b', lastOpenedTimestampMS: 1000}), + makeIndexedDBDatabase({name: 'b'}), makeClientMap({ clientB1: { headHash: fakeHash('b1'), @@ -350,7 +347,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { { const entries: Entries = [ [ - makeIndexedDBDatabase({name: 'a', lastOpenedTimestampMS: 3000}), + makeIndexedDBDatabase({name: 'a'}), makeClientMap({ clientA1: { headHash: fakeHash('a1'), @@ -368,7 +365,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { }), ], [ - makeIndexedDBDatabase({name: 'b', lastOpenedTimestampMS: 4000}), + makeIndexedDBDatabase({name: 'b'}), makeClientMap({ clientB1: { headHash: fakeHash('b1'), @@ -430,7 +427,6 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { [ makeIndexedDBDatabase({ name: 'a', - lastOpenedTimestampMS: 0, replicacheFormatVersion: FormatVersion.Latest + 1, }), makeClientMap({ @@ -473,7 +469,6 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { [ makeIndexedDBDatabase({ name: 'a', - lastOpenedTimestampMS: 0, replicacheFormatVersion: FormatVersion.V6, }), makeClientMap({ @@ -535,7 +530,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { { const entries: Entries = [ [ - makeIndexedDBDatabase({name: 'a', lastOpenedTimestampMS: 0}), + makeIndexedDBDatabase({name: 'a'}), makeClientMap({ clientA1: { headHash: fakeHash('a1'), @@ -571,7 +566,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { { const entries: Entries = [ [ - makeIndexedDBDatabase({name: 'a', lastOpenedTimestampMS: 0}), + makeIndexedDBDatabase({name: 'a'}), makeClientMap({ clientA1: { headHash: fakeHash('a1'), @@ -615,7 +610,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { { const entries: Entries = [ [ - makeIndexedDBDatabase({name: 'a', lastOpenedTimestampMS: 0}), + makeIndexedDBDatabase({name: 'a'}), makeClientMap({ clientA1: { headHash: fakeHash('a1'), @@ -636,7 +631,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { }), ], [ - makeIndexedDBDatabase({name: 'b', lastOpenedTimestampMS: 0}), + makeIndexedDBDatabase({name: 'b'}), makeClientMap({ clientB1: { headHash: fakeHash('b1'), @@ -673,7 +668,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { { const entries: Entries = [ [ - makeIndexedDBDatabase({name: 'a', lastOpenedTimestampMS: 0}), + makeIndexedDBDatabase({name: 'a'}), makeClientMap({ clientA1: { headHash: fakeHash('a1'), @@ -694,7 +689,7 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { }), ], [ - makeIndexedDBDatabase({name: 'b', lastOpenedTimestampMS: 0}), + makeIndexedDBDatabase({name: 'b'}), makeClientMap({ clientB1: { headHash: fakeHash('b1'), @@ -775,6 +770,64 @@ describe('collectIDBDatabases', {timeout: 20_000}, () => { } }); +test('should not collect database with actively heartbeating client', async () => { + const store = new IDBDatabasesStore(_ => new TestMemStore()); + + // Simulate a database with an active client - should not be collected + const currentDbName = 'current-db'; + const currentClientID = 'current-client'; + const currentClientGroupID = 'current-client-group'; + + const db: IndexedDBDatabase = { + name: currentDbName, + replicacheName: 'my-app', + replicacheFormatVersion: FormatVersion.Latest, + schemaVersion: '1', + }; + + const dagStore = new TestStore(); + await store.putDatabaseForTesting(db); + await setClientsForTesting( + makeClientMap({ + [currentClientID]: { + headHash: fakeHash('current'), + heartbeatTimestampMs: 5000, // Client is still heartbeating! + clientGroupID: currentClientGroupID, + }, + }), + dagStore, + ); + + const newDagStore = (name: string, _kvCreateStore: CreateStore) => { + expect(name).toBe(currentDbName); + return dagStore; + }; + + const kvStoreProvider = { + create: (_name: string) => new TestMemStore(), + drop: (name: string) => store.deleteDatabases([name]), + }; + + const maxAge = 1000; + const now = 5000; // Client heartbeat is within maxAge + + const onClientsDeleted = vi.fn(); + + await collectIDBDatabases( + store, + now, + maxAge, + kvStoreProvider, + true, // enableMutationRecovery + onClientsDeleted, + newDagStore, + ); + + // Database should NOT be collected because it has an actively heartbeating client + expect(Object.keys(await store.getDatabases())).toEqual([currentDbName]); + expect(onClientsDeleted).not.toHaveBeenCalled(); +}); + test('dropDatabases mem', async () => { const createStore = getKVStoreProvider(new LogContext(), 'mem').create; const store = new IDBDatabasesStore(createStore); diff --git a/packages/replicache/src/persist/collect-idb-databases.ts b/packages/replicache/src/persist/collect-idb-databases.ts index 4ae2637bbc..5793df61bc 100644 --- a/packages/replicache/src/persist/collect-idb-databases.ts +++ b/packages/replicache/src/persist/collect-idb-databases.ts @@ -195,9 +195,8 @@ function defaultNewDagStore(name: string, kvCreateStore: CreateStore): Store { } /** - * If the database is older than maxAge and there are no pending mutations we - * return `true` and an array of the deleted clients in that db. If the database is - * too new or there are pending mutations we return `[false]`. + * If any client has a recent heartbeat or there are pending mutations we + * return `[false]`. Otherwise we return `[true, deletedClients]`. */ function gatherDatabaseInfoForCollect( db: IndexedDBDatabase, @@ -213,14 +212,6 @@ function gatherDatabaseInfoForCollect( return [false]; } - // 0 is used in testing - assert(db.lastOpenedTimestampMS !== undefined); - - // - For DD31 we can delete the database if it is older than maxAge and - // there are no pending mutations. - if (now - db.lastOpenedTimestampMS < maxAge) { - return [false]; - } // If increase the format version we need to decide how to deal with this // logic. assert( @@ -231,6 +222,8 @@ function gatherDatabaseInfoForCollect( return canDatabaseBeCollectedAndGetDeletedClientIDs( enableMutationRecovery, newDagStore(db.name, kvCreateStore), + now, + maxAge, ); } @@ -320,12 +313,14 @@ export function deleteAllReplicacheData(opts?: DropDatabaseOptions) { /** * If there are pending mutations in any of the clients in this db we return - * `[false]`. Otherwise we return `true` and an array of the deleted clients to - * remove. + * `[false]`. If any client has a recent heartbeat we also return `[false]`. + * Otherwise we return `[true, deletedClients]`. */ function canDatabaseBeCollectedAndGetDeletedClientIDs( enableMutationRecovery: boolean, perdag: Store, + now: number, + maxAge: number, ): Promise< [canCollect: false] | [canCollect: true, deletedClients: DeletedClients] > { @@ -342,6 +337,16 @@ function canDatabaseBeCollectedAndGetDeletedClientIDs( } const clients = await getClients(read); + + // Don't collect if any client has a recent heartbeat (is still active). + // This is defense in depth - normally lastOpenedTimestampMS is kept fresh + // by the heartbeat, but this check protects against edge cases. + for (const [, client] of clients) { + if (now - client.heartbeatTimestampMs < maxAge) { + return [false]; + } + } + const existingDeletedClients = await getDeletedClients(read); const deletedClients: WritableDeletedClients = [...existingDeletedClients]; diff --git a/packages/replicache/src/persist/idb-databases-store.test.ts b/packages/replicache/src/persist/idb-databases-store.test.ts index 88f23d3204..3e8a3b0003 100644 --- a/packages/replicache/src/persist/idb-databases-store.test.ts +++ b/packages/replicache/src/persist/idb-databases-store.test.ts @@ -17,82 +17,24 @@ test('getDatabases with no existing record in db', async () => { }); test('putDatabase with no existing record in db', async () => { - vi.setSystemTime(1); - - const store = new IDBDatabasesStore(_ => new TestMemStore()); - const testDB = { - name: 'testName', - replicacheName: 'testReplicacheName', - replicacheFormatVersion: 1, - schemaVersion: 'testSchemaVersion', - }; - expect(await store.putDatabase(testDB)).toEqual({ - testName: withLastOpenedTimestampMS(testDB, 1), - }); - expect(await store.getDatabases()).toEqual({ - testName: withLastOpenedTimestampMS(testDB, 1), - }); -}); - -test('putDatabase updates lastOpenedTimestampMS', async () => { - vi.setSystemTime(1); - - const store = new IDBDatabasesStore(_ => new TestMemStore()); - const testDB = { - name: 'testName', - replicacheName: 'testReplicacheName', - replicacheFormatVersion: 1, - schemaVersion: 'testSchemaVersion', - }; - expect(await store.putDatabase(testDB)).toEqual({ - testName: withLastOpenedTimestampMS(testDB, 1), - }); - expect(await store.getDatabases()).toEqual({ - testName: withLastOpenedTimestampMS(testDB, 1), - }); - - vi.setSystemTime(2); - expect(await store.putDatabase(testDB)).toEqual({ - testName: withLastOpenedTimestampMS(testDB, 2), - }); - expect(await store.getDatabases()).toEqual({ - testName: withLastOpenedTimestampMS(testDB, 2), - }); -}); - -test('putDatabase ignores passed in lastOpenedTimestampMS', async () => { - vi.setSystemTime(2); - const store = new IDBDatabasesStore(_ => new TestMemStore()); - const testDB = { + const testDB: IndexedDBDatabase = { name: 'testName', replicacheName: 'testReplicacheName', replicacheFormatVersion: 1, schemaVersion: 'testSchemaVersion', - lastOpenedTimestampMS: 1, }; expect(await store.putDatabase(testDB)).toEqual({ - testName: withLastOpenedTimestampMS(testDB, 2), + testName: testDB, }); expect(await store.getDatabases()).toEqual({ - testName: withLastOpenedTimestampMS(testDB, 2), + testName: testDB, }); }); -function withLastOpenedTimestampMS( - db: IndexedDBDatabase, - lastOpenedTimestampMS: number, -): IndexedDBDatabase { - return { - ...db, - lastOpenedTimestampMS, - }; -} - test('putDatabase sequence', async () => { - vi.setSystemTime(1); const store = new IDBDatabasesStore(_ => new TestMemStore()); - const testDB1 = { + const testDB1: IndexedDBDatabase = { name: 'testName1', replicacheName: 'testReplicacheName1', replicacheFormatVersion: 1, @@ -100,28 +42,26 @@ test('putDatabase sequence', async () => { }; expect(await store.putDatabase(testDB1)).toEqual({ - testName1: withLastOpenedTimestampMS(testDB1, 1), + testName1: testDB1, }); expect(await store.getDatabases()).toEqual({ - testName1: withLastOpenedTimestampMS(testDB1, 1), + testName1: testDB1, }); - const testDB2 = { + const testDB2: IndexedDBDatabase = { name: 'testName2', replicacheName: 'testReplicacheName2', replicacheFormatVersion: 2, schemaVersion: 'testSchemaVersion2', }; - vi.setSystemTime(2); - expect(await store.putDatabase(testDB2)).toEqual({ - testName1: withLastOpenedTimestampMS(testDB1, 1), - testName2: withLastOpenedTimestampMS(testDB2, 2), + testName1: testDB1, + testName2: testDB2, }); expect(await store.getDatabases()).toEqual({ - testName1: withLastOpenedTimestampMS(testDB1, 1), - testName2: withLastOpenedTimestampMS(testDB2, 2), + testName1: testDB1, + testName2: testDB2, }); }); @@ -134,9 +74,8 @@ test('close closes kv store', async () => { }); test('clear', async () => { - vi.setSystemTime(1); const store = new IDBDatabasesStore(_ => new TestMemStore()); - const testDB1 = { + const testDB1: IndexedDBDatabase = { name: 'testName1', replicacheName: 'testReplicacheName1', replicacheFormatVersion: 1, @@ -144,30 +83,28 @@ test('clear', async () => { }; expect(await store.putDatabase(testDB1)).toEqual({ - testName1: withLastOpenedTimestampMS(testDB1, Date.now()), + testName1: testDB1, }); expect(await store.getDatabases()).toEqual({ - testName1: withLastOpenedTimestampMS(testDB1, Date.now()), + testName1: testDB1, }); await store.clearDatabases(); expect(await store.getDatabases()).toEqual({}); - const testDB2 = { + const testDB2: IndexedDBDatabase = { name: 'testName2', replicacheName: 'testReplicacheName2', replicacheFormatVersion: 2, schemaVersion: 'testSchemaVersion2', }; - vi.setSystemTime(2); - expect(await store.putDatabase(testDB2)).toEqual({ - testName2: withLastOpenedTimestampMS(testDB2, Date.now()), + testName2: testDB2, }); expect(await store.getDatabases()).toEqual({ - testName2: withLastOpenedTimestampMS(testDB2, Date.now()), + testName2: testDB2, }); }); diff --git a/packages/replicache/src/persist/idb-databases-store.ts b/packages/replicache/src/persist/idb-databases-store.ts index 6eff9e3d56..4b79707dd5 100644 --- a/packages/replicache/src/persist/idb-databases-store.ts +++ b/packages/replicache/src/persist/idb-databases-store.ts @@ -22,7 +22,8 @@ export type IndexedDBDatabase = { readonly replicacheName: string; readonly replicacheFormatVersion: number; readonly schemaVersion: string; - readonly lastOpenedTimestampMS?: number; + /** @deprecated No longer used. Kept for backwards compatibility when reading old data. */ + readonly lastOpenedTimestampMS?: number | undefined; }; export type IndexedDBDatabaseRecord = { @@ -61,7 +62,7 @@ export class IDBDatabasesStore { } putDatabase(db: IndexedDBDatabase): Promise { - return this.#putDatabase({...db, lastOpenedTimestampMS: Date.now()}); + return this.#putDatabase(db); } putDatabaseForTesting( From f8cd607e9e8a9febd042d31c8330a866a671a6ba Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 5 Feb 2026 19:45:32 -0800 Subject: [PATCH 033/495] chore: distinguish between data and schema changes, add `backfill-completed` (#5525) Partition change messages into (1) those that contain table data and (2) those that pertain to schema changes. This results in one new protocol message: * a `backfill-completed` message is split out of the previous `backfill` message, so that the latter is purely a data change and the former a schema change. * tracking of metadata for `backfill-completed` message is added at the `change-streamer` level This partitioning of changes will be helpful in upcoming change-streamer logic for handling data changes (which can be potentially large) differently from schema changes (for which metadata must be tracked). --- .../pg/change-source.end-to-mid.pg.test.ts | 8 +- .../change-source/pg/change-source.ts | 10 +-- .../protocol/current/data.test.ts | 42 +++++++++ .../change-source/protocol/current/data.ts | 85 ++++++++++++++++--- .../protocol/current/downstream.ts | 6 +- .../change-source/protocol/version.test.ts | 4 +- .../change-streamer/storer.pg.test.ts | 9 +- .../src/services/change-streamer/storer.ts | 17 +++- .../replicator/change-processor.test.ts | 11 +-- .../services/replicator/change-processor.ts | 54 ++++++------ .../replicator/incremental-sync.test.ts | 13 ++- .../src/services/replicator/test-utils.ts | 7 +- 12 files changed, 200 insertions(+), 66 deletions(-) create mode 100644 packages/zero-cache/src/services/change-source/protocol/current/data.test.ts diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index 55245be083..a5e486fb98 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -12,7 +12,7 @@ import type {PostgresDB} from '../../../types/pg.ts'; import type {Source} from '../../../types/streams.ts'; import type {ChangeProcessor} from '../../replicator/change-processor.ts'; import {createChangeProcessor} from '../../replicator/test-utils.ts'; -import type {DataChange} from '../protocol/current/data.ts'; +import type {DataOrSchemaChange} from '../protocol/current/data.ts'; import type {ChangeStreamMessage} from '../protocol/current/downstream.ts'; import {initializePostgresChangeSource} from './change-source.ts'; @@ -107,8 +107,8 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { return queue; } - async function nextTransaction(): Promise { - const data: DataChange[] = []; + async function nextTransaction(): Promise { + const data: DataOrSchemaChange[] = []; for (;;) { const change = await downstream.dequeue('timeout', 2000); if (change === 'timeout') { @@ -1625,7 +1625,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ] satisfies [ name: string, statements: string, - changes: Partial[], + changes: Partial[], expectedData: Record, expectedTables: LiteTableSpec[], expectedIndexes: LiteIndexSpec[], diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index f57ed5b57b..267cefbd5c 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -42,9 +42,9 @@ import { import type {ChangeSource, ChangeStream} from '../change-source.ts'; import type {BackfillRequest, JSONObject} from '../protocol/current.ts'; import type { - DataChange, Identifier, MessageRelation, + SchemaChange, TableMetadata, } from '../protocol/current/data.ts'; import type { @@ -707,11 +707,11 @@ class ChangeMaker { #makeSchemaChanges( preSchema: PublishedSchema, update: DdlUpdateEvent, - ): DataChange[] { + ): SchemaChange[] { try { const [prevTbl, prevIdx] = specsByID(preSchema); const [nextTbl, nextIdx] = specsByID(update.schema); - const changes: DataChange[] = []; + const changes: SchemaChange[] = []; // Validate the new table schemas for (const table of nextTbl.values()) { @@ -765,8 +765,8 @@ class ChangeMaker { #getTableChanges( oldTable: PublishedTableWithReplicaIdentity, newTable: PublishedTableWithReplicaIdentity, - ): DataChange[] { - const changes: DataChange[] = []; + ): SchemaChange[] { + const changes: SchemaChange[] = []; if ( oldTable.schema !== newTable.schema || oldTable.name !== newTable.name diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.test.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.test.ts new file mode 100644 index 0000000000..eaa554b1b6 --- /dev/null +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.test.ts @@ -0,0 +1,42 @@ +import {expect, expectTypeOf, test} from 'vitest'; +import { + isDataChange, + isSchemaChange, + type Change, + type DataChange, + type DataChangeTag, + type SchemaChange, + type SchemaChangeTag, +} from './data.ts'; + +test('schema and data change tags', () => { + expectTypeOf().toEqualTypeOf; + expectTypeOf().toEqualTypeOf; + + // Sanity check. The type check above should cover everything. + for (const tag of [ + 'create-table', + 'rename-table', + 'update-table-metadata', + 'add-column', + 'update-column', + 'drop-column', + 'drop-table', + 'create-index', + 'drop-index', + 'backfill-completed', + ]) { + expect(isSchemaChange({tag} as Change)).toBe(true); + expect(isDataChange({tag} as Change)).toBe(false); + } + + for (const tag of ['insert', 'update', 'backfill', 'truncate', 'delete']) { + expect(isSchemaChange({tag} as Change)).toBe(false); + expect(isDataChange({tag} as Change)).toBe(true); + } + + for (const tag of ['begin', 'commit', 'status', 'rollback']) { + expect(isSchemaChange({tag} as Change)).toBe(false); + expect(isDataChange({tag} as Change)).toBe(false); + } +}); diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.ts index 30fda30968..f02ad7adbf 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/data.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.ts @@ -268,10 +268,18 @@ export const backfillSchema = v.object({ // ] // ``` rowValues: v.array(v.array(jsonValueSchema)), +}); + +// Indicates that the backfill for the specified columns have +// been successfully backfilled and can be published to clients. +export const backfillCompletedSchema = v.object({ + tag: v.literal('backfill-completed'), + + relation: newRelationSchema, - // Indicates that the backfill for the specified columns have - // been successfully backfilled and can be published to clients. - completed: v.boolean().optional(), + // The columns to be backfilled. `rowKey` columns are automatically excluded, + // which means that this field may be empty. + columns: v.array(v.string()), }); export type MessageBegin = v.Infer; @@ -295,12 +303,35 @@ export type ColumnDrop = v.Infer; export type TableDrop = v.Infer; export type IndexCreate = v.Infer; export type IndexDrop = v.Infer; +export type BackfillCompleted = v.Infer; export const dataChangeSchema = v.union( insertSchema, updateSchema, deleteSchema, truncateSchema, + backfillSchema, +); + +// Note: keep in sync or the tag tests will fail +const dataChangeTags = [ + 'insert', + 'update', + 'delete', + 'truncate', + 'backfill', +] as const; + +const dataChangeTagsSchema = v.literalUnion(...dataChangeTags); + +export type DataChange = Satisfies< + JSONObject, // guarantees serialization over IPC or network + v.Infer +>; + +export type DataChangeTag = v.Infer; + +const schemaChanges = [ createTableSchema, renameTableSchema, updateTableMetadataSchema, @@ -310,18 +341,52 @@ export const dataChangeSchema = v.union( dropTableSchema, createIndexSchema, dropIndexSchema, - backfillSchema, -); - -export type DataChange = Satisfies< - JSONObject, // guarantees serialization over IPC or network - v.Infer + backfillCompletedSchema, +] as const; + +// Note: keep in sync or the tag tests will fail +const schemaChangeTags = [ + 'create-table', + 'rename-table', + 'update-table-metadata', + 'add-column', + 'update-column', + 'drop-column', + 'drop-table', + 'create-index', + 'drop-index', + 'backfill-completed', +] as const; + +export const schemaChangeSchema = v.union(...schemaChanges); + +const schemaChangeTagsSchema = v.literalUnion(...schemaChangeTags); + +export type SchemaChange = Satisfies< + JSONObject, + v.Infer >; +export type SchemaChangeTag = v.Infer; + +export type DataOrSchemaChange = DataChange | SchemaChange; + export type Change = | MessageBegin - | DataChange + | DataOrSchemaChange | MessageCommit | MessageRollback; export type ChangeTag = Change['tag']; + +const schemaChangeTagSet = new Set(schemaChangeTags); + +export function isSchemaChange(change: Change): change is SchemaChange { + return schemaChangeTagSet.has(change.tag); +} + +const dataChangeTagSet = new Set(dataChangeTags); + +export function isDataChange(change: Change): change is DataChange { + return dataChangeTagSet.has(change.tag); +} diff --git a/packages/zero-cache/src/services/change-source/protocol/current/downstream.ts b/packages/zero-cache/src/services/change-source/protocol/current/downstream.ts index 21d9219946..a944ad9a08 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/downstream.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/downstream.ts @@ -5,6 +5,7 @@ import { commitSchema, dataChangeSchema, rollbackSchema, + schemaChangeSchema, } from './data.ts'; import {statusMessageSchema} from './status.ts'; @@ -13,7 +14,10 @@ const begin = v.tuple([ beginSchema, v.object({commitWatermark: v.string()}), ]); -const data = v.tuple([v.literal('data'), dataChangeSchema]); +const data = v.tuple([ + v.literal('data'), + v.union(dataChangeSchema, schemaChangeSchema), +]); const commit = v.tuple([ v.literal('commit'), commitSchema, diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index aec6a516b6..90b79ff74e 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '3o21eprg77jzi', '/changes/v0/stream'); + t(current, '3i7d3yib2prai', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '3o21eprg77jzi', '/changes/v0/stream'); + t(v0, '3i7d3yib2prai', '/changes/v0/stream'); }); diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 261d1dc7cd..2ff76998cb 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -622,7 +622,7 @@ describe('change-streamer/storer', () => { } `); - // Drop the other backfilling column. + // Set the other backfilling column to completed storer.store([ '110', ['begin', messages.begin(), {commitWatermark: '110'}], @@ -632,12 +632,13 @@ describe('change-streamer/storer', () => { [ 'data', { - tag: 'drop-column', - table: { + tag: 'backfill-completed', + relation: { schema: 'your', name: 'bar', + rowKey: {columns: ['a']}, }, - column: 'a', + columns: [], }, ], ]); diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index aab01e5a91..e2116aeef8 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -17,7 +17,7 @@ import {cdcSchema, type ShardID} from '../../types/shards.ts'; import type { BackfillID, BackfillRequest, - DataChange, + DataOrSchemaChange, Identifier, TableMetadata, } from '../change-source/protocol/current.ts'; @@ -528,7 +528,7 @@ export class Storer implements Service { * Returns the db statements necessary to track backfill and table metadata * presented in the `change`, if any. */ - #trackBackfillMetadata(sql: PostgresTransaction, change: DataChange) { + #trackBackfillMetadata(sql: PostgresTransaction, change: DataOrSchemaChange) { const stmts: PendingQuery[] = []; switch (change.tag) { @@ -616,7 +616,18 @@ export class Storer implements Service { WHERE "schema" = ${schema} AND "table" = ${name} AND "column" = ${column}`, ); break; - break; + } + + case 'backfill-completed': { + const { + relation: {schema, name: table, rowKey}, + columns, + } = change; + const cols = [...rowKey.columns, columns]; + stmts.push( + sql`DELETE FROM ${this.#cdc('backfilling')} + WHERE "schema" = ${schema} AND "table" = ${table} AND "column" IN ${sql(cols)}`, + ); } } return stmts; diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index 3bbf4ca848..673310001f 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -3043,6 +3043,7 @@ describe('replicator/change-processor', () => { [45, 23, 67, 3000, 4000], [20, 10, 30, 5000, 6000], [200, 100, 300, 7000, 8000], + [2000, 1000, 3000, -1, -2], ], }, ], @@ -3051,16 +3052,13 @@ describe('replicator/change-processor', () => { [ 'data', { - tag: 'backfill', + tag: 'backfill-completed', relation: { schema: 'public', name: 'bff', rowKey: {columns: ['b', 'a', 'c']}, }, - watermark: '115', columns: ['d', 'e'], - rowValues: [[2000, 1000, 3000, -1, -2]], - completed: true, }, ], ['commit', fooBarBaz.commit(), {watermark: '123.02'}], @@ -3258,16 +3256,13 @@ describe('replicator/change-processor', () => { [ 'data', { - tag: 'backfill', + tag: 'backfill-completed', relation: { schema: 'public', name: 'bff', rowKey: {columns: ['b', 'a', 'c']}, }, - watermark: '115', columns: ['d', 'e'], - rowValues: [], - completed: true, }, ], ['commit', fooBarBaz.commit(), {watermark: '123.02'}], diff --git a/packages/zero-cache/src/services/replicator/change-processor.ts b/packages/zero-cache/src/services/replicator/change-processor.ts index c4bb3a9188..438ea5314a 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.ts @@ -34,6 +34,7 @@ import { import {liteTableName} from '../../types/names.ts'; import {id} from '../../types/sql.ts'; import type { + BackfillCompleted, Change, ColumnAdd, ColumnDrop, @@ -279,6 +280,9 @@ export class ChangeProcessor { case 'backfill': tx.processBackfill(msg); break; + case 'backfill-completed': + tx.processBackfillCompleted(msg); + break; default: unreachable(msg); } @@ -790,13 +794,7 @@ class TransactionProcessor { this.#reloadTableSpecs(); } - processBackfill({ - relation, - watermark, - columns, - rowValues, - completed, - }: MessageBackfill) { + processBackfill({relation, watermark, columns, rowValues}: MessageBackfill) { const tableName = liteTableName(relation); const tableSpec = must(this.#tableSpecs.get(tableName)); const rowKeyCols = relation.rowKey.columns; @@ -848,27 +846,31 @@ class TransactionProcessor { this.#lc.debug?.( `backfilled ${backfilled} rows (skipped ${skipped}) into ${tableName}`, ); + } - if (completed) { - const columnMetadata = must(ColumnMetadataStore.getInstance(this.#db.db)); - for (const col of cols) { - columnMetadata.clearBackfilling(tableName, col); - } - // Given that new columns are being exposed for every row in the table, bump the - // row version for all rows. - this.#bumpVersions(tableName); - this.#lc.info?.(`finished backfilling ${tableName}`); - - // Note that there is no need to clear the backfillingColumnVersions values - // in the changeLog. It could theoretically be done for clarity but: - // (1) it could be non-trivial in terms of latency introduced and - // (2) the data must be preserved if _other_ columns are in the process - // of being backfilled - // - // Thus, for speed and simplicity, the values are left as is. (Note that - // subsequent replicated changes to those rows will clear the values if - // no backfills are in progress). + processBackfillCompleted({relation, columns}: BackfillCompleted) { + const tableName = liteTableName(relation); + const rowKeyCols = relation.rowKey.columns; + const cols = [...rowKeyCols, ...columns]; + + const columnMetadata = must(ColumnMetadataStore.getInstance(this.#db.db)); + for (const col of cols) { + columnMetadata.clearBackfilling(tableName, col); } + // Given that new columns are being exposed for every row in the table, bump the + // row version for all rows. + this.#bumpVersions(tableName); + this.#lc.info?.(`finished backfilling ${tableName}`); + + // Note that there is no need to clear the backfillingColumnVersions values + // in the changeLog. It could theoretically be done for clarity but: + // (1) it could be non-trivial in terms of latency introduced and + // (2) the data must be preserved if _other_ columns are in the process + // of being backfilled + // + // Thus, for speed and simplicity, the values are left as is. (Note that + // subsequent replicated changes to those rows will clear the values if + // no backfills are in progress). } processCommit( diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index 9a37f02362..96bca0a470 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -625,7 +625,18 @@ describe('replicator/incremental-sync', () => { watermark: '110', columns: ['new_column'], rowValues: [[2, 'world']], - completed: true, + }, + ], + [ + 'data', + { + tag: 'backfill-completed', + relation: { + schema: 'public', + name: 'issues', + rowKey: {columns: ['issueID']}, + }, + columns: ['new_column'], }, ], ['commit', issues.commit(), {watermark: '110.02'}], diff --git a/packages/zero-cache/src/services/replicator/test-utils.ts b/packages/zero-cache/src/services/replicator/test-utils.ts index b973d84bf7..47ac7cc0c6 100644 --- a/packages/zero-cache/src/services/replicator/test-utils.ts +++ b/packages/zero-cache/src/services/replicator/test-utils.ts @@ -9,7 +9,7 @@ import type { ColumnAdd, ColumnDrop, ColumnUpdate, - DataChange, + DataOrSchemaChange, IndexCreate, IndexDrop, MessageBegin, @@ -27,7 +27,10 @@ import type { import {ChangeProcessor} from './change-processor.ts'; export interface FakeReplicator { - processTransaction(finalWatermark: string, ...msgs: DataChange[]): void; + processTransaction( + finalWatermark: string, + ...msgs: DataOrSchemaChange[] + ): void; } export function fakeReplicator(lc: LogContext, db: Database): FakeReplicator { From 59dac273ca05d625a6f7c080ca4b6a80cee94e80 Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Thu, 5 Feb 2026 22:22:52 -0700 Subject: [PATCH 034/495] chore(zero-cache): make logs and otel metrics for advance take yielding into account (#5515) --- .../view-syncer/pipeline-driver.runaway-push.test.ts | 6 +----- .../zero-cache/src/services/view-syncer/pipeline-driver.ts | 5 +++-- .../zero-cache/src/services/view-syncer/view-syncer.ts | 7 ++++--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.runaway-push.test.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.runaway-push.test.ts index 0a234d2970..4d7ef5fa0f 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.runaway-push.test.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.runaway-push.test.ts @@ -250,15 +250,11 @@ describe('view-syncer/pipeline-driver', () => { ), ); - let elapsedCalls = 0; let changeCount = 0; expect(() => { for (const _ of pipelines.advance({ elapsedLap: () => 0, - totalElapsed: () => { - elapsedCalls++; - return elapsedCalls * 100; - }, + totalElapsed: () => (changeCount + 1) * 100, }).changes) { changeCount++; } diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 7f06e92da4..6307912973 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -561,7 +561,8 @@ export class PipelineDriver { if (this.#shouldAdvanceYieldMaybeAbortAdvance()) { yield 'yield'; } - const start = performance.now(); + const start = timer.totalElapsed(); + let type; try { const tableSource = this.#tables.get(table); @@ -608,7 +609,7 @@ export class PipelineDriver { this.#advanceContext.pos++; } - const elapsed = performance.now() - start; + const elapsed = timer.totalElapsed() - start; this.#advanceTime.record(elapsed / 1000, { table, type, diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.ts index 494efe35ad..381b6def77 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.ts @@ -1973,11 +1973,12 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { // Signal clients to commit. await pokers.end(finalVersion); - const elapsed = performance.now() - start; + const wallTime = performance.now() - start; + const totalProcessTime = timer.totalElapsed(); lc.info?.( - `finished processing advancement of ${numChanges} changes (${elapsed} ms)`, + `finished processing advancement of ${numChanges} changes ((process: ${totalProcessTime} ms, wall: ${wallTime} ms))`, ); - this.#transactionAdvanceTime.record(elapsed / 1000); + this.#transactionAdvanceTime.record(totalProcessTime / 1000); return 'success'; }); } From 8d7d4cf384b7120dba5a40442e046081a2aacb63 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Fri, 6 Feb 2026 10:32:07 -0700 Subject: [PATCH 035/495] fix(zero-cache): statz double close and close sqlite db (#5527) - Remove raw `end()` to avoid "write after end" errors with Fastify. - Remove duplicate `uptime` key. - Ensure replica stats DB handles are always closed. - Add tests. --- .../zero-cache/src/services/statz.test.ts | 115 ++++++++++++++++++ packages/zero-cache/src/services/statz.ts | 58 +++++---- 2 files changed, 147 insertions(+), 26 deletions(-) create mode 100644 packages/zero-cache/src/services/statz.test.ts diff --git a/packages/zero-cache/src/services/statz.test.ts b/packages/zero-cache/src/services/statz.test.ts new file mode 100644 index 0000000000..95b53e85b0 --- /dev/null +++ b/packages/zero-cache/src/services/statz.test.ts @@ -0,0 +1,115 @@ +import fastify, {type FastifyInstance} from 'fastify'; +import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'; +import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; +import type {NormalizedZeroConfig} from '../config/normalize.ts'; +import {handleStatzRequest} from './statz.ts'; + +const {dbCloseSpy, dbPragmaSpy, statSyncSpy} = vi.hoisted(() => ({ + dbCloseSpy: vi.fn(), + dbPragmaSpy: vi.fn(() => [{value: 'ok'}]), + statSyncSpy: vi.fn(() => ({size: 1})), +})); + +vi.mock('fs', () => ({ + default: {statSync: statSyncSpy}, + statSync: statSyncSpy, +})); + +vi.mock('../../../zqlite/src/db.ts', () => ({ + Database: class { + constructor(_lc: unknown, _path: string) {} + pragma = dbPragmaSpy; + close() { + dbCloseSpy(); + } + }, +})); + +vi.mock('../db/statements.ts', () => ({ + StatementRunner: class { + constructor(_db: unknown) {} + }, +})); + +vi.mock('./replicator/schema/replication-state.ts', () => ({ + getReplicationState: () => ({stateVersion: '00'}), +})); + +describe('statz endpoint', () => { + const lc = createSilentLogContext(); + const config = { + adminPassword: 'secret', + replica: {file: '/tmp/replica.db'}, + log: {level: 'error'}, + } as unknown as NormalizedZeroConfig; + + const authHeader = { + authorization: `Basic ${Buffer.from('user:secret').toString('base64')}`, + }; + + let app: FastifyInstance; + + beforeEach(async () => { + dbCloseSpy.mockClear(); + dbPragmaSpy.mockClear(); + statSyncSpy.mockClear(); + app = fastify(); + app.get('/statz', (req, res) => handleStatzRequest(lc, config, req, res)); + await app.ready(); + }); + + afterEach(async () => { + await app.close(); + }); + + test('returns json stats for os group', async () => { + const res = await app.inject({ + method: 'GET', + url: '/statz?group=os&format=json', + headers: authHeader, + }); + + expect(res.statusCode).toBe(200); + expect(res.headers['content-type']).toContain('application/json'); + const body = JSON.parse(res.body) as {os: Record}; + expect(body).toHaveProperty('os'); + expect(body.os).toHaveProperty('platform'); + }); + + test('returns text stats for os group', async () => { + const res = await app.inject({ + method: 'GET', + url: '/statz?group=os', + headers: authHeader, + }); + + expect(res.statusCode).toBe(200); + expect(res.headers['content-type']).toContain('text/plain'); + expect(res.body).toContain('=== os ==='); + expect(res.body).toContain('platform'); + }); + + test('closes replica databases when requested', async () => { + const res = await app.inject({ + method: 'GET', + url: '/statz?group=replica,replication&format=json', + headers: authHeader, + }); + + expect(res.statusCode).toBe(200); + expect(dbCloseSpy).toHaveBeenCalledTimes(2); + }); + + test('rejects requests with bad auth', async () => { + const res = await app.inject({ + method: 'GET', + url: '/statz?group=os&format=json', + headers: { + authorization: `Basic ${Buffer.from('user:wrong').toString('base64')}`, + }, + }); + + expect(res.statusCode).toBe(401); + expect(res.headers['www-authenticate']).toContain('Basic'); + }); +}); diff --git a/packages/zero-cache/src/services/statz.ts b/packages/zero-cache/src/services/statz.ts index 8471738f55..80f29caa5a 100644 --- a/packages/zero-cache/src/services/statz.ts +++ b/packages/zero-cache/src/services/statz.ts @@ -3,7 +3,6 @@ import auth from 'basic-auth'; import type {FastifyReply, FastifyRequest} from 'fastify'; import fs from 'fs'; import os from 'os'; -import type {Writable} from 'stream'; import {BigIntJSON} from '../../../shared/src/bigint-json.ts'; import {Database} from '../../../zqlite/src/db.ts'; import type {NormalizedZeroConfig as ZeroConfig} from '../config/normalize.ts'; @@ -221,23 +220,31 @@ async function changeLogStats(lc: LogContext, config: ZeroConfig) { function replicaStats(lc: LogContext, config: ZeroConfig) { const db = new Database(lc, config.replica.file); - return Object.fromEntries([ - ['wal checkpoint', pick(first(db.pragma('WAL_CHECKPOINT')))], - ['page count', pick(first(db.pragma('PAGE_COUNT')))], - ['page size', pick(first(db.pragma('PAGE_SIZE')))], - ['journal mode', pick(first(db.pragma('JOURNAL_MODE')))], - ['synchronous', pick(first(db.pragma('SYNCHRONOUS')))], - ['cache size', pick(first(db.pragma('CACHE_SIZE')))], - ['auto vacuum', pick(first(db.pragma('AUTO_VACUUM')))], - ['freelist count', pick(first(db.pragma('FREELIST_COUNT')))], - ['wal autocheckpoint', pick(first(db.pragma('WAL_AUTOCHECKPOINT')))], - ['db file stats', fs.statSync(config.replica.file)], - ] as const); + try { + return Object.fromEntries([ + ['wal checkpoint', pick(first(db.pragma('WAL_CHECKPOINT')))], + ['page count', pick(first(db.pragma('PAGE_COUNT')))], + ['page size', pick(first(db.pragma('PAGE_SIZE')))], + ['journal mode', pick(first(db.pragma('JOURNAL_MODE')))], + ['synchronous', pick(first(db.pragma('SYNCHRONOUS')))], + ['cache size', pick(first(db.pragma('CACHE_SIZE')))], + ['auto vacuum', pick(first(db.pragma('AUTO_VACUUM')))], + ['freelist count', pick(first(db.pragma('FREELIST_COUNT')))], + ['wal autocheckpoint', pick(first(db.pragma('WAL_AUTOCHECKPOINT')))], + ['db file stats', fs.statSync(config.replica.file)], + ] as const); + } finally { + db.close(); + } } function replicationStats(lc: LogContext, config: ZeroConfig) { const db = new Database(lc, config.replica.file); - return getReplicationStats(db); + try { + return getReplicationStats(db); + } finally { + db.close(); + } } function getReplicationStats(db: Database) { @@ -257,7 +264,6 @@ function osStats() { ['platform', os.platform()], ['arch', os.arch()], ['release', os.release()], - ['uptime', os.uptime()], ] as const); } @@ -275,13 +281,13 @@ async function getPgStats( type StatsObject = Record; -function printStats(group: string, statsObject: StatsObject, out: Writable) { - const queries = Object.entries(statsObject); - out.write('\n' + header(group)); - for (const [name, result] of queries) { - out.write('\n' + name + ': ' + BigIntJSON.stringify(result, null, 2)); +function printStats(group: string, statsObject: StatsObject): string { + const lines: string[] = ['\n' + header(group)]; + for (const [name, result] of Object.entries(statsObject)) { + lines.push('\n' + name + ': ' + BigIntJSON.stringify(result, null, 2)); } - out.write('\n'); + lines.push('\n'); + return lines.join(''); } /** @@ -342,13 +348,13 @@ export async function handleStatzRequest( await res .header('Content-Type', 'application/json') .send(BigIntJSON.stringify(Object.fromEntries(stats), null, indent)); + return; } else { - for (const [group, statsObject] of stats) { - printStats(group, statsObject, res.raw); - } + const body = stats + .map(([group, statsObject]) => printStats(group, statsObject)) + .join(''); + await res.header('Content-Type', 'text/plain; charset=utf-8').send(body); } - - res.raw.end(); } function first(x: object[]): object { From a5ff8c3ad8ead78d2b8c9f681b640e2bafc431d9 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 6 Feb 2026 10:37:26 -0800 Subject: [PATCH 036/495] fix: apply back pressure based on memory usage (#5528) Improve the replication back pressure thresholding logic to be based on data size rather than number of changes. The previous change-count-based policy was susceptible to OOM issues for databases with very large rows. User report: * https://discord.com/channels/830183651022471199/1468430724582346864/1469150901112406107 ### Miscellany * Log every 10,000th statement in a transaction at level INFO to get better (default) visibility into large transactions. --- .../zero-cache/src/config/zero-config.test.ts | 8 - packages/zero-cache/src/config/zero-config.ts | 27 +- .../zero-cache/src/db/transaction-pool.ts | 9 +- .../zero-cache/src/server/change-streamer.ts | 22 +- .../change-streamer-service.pg.test.ts | 299 ++++++++++++------ .../change-streamer-service.ts | 4 - .../change-streamer/storer.pg.test.ts | 7 +- .../src/services/change-streamer/storer.ts | 114 +++++-- packages/zero-cache/src/test/db.ts | 10 +- packages/zero-cache/src/types/pg.ts | 19 +- 10 files changed, 334 insertions(+), 185 deletions(-) diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index 86d1fe6fea..07c81aa4f9 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -330,14 +330,6 @@ test('zero-cache --help', () => { is received during this interval, the delay will be canceled and the takeover will happen immediately, since the incoming request indicates that the task is registered as a target. - --change-streamer-back-pressure-threshold number default: 100000 - ZERO_CHANGE_STREAMER_BACK_PRESSURE_THRESHOLD env - The maximum number of queued changes before back pressure is applied to the - change source. When the queue exceeds this threshold, the change-streamer pauses - consumption from upstream until the queue drops to 90% of the threshold. - - Increasing this value may improve throughput at the cost of higher memory usage. - --task-id string optional ZERO_TASK_ID env Globally unique identifier for the zero-cache instance. diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index 2d19b44b2a..f5646ed75c 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -2,8 +2,8 @@ * These types represent the _compiled_ config whereas `define-config` types represent the _source_ config. */ -import {timingSafeEqual} from 'node:crypto'; import type {LogContext} from '@rocicorp/logger'; +import {timingSafeEqual} from 'node:crypto'; import {logOptions} from '../../../otel/src/log-options.ts'; import { flagToEnv, @@ -29,20 +29,6 @@ export type {LogConfig} from '../../../otel/src/log-options.ts'; export const ZERO_ENV_VAR_PREFIX = 'ZERO_'; -// Technically, any threshold is fine because the point of back pressure -// is to adjust the rate of incoming messages, and the size of the pending -// work queue does not affect that mechanism. -// -// However, it is theoretically possible to exceed the available memory if -// the size of changes is very large. This threshold can be improved by -// roughly measuring the size of the enqueued contents and setting the -// threshold based on available memory. -// -// TODO: switch to a message size-based thresholding when migrating over -// to stringified JSON messages, which will bound the computation involved -// in measuring the size of row messages. -export const DEFAULT_BACK_PRESSURE_THRESHOLD = 100_000; - export const appOptions = { id: { type: v @@ -568,17 +554,6 @@ export const zeroOptions = { `immediately, since the incoming request indicates that the task is registered as a target.`, ], }, - - backPressureThreshold: { - type: v.number().default(DEFAULT_BACK_PRESSURE_THRESHOLD), - desc: [ - `The maximum number of queued changes before back pressure is applied to the`, - `change source. When the queue exceeds this threshold, the change-streamer pauses`, - `consumption from upstream until the queue drops to 90% of the threshold.`, - ``, - `Increasing this value may improve throughput at the cost of higher memory usage.`, - ], - }, }, taskID: { diff --git a/packages/zero-cache/src/db/transaction-pool.ts b/packages/zero-cache/src/db/transaction-pool.ts index 88774b7d04..f304f487d3 100644 --- a/packages/zero-cache/src/db/transaction-pool.ts +++ b/packages/zero-cache/src/db/transaction-pool.ts @@ -3,7 +3,6 @@ import {type Resolver, resolver} from '@rocicorp/resolver'; import type postgres from 'postgres'; import {AbortError} from '../../../shared/src/abort-error.ts'; import {assert} from '../../../shared/src/asserts.ts'; -import {stringify} from '../../../shared/src/bigint-json.ts'; import type {Enum} from '../../../shared/src/enum.ts'; import {Queue} from '../../../shared/src/queue.ts'; import {promiseVoid} from '../../../shared/src/resolved-promises.ts'; @@ -318,13 +317,11 @@ export class TransactionPool { .execute() .then(() => { if (++this.#stmts % 1000 === 0) { + const log = this.#stmts % 10000 === 0 ? 'info' : 'debug'; const q = stmt as unknown as Query; - lc.debug?.( + lc[log]?.( `executed ${this.#stmts}th statement (${(performance.now() - this.#start).toFixed(3)} ms)`, - { - statement: q.string, - params: stringify(q.parameters), - }, + {statement: q.string}, ); } }) diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index ad0f662b3e..f626cac712 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -36,13 +36,7 @@ export default async function runWorker( const config = getNormalizedZeroConfig({env, argv: args.slice(1)}); const { taskID, - changeStreamer: { - port, - address, - protocol, - startupDelayMs, - backPressureThreshold, - }, + changeStreamer: {port, address, protocol, startupDelayMs}, upstream, change, replica, @@ -55,10 +49,15 @@ export default async function runWorker( initEventSink(lc, config); // Kick off DB connection warmup in the background. - const changeDB = pgClient(lc, change.db, { - max: change.maxConns, - connection: {['application_name']: 'zero-change-streamer'}, - }); + const changeDB = pgClient( + lc, + change.db, + { + max: change.maxConns, + connection: {['application_name']: 'zero-change-streamer'}, + }, + {sendStringAsJson: true}, + ); void warmupConnections(lc, changeDB, 'change'); const {autoReset} = config; @@ -95,7 +94,6 @@ export default async function runWorker( changeSource, subscriptionState, autoReset ?? false, - backPressureThreshold, setTimeout, ); break; diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index 51dd9a5701..0b15edaa3f 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -8,7 +8,6 @@ import {createSilentLogContext} from '../../../../shared/src/logging-test-utils. import {Queue} from '../../../../shared/src/queue.ts'; import {sleep} from '../../../../shared/src/sleep.ts'; import {Database} from '../../../../zqlite/src/db.ts'; -import {DEFAULT_BACK_PRESSURE_THRESHOLD} from '../../config/zero-config.ts'; import {StatementRunner} from '../../db/statements.ts'; import {expectTables, test, type PgTest} from '../../test/db.ts'; import type {PostgresDB} from '../../types/pg.ts'; @@ -29,11 +28,7 @@ import { type Downstream, } from './change-streamer.ts'; import * as ErrorType from './error-type-enum.ts'; -import { - AutoResetSignal, - ensureReplicationConfig, - type ChangeLogEntry, -} from './schema/tables.ts'; +import {AutoResetSignal, ensureReplicationConfig} from './schema/tables.ts'; describe('change-streamer/service', () => { let lc: LogContext; @@ -54,7 +49,9 @@ describe('change-streamer/service', () => { beforeEach(async ({testDBs}) => { lc = createSilentLogContext(); - sql = await testDBs.create('change_streamer_test_change_db'); + sql = await testDBs.create('change_streamer_test_change_db', undefined, { + sendStringAsJson: true, + }); const replica = new Database(lc, ':memory:'); initReplicationState(replica, ['zero_data'], REPLICA_VERSION); @@ -81,7 +78,6 @@ describe('change-streamer/service', () => { }, replicaConfig, true, - DEFAULT_BACK_PRESSURE_THRESHOLD, setTimeoutFn as unknown as typeof setTimeout, ); streamerDone = streamer.run(); @@ -172,15 +168,28 @@ describe('change-streamer/service', () => { // Await the ACK for the single commit, then the status message. await expectAcks('09', '0b'); - const logEntries = await sql< - ChangeLogEntry[] - >`SELECT * FROM "zoro_3/cdc"."changeLog"`; - expect(logEntries.map(e => e.change.tag)).toEqual([ - 'begin', - 'insert', - 'insert', - 'commit', - ]); + expect( + await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), + ).toMatchInlineSnapshot(` + Result [ + [ + "09", + "begin", + ], + [ + "09", + "insert", + ], + [ + "09", + "insert", + ], + [ + "09", + "commit", + ], + ] + `); await expectTables(sql, { ['zoro_3/cdc.replicationState']: [ { @@ -257,18 +266,40 @@ describe('change-streamer/service', () => { // Two commits with intervening status messages await expectAcks('09', '0a', '0b', '0d'); - const logEntries = await sql< - ChangeLogEntry[] - >`SELECT * FROM "zoro_3/cdc"."changeLog"`; - expect(logEntries.map(e => e.change.tag)).toEqual([ - 'begin', - 'insert', - 'insert', - 'commit', - 'begin', - 'delete', - 'commit', - ]); + expect( + await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), + ).toMatchInlineSnapshot(` + Result [ + [ + "09", + "begin", + ], + [ + "09", + "insert", + ], + [ + "09", + "insert", + ], + [ + "09", + "commit", + ], + [ + "0b", + "begin", + ], + [ + "0b", + "delete", + ], + [ + "0b", + "commit", + ], + ] + `); await expectTables(sql, { ['zoro_3/cdc.replicationState']: [ { @@ -337,15 +368,28 @@ describe('change-streamer/service', () => { await expectAcks('09', '0d'); // Only the changes for the committed (i.e. first) transaction are persisted. - const logEntries = await sql< - ChangeLogEntry[] - >`SELECT * FROM "zoro_3/cdc"."changeLog"`; - expect(logEntries.map(e => e.change.tag)).toEqual([ - 'begin', - 'insert', - 'insert', - 'commit', - ]); + expect( + await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), + ).toMatchInlineSnapshot(` + Result [ + [ + "09", + "begin", + ], + [ + "09", + "insert", + ], + [ + "09", + "insert", + ], + [ + "09", + "commit", + ], + ] + `); await expectTables(sql, { ['zoro_3/cdc.replicationState']: [ { @@ -414,21 +458,52 @@ describe('change-streamer/service', () => { await expectAcks('09', '0b', '0c'); // Only the changes for the committed (i.e. first) transaction are persisted. - const logEntries = await sql< - ChangeLogEntry[] - >`SELECT * FROM "zoro_3/cdc"."changeLog"`; - expect(logEntries.map(e => e.change.tag)).toEqual([ - 'begin', - 'insert', - 'insert', - 'commit', - 'begin', - 'delete', - 'commit', - 'begin', - 'insert', - 'commit', - ]); + expect( + await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), + ).toMatchInlineSnapshot(` + Result [ + [ + "09", + "begin", + ], + [ + "09", + "insert", + ], + [ + "09", + "insert", + ], + [ + "09", + "commit", + ], + [ + "0b", + "begin", + ], + [ + "0b", + "delete", + ], + [ + "0b", + "commit", + ], + [ + "0c", + "begin", + ], + [ + "0c", + "insert", + ], + [ + "0c", + "commit", + ], + ] + `); await expectTables(sql, { ['zoro_3/cdc.replicationState']: [ { @@ -489,23 +564,49 @@ describe('change-streamer/service', () => { await expectAcks('09'); - const logEntries = await sql< - ChangeLogEntry[] - >`SELECT * FROM "zoro_3/cdc"."changeLog"`; - expect(logEntries.map(e => e.change.tag)).toEqual([ - 'begin', - 'insert', - 'commit', - ]); - const insert = logEntries[1].change; - assert(insert.tag === 'insert'); - expect(insert.new).toEqual({ - id: 'hello', - int: 123456789, - big: 987654321987654321n, - flt: 123.456, - bool: true, - }); + expect( + await sql`SELECT watermark, change FROM "zoro_3/cdc"."changeLog"`.values(), + ).toMatchInlineSnapshot(` + Result [ + [ + "09", + { + "tag": "begin", + }, + ], + [ + "09", + { + "new": { + "big": 987654321987654321n, + "bool": true, + "flt": 123.456, + "id": "hello", + "int": 123456789, + }, + "relation": { + "name": "foo", + "rowKey": { + "columns": [ + "id", + ], + "type": "default", + }, + "schema": "public", + "tag": "relation", + }, + "tag": "insert", + }, + ], + [ + "09", + { + "extra": "info", + "tag": "commit", + }, + ], + ] + `); // Also verify when loading from the Store as opposed to direct forwarding. const catchupSub = await streamer.subscribe({ @@ -762,7 +863,6 @@ describe('change-streamer/service', () => { source, replicaConfig, true, - DEFAULT_BACK_PRESSURE_THRESHOLD, ); void streamer.run(); @@ -787,7 +887,6 @@ describe('change-streamer/service', () => { source, replicaConfig, true, - DEFAULT_BACK_PRESSURE_THRESHOLD, ); void streamer.run(); @@ -809,7 +908,6 @@ describe('change-streamer/service', () => { source, replicaConfig, true, - DEFAULT_BACK_PRESSURE_THRESHOLD, ); void streamer.run(); @@ -843,7 +941,6 @@ describe('change-streamer/service', () => { source, replicaConfig, true, - DEFAULT_BACK_PRESSURE_THRESHOLD, ); void streamer.run(); @@ -880,7 +977,6 @@ describe('change-streamer/service', () => { source, replicaConfig, true, - DEFAULT_BACK_PRESSURE_THRESHOLD, ); void streamer.run(); @@ -951,7 +1047,6 @@ describe('change-streamer/service', () => { source, replicaConfig, true, - DEFAULT_BACK_PRESSURE_THRESHOLD, ); void streamer.run(); @@ -1026,14 +1121,24 @@ describe('change-streamer/service', () => { await streamerDone; // Only the first changes should be committed. - const logEntries = await sql< - ChangeLogEntry[] - >`SELECT * FROM "zoro_3/cdc"."changeLog"`; - expect(logEntries.map(e => e.change.tag)).toEqual([ - 'begin', - 'insert', - 'commit', - ]); + expect( + await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), + ).toMatchInlineSnapshot(` + Result [ + [ + "0d", + "begin", + ], + [ + "0d", + "insert", + ], + [ + "0d", + "commit", + ], + ] + `); await expectTables(sql, { ['zoro_3/cdc.replicationState']: [ @@ -1071,14 +1176,24 @@ describe('change-streamer/service', () => { await streamerDone; // Only the first changes should be committed. - const logEntries = await sql< - ChangeLogEntry[] - >`SELECT * FROM "zoro_3/cdc"."changeLog"`; - expect(logEntries.map(e => e.change.tag)).toEqual([ - 'begin', - 'insert', - 'commit', - ]); + expect( + await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), + ).toMatchInlineSnapshot(` + Result [ + [ + "0d", + "begin", + ], + [ + "0d", + "insert", + ], + [ + "0d", + "commit", + ], + ] + `); await expectTables(sql, { ['zoro_3/cdc.replicationState']: [ diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index f4321858f2..947ec99672 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -55,7 +55,6 @@ export async function initializeStreamer( changeSource: ChangeSource, subscriptionState: SubscriptionState, autoReset: boolean, - backPressureThreshold: number, setTimeoutFn = setTimeout, ): Promise { // Make sure the ChangeLog DB is set up. @@ -79,7 +78,6 @@ export async function initializeStreamer( replicaVersion, changeSource, autoReset, - backPressureThreshold, setTimeoutFn, ); } @@ -276,7 +274,6 @@ class ChangeStreamerImpl implements ChangeStreamerService { replicaVersion: string, source: ChangeSource, autoReset: boolean, - backPressureThreshold: number, setTimeoutFn = setTimeout, ) { this.id = `change-streamer`; @@ -295,7 +292,6 @@ class ChangeStreamerImpl implements ChangeStreamerService { replicaVersion, consumed => this.#stream?.acks.push(['status', consumed[1], consumed[2]]), err => this.stop(err), - backPressureThreshold, ); this.#forwarder = new Forwarder(); this.#autoReset = autoReset; diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 2ff76998cb..ec92efab0c 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -2,7 +2,6 @@ import {beforeEach, describe, expect} from 'vitest'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import {Queue} from '../../../../shared/src/queue.ts'; import {sleep} from '../../../../shared/src/sleep.ts'; -import {DEFAULT_BACK_PRESSURE_THRESHOLD} from '../../config/zero-config.ts'; import {type PgTest, test} from '../../test/db.ts'; import type {PostgresDB} from '../../types/pg.ts'; import type {Subscription} from '../../types/subscription.ts'; @@ -29,7 +28,9 @@ describe('change-streamer/storer', () => { const SHARD_NUM = 5; beforeEach(async ({testDBs}) => { - db = await testDBs.create('change_streamer_storer'); + db = await testDBs.create('change_streamer_storer', undefined, { + sendStringAsJson: true, + }); shard = {appID: APP_ID, shardNum: SHARD_NUM}; await db.begin(tx => setupCDCTables(lc, tx, shard)); await ensureReplicationConfig( @@ -97,7 +98,6 @@ describe('change-streamer/storer', () => { REPLICA_VERSION, msg => consumed.enqueue(msg), err => fatalErrors.enqueue(err), - DEFAULT_BACK_PRESSURE_THRESHOLD, ); await storer.assumeOwnership(); done = storer.run(); @@ -1510,7 +1510,6 @@ describe('change-streamer/storer', () => { REPLICA_VERSION, msg => consumed.enqueue(msg), err => fatalErrors.enqueue(err), - DEFAULT_BACK_PRESSURE_THRESHOLD, ); await storer.assumeOwnership(); done = storer.run(); diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index e2116aeef8..e3729aed52 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -1,9 +1,11 @@ import {PG_SERIALIZATION_FAILURE} from '@drdgvhbh/postgres-error-codes'; import type {LogContext} from '@rocicorp/logger'; import {resolver, type Resolver} from '@rocicorp/resolver'; +import {getHeapStatistics} from 'node:v8'; import postgres, {type PendingQuery, type Row} from 'postgres'; import {AbortError} from '../../../../shared/src/abort-error.ts'; import {assert} from '../../../../shared/src/asserts.ts'; +import {BigIntJSON} from '../../../../shared/src/bigint-json.ts'; import {Queue} from '../../../../shared/src/queue.ts'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; import * as Mode from '../../db/mode-enum.ts'; @@ -14,12 +16,16 @@ import { type PostgresTransaction, } from '../../types/pg.ts'; import {cdcSchema, type ShardID} from '../../types/shards.ts'; -import type { - BackfillID, - BackfillRequest, - DataOrSchemaChange, - Identifier, - TableMetadata, +import { + isDataChange, + isSchemaChange, + type BackfillID, + type BackfillRequest, + type Change, + type DataChange, + type Identifier, + type SchemaChange, + type TableMetadata, } from '../change-source/protocol/current.ts'; import {type Commit} from '../change-source/protocol/current/downstream.ts'; import type {StatusMessage} from '../change-source/protocol/current/status.ts'; @@ -43,7 +49,12 @@ type SubscriberAndMode = { }; type QueueEntry = - | ['change', WatermarkedChange] + | [ + 'change', + watermark: string, + json: string, + orig: Exclude | null, // null for DataChanges + ] | ['ready', callback: () => void] | ['subscriber', SubscriberAndMode] | StatusMessage @@ -99,8 +110,9 @@ export class Storer implements Service { readonly #onConsumed: (c: Commit | StatusMessage) => void; readonly #onFatal: (err: Error) => void; readonly #queue = new Queue(); - readonly #backPressureThreshold: number; + readonly #backPressureThresholdBytes: number; + #approximateQueuedBytes = 0; #running = false; constructor( @@ -113,7 +125,6 @@ export class Storer implements Service { replicaVersion: string, onConsumed: (c: Commit | StatusMessage) => void, onFatal: (err: Error) => void, - backPressureThreshold: number, ) { this.#lc = lc.withContext('component', 'change-log'); this.#shard = shard; @@ -124,7 +135,37 @@ export class Storer implements Service { this.#replicaVersion = replicaVersion; this.#onConsumed = onConsumed; this.#onFatal = onFatal; - this.#backPressureThreshold = backPressureThreshold; + + // Use 5% of the available heap (--max-old-space-size) as the buffer size + // for absorbing replication stream spikes. When the amount of queued data + // exceeds this threshold, back pressure is applied to the replication + // stream, delaying downstream sync as a result. + // + // The threshold was determined empirically with load testing. Higher + // thresholds like 10% have resulted in OOMs. Note also that the + // byte-counting logic in the queue is certainly an underestimate of + // actual memory usage (but importantly, proportionally correct), so + // the queue is actually using more than 5% of the heap. + // + // Resist the urge to "tune" this number; the buffer is useful for + // absorbing periodic spikes to avoid delaying downstream sync, + // but it does not meaningfully affect steady-state replication + // throughput; the latter is determined by other factors such as + // object serialization and PG throughput. + // + // In other words, the back pressure limit is not what constrains + // replication throughput; rather, it protects the system when the + // upstream throughput exceeds the downstream throughput. + const heapStats = getHeapStatistics(); + this.#backPressureThresholdBytes = + (heapStats.heap_size_limit - heapStats.used_heap_size) * 0.05; + + this.#lc.info?.( + `Using up to ${(this.#backPressureThresholdBytes / 1024 ** 2).toFixed(2)} MB of ` + + `--max-old-space-size (~${(heapStats.heap_size_limit / 1024 ** 2).toFixed(2)} MB) ` + + `to absorb upstream spikes`, + {heapStats}, + ); } // For readability in SQL statements. @@ -214,7 +255,23 @@ export class Storer implements Service { } store(entry: WatermarkedChange) { - this.#queue.enqueue(['change', entry]); + const [watermark, [_tag, change]] = entry; + // Eagerly stringify the JSON object so that the memory usage can be + // more accurately measured (i.e. without an extra object traversal and + // ad hoc memory counting heuristics). + // + // This essentially moves the stringify() computation out of the pg client, + // which is instead configured to pass `string` objects directly as JSON + // strings for JSON-valued columns (see TypeOptions.sendStringAsJson). + const json = BigIntJSON.stringify(change); + this.#approximateQueuedBytes += json.length; + + this.#queue.enqueue([ + 'change', + watermark, + json, + isDataChange(change) ? null : change, // drop DataChanges to save memory + ]); } abort() { @@ -237,12 +294,12 @@ export class Storer implements Service { } if ( this.#readyForMore === null && - this.#queue.size() > this.#backPressureThreshold + this.#approximateQueuedBytes > this.#backPressureThresholdBytes ) { this.#lc.warn?.( - `applying back pressure with ${this.#queue.size()} queued changes (threshold: ${this.#backPressureThreshold})\n` + + `applying back pressure with ${this.#queue.size()} queued changes (~${(this.#approximateQueuedBytes / 1024 ** 2).toFixed(2)} MB)\n` + `\n` + - `To inspect changeLog backlog in your CVR database:\n` + + `To inspect changeLog backlog in your change DB:\n` + ` SELECT\n` + ` (change->'relation'->>'schema') || '.' || (change->'relation'->>'name') AS table_name,\n` + ` change->>'tag' AS operation,\n` + @@ -260,11 +317,11 @@ export class Storer implements Service { #maybeReleaseBackPressure() { if ( this.#readyForMore !== null && - // Wait for at least 10% of the threshold to free up. - this.#queue.size() < this.#backPressureThreshold * 0.9 + // Wait for at least 20% of the threshold to free up. + this.#approximateQueuedBytes < this.#backPressureThresholdBytes * 0.8 ) { this.#lc.info?.( - `releasing back pressure with ${this.#queue.size()} queued changes`, + `releasing back pressure with ${this.#queue.size()} queued changes (~${(this.#approximateQueuedBytes / 1024 ** 2).toFixed(2)} MB)`, ); this.#readyForMore.resolve(); this.#readyForMore = null; @@ -287,8 +344,6 @@ export class Storer implements Service { const catchupQueue: SubscriberAndMode[] = []; while ((msg = await this.#queue.dequeue()) !== 'stop') { - this.#maybeReleaseBackPressure(); - const [msgType] = msg; switch (msgType) { case 'ready': { @@ -318,8 +373,10 @@ export class Storer implements Service { } } // msgType === 'change' - const [watermark, downstream] = msg[1]; - const [tag, change] = downstream; + const [_, watermark, json, change] = msg; + const tag = change?.tag; + this.#approximateQueuedBytes -= json.length; + if (tag === 'begin') { assert(!tx, 'received BEGIN in the middle of a transaction'); const {promise, resolve, reject} = resolver(); @@ -344,7 +401,7 @@ export class Storer implements Service { return []; }); } else { - assert(tx, `received ${tag} outside of transaction`); + assert(tx, () => `received change outside of transaction: ${json}`); tx.pos++; } @@ -352,20 +409,23 @@ export class Storer implements Service { watermark: tag === 'commit' ? watermark : tx.preCommitWatermark, precommit: tag === 'commit' ? tx.preCommitWatermark : null, pos: tx.pos, - change, + change: json, }; const processed = tx.pool.process(sql => [ sql`INSERT INTO ${this.#cdc('changeLog')} ${sql(entry)}`, - ...(tag === 'data' ? this.#trackBackfillMetadata(sql, change) : []), + ...(change !== null && isSchemaChange(change) + ? this.#trackBackfillMetadata(sql, change) + : []), ]); - if (tag === 'data' && tx.pos % 10_000 === 0) { + if (tx.pos % 100 === 0) { // Backpressure is exerted on commit when awaiting tx.pool.done(). // However, backpressure checks need to be regularly done for // very large transactions in order to avoid memory blowup. await processed; } + this.#maybeReleaseBackPressure(); if (tag === 'commit') { const {owner} = await tx.startingReplicationState; @@ -400,7 +460,7 @@ export class Storer implements Service { tx = null; // ACK the LSN to the upstream Postgres. - this.#onConsumed(downstream); + this.#onConsumed(['commit', change, {watermark}]); // Before beginning the next transaction, open a READONLY snapshot to // concurrently catchup any queued subscribers. @@ -528,7 +588,7 @@ export class Storer implements Service { * Returns the db statements necessary to track backfill and table metadata * presented in the `change`, if any. */ - #trackBackfillMetadata(sql: PostgresTransaction, change: DataOrSchemaChange) { + #trackBackfillMetadata(sql: PostgresTransaction, change: SchemaChange) { const stmts: PendingQuery[] = []; switch (change.tag) { diff --git a/packages/zero-cache/src/test/db.ts b/packages/zero-cache/src/test/db.ts index 38ddacbd7b..a4ad4a9e93 100644 --- a/packages/zero-cache/src/test/db.ts +++ b/packages/zero-cache/src/test/db.ts @@ -10,7 +10,11 @@ import { } from 'vitest'; import {must} from '../../../shared/src/must.ts'; import {sleep} from '../../../shared/src/sleep.ts'; -import {type PostgresDB, postgresTypeConfig} from '../types/pg.ts'; +import { + type PostgresDB, + postgresTypeConfig, + type TypeOptions, +} from '../types/pg.ts'; declare module 'vitest' { export interface ProvidedContext { @@ -50,7 +54,7 @@ export class TestDBs { async create( database: string, onNotice?: OnNoticeFn, - useTypeConfig = true, + typeOpts: TypeOptions | false = {}, ): Promise { const exists = this.#dbs[database]; if (exists !== undefined) { @@ -73,7 +77,7 @@ export class TestDBs { onNotice?.(n); defaultOnNotice(n); }, - ...(useTypeConfig ? postgresTypeConfig() : {}), + ...(typeOpts ? postgresTypeConfig(typeOpts) : {}), }); this.#dbs[database] = db; return db; diff --git a/packages/zero-cache/src/types/pg.ts b/packages/zero-cache/src/types/pg.ts index aea573dca4..9a035dbd66 100644 --- a/packages/zero-cache/src/types/pg.ts +++ b/packages/zero-cache/src/types/pg.ts @@ -184,9 +184,17 @@ function dateToUTCMidnight(date: string): number { */ export type PostgresValueType = JSONValue | Uint8Array; -type TypeOptions = { +export type TypeOptions = { /** Returns JSON values as raw JSON strings (i.e. unparsed). */ returnJsonAsString?: boolean; + + /** + * Sends strings directly as JSON values (i.e. without JSON stringification). + * The application is responsible for ensuring that string inputs for JSON + * columns are already stringified. Other data types (e.g. objects) will + * still be stringified by the pg client. + */ + sendStringAsJson?: boolean; }; /** @@ -194,7 +202,10 @@ type TypeOptions = { * * @param jsonAsString Keep JSON / JSONB values as strings instead of parsing. */ -export const postgresTypeConfig = ({returnJsonAsString}: TypeOptions = {}) => ({ +export const postgresTypeConfig = ({ + returnJsonAsString, + sendStringAsJson, +}: TypeOptions = {}) => ({ // Type the type IDs as `number` so that Typescript doesn't complain about // referencing external types during type inference. types: { @@ -202,7 +213,9 @@ export const postgresTypeConfig = ({returnJsonAsString}: TypeOptions = {}) => ({ json: { to: JSON, from: [JSON, JSONB], - serialize: BigIntJSON.stringify, + serialize: sendStringAsJson + ? (x: unknown) => (typeof x === 'string' ? x : BigIntJSON.stringify(x)) + : BigIntJSON.stringify, parse: returnJsonAsString ? (x: string) => x : BigIntJSON.parse, }, // Timestamps are converted to PreciseDate objects. From 2dd5d8219047ec5fbf2e257a0e5eb6ef9e4128c5 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 7 Feb 2026 14:48:38 -0800 Subject: [PATCH 037/495] chore: make backfill-metadata objects opaque (#5531) Widens the definition of `TableMetadata` and `BackfilIID` objects in the change protocol to any JSONObject, explicitly making them opaque to the downstream components (whose job is to track and return, but not to interpret), and allowing the change source implementation more flexibility in storing upstream-specific data. Define the actual contents that will be needed for Postgres backfill. --- .../change-source/pg/backfill-metadata.ts | 18 +++ .../pg/change-source.end-to-mid.pg.test.ts | 132 ++++++++---------- .../change-source/pg/change-source.ts | 50 ++----- .../change-source/protocol/current/data.ts | 15 +- .../change-source/protocol/version.test.ts | 4 +- 5 files changed, 101 insertions(+), 118 deletions(-) create mode 100644 packages/zero-cache/src/services/change-source/pg/backfill-metadata.ts diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-metadata.ts b/packages/zero-cache/src/services/change-source/pg/backfill-metadata.ts new file mode 100644 index 0000000000..76f6d8009d --- /dev/null +++ b/packages/zero-cache/src/services/change-source/pg/backfill-metadata.ts @@ -0,0 +1,18 @@ +import * as v from '../../../../../shared/src/valita.ts'; + +// PG-specific messages passed in the table metadata and backfill ID +// messages. + +export const columnMetadataSchema = v.object({ + attNum: v.number(), +}); + +export type ColumnMetadata = v.Infer; + +export const tableMetadataSchema = v.object({ + schemaOID: v.number(), + relationOID: v.number(), + rowKey: v.record(columnMetadataSchema), +}); + +export type TableMetadata = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index a5e486fb98..905830b57c 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -147,10 +147,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'create-table', metadata: { - rowKey: { - columns: ['id'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, }, }, {tag: 'create-index'}, @@ -230,10 +229,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'add-column', tableMetadata: { - rowKey: { - columns: ['id'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, }, }, ], @@ -356,32 +354,28 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { tag: 'update-table-metadata', table: {schema: 'my', name: 'bar'}, old: { - rowKey: { - columns: ['id'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, }, new: { - rowKey: { - columns: [], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {}, }, }, { tag: 'update-table-metadata', table: {schema: 'my', name: 'bar'}, old: { - rowKey: { - columns: [], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {}, }, new: { - rowKey: { - columns: ['handle'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, }, }, { @@ -444,10 +438,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'add-column', tableMetadata: { - rowKey: { - columns: ['handle'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, }, }, {tag: 'create-index'}, @@ -702,19 +695,17 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'add-column', tableMetadata: { - rowKey: { - columns: ['handle'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, }, }, { tag: 'add-column', tableMetadata: { - rowKey: { - columns: ['handle'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, }, }, ], @@ -776,10 +767,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'add-column', tableMetadata: { - rowKey: { - columns: ['handle'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, }, }, ], @@ -945,10 +935,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { tag: 'add-column', table: {schema: 'public', name: 'foo'}, tableMetadata: { - rowKey: { - columns: ['id'], - type: 'index', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, }, }, ], @@ -993,20 +982,18 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { tag: 'add-column', table: {schema: 'public', name: 'foo'}, tableMetadata: { - rowKey: { - columns: ['id'], - type: 'index', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, }, }, { tag: 'add-column', table: {schema: 'public', name: 'foo'}, tableMetadata: { - rowKey: { - columns: ['id'], - type: 'index', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, }, }, ], @@ -1076,10 +1063,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'create-table', metadata: { - rowKey: { - columns: ['id'], - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, }, }, {tag: 'create-index'}, @@ -1411,10 +1397,10 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'create-table', metadata: { - rowKey: { - columns: [], // Note: This means is will be replicated to SQLite but not synced to clients. - type: 'default', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + // Note: This means is will be replicated to SQLite but not synced to clients. + rowKey: {}, }, }, { @@ -1489,9 +1475,11 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'create-table', metadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), rowKey: { - columns: ['a', 'b'], - type: 'default', + a: {attNum: 1}, + b: {attNum: 2}, }, }, }, @@ -1500,10 +1488,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { { tag: 'create-table', metadata: { - rowKey: { - columns: ['a'], // computes the shortest eligible key - type: 'full', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {a: {attNum: 1}}, // computes the shortest eligible key }, }, {tag: 'create-index'}, @@ -1605,16 +1592,17 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { tag: 'update-table-metadata', table: {schema: 'public', name: 'existing'}, old: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), rowKey: { - columns: ['a', 'b'], - type: 'default', + a: {attNum: 1}, + b: {attNum: 2}, }, }, new: { - rowKey: { - columns: ['a'], // computes the shortest eligible key - type: 'full', - }, + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {a: {attNum: 1}}, // computes the shortest eligible key }, }, ], diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 267cefbd5c..b41a8ea747 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -5,8 +5,6 @@ import { import type {LogContext} from '@rocicorp/logger'; import postgres from 'postgres'; import {AbortError} from '../../../../../shared/src/abort-error.ts'; -import {areEqual} from '../../../../../shared/src/arrays.ts'; -import {unreachable} from '../../../../../shared/src/asserts.ts'; import {stringify} from '../../../../../shared/src/bigint-json.ts'; import {deepEqual} from '../../../../../shared/src/json.ts'; import {must} from '../../../../../shared/src/must.ts'; @@ -45,13 +43,13 @@ import type { Identifier, MessageRelation, SchemaChange, - TableMetadata, } from '../protocol/current/data.ts'; import type { ChangeStreamData, ChangeStreamMessage, Data, } from '../protocol/current/downstream.ts'; +import type {TableMetadata} from './backfill-metadata.ts'; import {ChangeStreamMultiplexer} from './change-stream-multiplexer.ts'; import {type InitialSyncOptions} from './initial-sync.ts'; import type { @@ -777,18 +775,14 @@ class ChangeMaker { new: {schema: newTable.schema, name: newTable.name}, }); } - if ( - oldTable.replicaIdentity !== newTable.replicaIdentity || - !areEqual( - oldTable.replicaIdentityColumns, - newTable.replicaIdentityColumns, - ) - ) { + const oldMetadata = getMetadata(oldTable); + const newMetadata = getMetadata(newTable); + if (!deepEqual(oldMetadata, newMetadata)) { changes.push({ tag: 'update-table-metadata', table: {schema: newTable.schema, name: newTable.name}, - old: getMetadata(oldTable), - new: getMetadata(newTable), + old: oldMetadata, + new: newMetadata, }); } const table = {schema: newTable.schema, name: newTable.name}; @@ -1014,30 +1008,16 @@ function columnsByID( } function getMetadata(table: PublishedTableWithReplicaIdentity): TableMetadata { - const metadata: TableMetadata = { - rowKey: { - columns: table.replicaIdentityColumns, - }, + return { + schemaOID: must(table.schemaOID), + relationOID: table.oid, + rowKey: Object.fromEntries( + table.replicaIdentityColumns.map(k => [ + k, + {attNum: table.columns[k].pos}, + ]), + ), }; - switch (table.replicaIdentity) { - case 'd': - metadata.rowKey.type = 'default'; - break; - case 'i': - metadata.rowKey.type = 'index'; - break; - case 'f': - metadata.rowKey.type = 'full'; - break; - case 'n': - metadata.rowKey.type = 'nothing'; - break; - case undefined: - break; - default: - unreachable(table.replicaIdentity); - } - return metadata; } // Avoid sending the `columns` from the Postgres MessageRelation message. diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.ts index f02ad7adbf..6488011bee 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/data.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.ts @@ -12,6 +12,7 @@ import {must} from '../../../../../../shared/src/must.ts'; import * as v from '../../../../../../shared/src/valita.ts'; import {columnSpec, indexSpec, tableSpec} from '../../../../db/specs.ts'; import type {Satisfies} from '../../../../types/satisfies.ts'; +import {jsonObjectSchema} from './json.ts'; export const beginSchema = v.object({ tag: v.literal('begin'), @@ -87,14 +88,10 @@ export const newRelationSchema = v.object({ // TableMetadata contains table-related configuration that does not affect the // actual data in the table, but rather how the table's change messages are -// handled. -// -// Changes to the metadata are sent in an `table-update-metadata` change. -export const tableMetadataSchema = v.object({ - // The rowKey is the same object sent in the `relation` message of - // `insert`, `update`, and `delete` messages. - rowKey: rowKeySchema, -}); +// handled. The is an opaque object that clients must track (and update) based +// on `create-table`, `add-column`, and `table-update-metadata` messages, and +// pass in BackfillRequests when there are columns to be backfilled. +export const tableMetadataSchema = jsonObjectSchema; export type TableMetadata = v.Infer; @@ -145,7 +142,7 @@ export type Identifier = v.Infer; // The change-streamer stores these IDs as opaque values while a column is // being backfilled, and initiates new change-source streams with the IDs // in order to restart backfills that did not complete in previous sessions. -export const backfillIDSchema = v.record(v.union(v.number(), v.string())); +export const backfillIDSchema = jsonObjectSchema; export type BackfillID = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index 90b79ff74e..f0b23e41f2 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '3i7d3yib2prai', '/changes/v0/stream'); + t(current, '2a1vwoxr1ozfw', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '3i7d3yib2prai', '/changes/v0/stream'); + t(v0, '2a1vwoxr1ozfw', '/changes/v0/stream'); }); From 5f84255c9fbc9bcc146a784ead7f3fb1c9d986fd Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sun, 8 Feb 2026 17:03:25 -0800 Subject: [PATCH 038/495] fix: parsing of json[] and jsonb[] types (#5532) (No user report, just realized this when revisiting the parsing code for backfill. Presumably the use of JSON[] and JSONB[] types is rare) ### Background To avoid multiple unnecessarily parsing and serialization steps when shuttling row data from Postgres to the replica, the postgres client is configured to return JSON types as unparsed strings, which are ferried all the way to the SQLite replica without JSON parsing or serialization. ### Problem The parser is also used internally for array types, i.e. JSON[] and JSONB[]. This resulted in incorrect values returned from the pg client; they would be arrays of unparsed JSON strings, rather than arrays of JSON values. ### Fix Avoid configuring the postgres client this way, and instead put the optimization in the code that uses the pg client's type parsers, only applying the optimization to (non-array) JSON and JSONB types. --- packages/zero-cache/src/db/pg-type-parser.ts | 30 +++++- .../pg/change-source.end-to-mid.pg.test.ts | 41 +++++++-- .../change-source/pg/change-source.ts | 7 +- .../change-source/pg/initial-sync.pg.test.ts | 92 ++++++++++++++++--- .../services/change-source/pg/initial-sync.ts | 15 +-- .../pg/logical-replication/stream.pg.test.ts | 14 ++- .../pg/logical-replication/stream.ts | 2 +- packages/zero-cache/src/types/pg.ts | 10 +- 8 files changed, 158 insertions(+), 53 deletions(-) diff --git a/packages/zero-cache/src/db/pg-type-parser.ts b/packages/zero-cache/src/db/pg-type-parser.ts index 232847a07d..cc6ddd5aab 100644 --- a/packages/zero-cache/src/db/pg-type-parser.ts +++ b/packages/zero-cache/src/db/pg-type-parser.ts @@ -1,5 +1,6 @@ import {assert} from '../../../shared/src/asserts.ts'; -import {mapValues} from '../../../shared/src/objects.ts'; +import {mapEntries} from '../../../shared/src/objects.ts'; +import {JSON, JSONB} from '../types/pg-types.ts'; import type {PostgresDB} from '../types/pg.ts'; // Arbitrary array type to test if the PostgresDB client has fetched types. @@ -10,6 +11,18 @@ export interface TypeParsers { getTypeParser(typeOID: number): TypeParser; } +export type ParseOptions = { + /** + * Returns JSON and JSONB values as raw JSON strings (i.e. unparsed). + * Note that JSON[] and JSONB[] values are returned as arrays of (parsed) + * JSON values. + */ + returnJsonAsString?: boolean; +}; + +const JSON_TYPE = String(JSON); +const JSONB_TYPE = String(JSONB); + // postgres.js has default type parsers with user-defined overrides // configurable per-client (see `postgresTypeConfig` in types/pg.ts). // @@ -20,7 +33,10 @@ export interface TypeParsers { // A replication session (with `database: replication`), however, does // not support this type fetching, so it is done on a connection from // a default client. -export async function getTypeParsers(db: PostgresDB): Promise { +export async function getTypeParsers( + db: PostgresDB, + {returnJsonAsString}: ParseOptions = {}, +): Promise { if (!db.options.parsers[INT4_ARRAY_TYPE]) { assert(db.options.fetch_types, `Supplied db must fetch_types`); @@ -32,7 +48,10 @@ export async function getTypeParsers(db: PostgresDB): Promise { `array types not fetched ${Object.keys(db.options.parsers)}`, ); } - const parsers = mapValues(db.options.parsers, parse => { + const parsers = mapEntries(db.options.parsers, (type, parse) => { + if ((type === JSON_TYPE || type === JSONB_TYPE) && returnJsonAsString) { + return [type, (x: string) => x]; + } // The postgres.js library tags parsers for array types with an `array: true` field. // https://github.com/porsager/postgres/blob/089214e85c23c90cf142d47fb30bd03f42874984/src/connection.js#L760 const isArrayType = (parse as unknown as {array?: boolean}).array; @@ -40,7 +59,10 @@ export async function getTypeParsers(db: PostgresDB): Promise { // And then skips the first character when parsing the string, // e.g. an array parser will parse '{1,2,3}' from '1,2,3}'. // https://github.com/porsager/postgres/blob/089214e85c23c90cf142d47fb30bd03f42874984/src/connection.js#L496 - return isArrayType ? (val: string) => parse(val.substring(1)) : parse; + return [ + type, + isArrayType ? (val: string) => parse(val.substring(1)) : parse, + ]; }); return { // A type OID for which a parser is not explicitly defined diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index 905830b57c..4cf3e5215f 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -58,8 +58,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { jsonb JSONB, numz ENUMZ, uuid UUID, - intarr INT4[] - + intarr INT4[], + jsons JSON[], + jsonbs JSONB[] ); CREATE SCHEMA IF NOT EXISTS my; @@ -1207,9 +1208,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'data types', ` ALTER PUBLICATION zero_some_public SET TABLE foo ( - id, int, big, flt, bool, timea, date, json, jsonb, numz, uuid, intarr); + id, int, big, flt, bool, timea, date, json, jsonb, numz, uuid, intarr, jsons, jsonbs); - INSERT INTO foo (id, int, big, flt, bool, timea, date, json, jsonb, numz, uuid, intarr) + INSERT INTO foo (id, int, big, flt, bool, timea, date, json, jsonb, numz, uuid, intarr, jsons, jsonbs) VALUES ( 'abc', -2, @@ -1222,7 +1223,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { '{"far": 456, "boo" : {"baz": 123}}', '2', 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11', - ARRAY[1,2,3,4,5] + ARRAY[1,2,3,4,5], + ARRAY['1'::json,'"2"'::json,'{"a":123}'::json], + ARRAY['4'::json,'"5"'::json,'{"b":678}'::json] ); `, [ @@ -1236,6 +1239,8 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { {tag: 'add-column'}, {tag: 'add-column'}, {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, { tag: 'insert', new: { @@ -1250,6 +1255,8 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { numz: '2', uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', intarr: [1, 2, 3, 4, 5], + jsons: [1, '2', {a: 123}], + jsonbs: [4, '5', {b: 678}], }, }, ], @@ -1268,6 +1275,8 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { numz: '2', // Verifies TEXT affinity uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', intarr: '[1,2,3,4,5]', + jsons: '[1,"2",{"a":123}]', + jsonbs: '[4,"5",{"b":678}]', ['_0_version']: expect.stringMatching(/[a-z0-9]+/), }, ], @@ -1348,13 +1357,29 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { notNull: false, pos: 10, }, + jsonbs: { + characterMaximumLength: null, + dataType: 'jsonb[]|TEXT_ARRAY', + elemPgTypeClass: 'b', + dflt: null, + notNull: false, + pos: 11, + }, + jsons: { + characterMaximumLength: null, + dataType: 'json[]|TEXT_ARRAY', + elemPgTypeClass: 'b', + dflt: null, + notNull: false, + pos: 12, + }, numz: { characterMaximumLength: null, dataType: 'enumz|TEXT_ENUM', elemPgTypeClass: null, dflt: null, notNull: false, - pos: 11, + pos: 13, }, timea: { characterMaximumLength: null, @@ -1362,7 +1387,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { elemPgTypeClass: null, dflt: null, notNull: false, - pos: 12, + pos: 14, }, uuid: { characterMaximumLength: null, @@ -1370,7 +1395,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { elemPgTypeClass: null, dflt: null, notNull: false, - pos: 13, + pos: 15, }, ['_0_version']: { diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index b41a8ea747..67fcf9a85f 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -235,12 +235,7 @@ class PostgresChangeSource implements ChangeSource { if (backfillRequests.length) { throw new Error('not implemented yet'); } - const db = pgClient( - this.#lc, - this.#upstreamUri, - {}, - {returnJsonAsString: true}, - ); + const db = pgClient(this.#lc, this.#upstreamUri); const {slot} = this.#replica; let cleanup = promiseVoid; diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts index 2e0f411068..081428e9f7 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts @@ -437,7 +437,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { }, { name: 'existing table, default publication', - setupUpstreamQuery: ` + setupUpstreamQuery: /*sql*/ ` CREATE TYPE ENUMZ AS ENUM ('1', '2', '3'); CREATE TABLE issues( "issueID" INTEGER, @@ -458,8 +458,16 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { "shortID2" INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1001), "num" NUMERIC, "column.with.dots" TEXT, + "jsonArray" JSON[], + "jsonbArray" JSONB[], PRIMARY KEY ("orgID", "issueID") ); + + INSERT INTO issues("orgID", "issueID", "intArray", "jsonArray", "jsonbArray") + VALUES (1, 1, + ARRAY[1,2,3,4,5], + ARRAY['1'::json,'"2"'::json,'{}'::json], + ARRAY['{"a":1}'::jsonb,'{"b":2}'::jsonb]); `, published: { [`${APP_ID}_${SHARD_NUM}.clients`]: ZERO_CLIENTS_SPEC, @@ -631,6 +639,24 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { elemPgTypeClass: null, notNull: false, }, + jsonArray: { + pos: 19, + characterMaximumLength: null, + dataType: 'json[]', + typeOID: 199, + dflt: null, + elemPgTypeClass: 'b', + notNull: false, + }, + jsonbArray: { + pos: 20, + characterMaximumLength: null, + dataType: 'jsonb[]', + typeOID: 3807, + dflt: null, + elemPgTypeClass: 'b', + notNull: false, + }, }, oid: expect.any(Number), name: 'issues', @@ -780,9 +806,25 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - ['_0_version']: { + jsonArray: { pos: 18, characterMaximumLength: null, + dataType: 'json[]|TEXT_ARRAY', + notNull: false, + dflt: null, + elemPgTypeClass: 'b', + }, + jsonbArray: { + pos: 19, + characterMaximumLength: null, + dataType: 'jsonb[]|TEXT_ARRAY', + notNull: false, + dflt: null, + elemPgTypeClass: 'b', + }, + ['_0_version']: { + pos: 20, + characterMaximumLength: null, dataType: 'TEXT', notNull: false, elemPgTypeClass: null, @@ -880,6 +922,16 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { replicatedData: { [`${APP_ID}_${SHARD_NUM}.clients`]: [], issues: [ + { + issueID: 1n, + orgID: 1n, + intArray: '[1,2,3,4,5]', + jsonArray: '[1,"2",{}]', + jsonbArray: '[{"a":1},{"b":2}]', + serial: 1n, + shortID: 1n, + shortID2: 1001n, + }, { issueID: 123n, orgID: 456n, @@ -892,9 +944,9 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { jsonb: '{"bar": "baz"}', date: null, time: null, - serial: 1n, - shortID: 1n, - shortID2: 1001n, + serial: 2n, + shortID: 2n, + shortID2: 1002n, num: 12345678901234n, ['_0_version']: WATERMARK_REGEX, }, @@ -910,9 +962,9 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { jsonb: '[{"boo": 123}]', date: null, time: null, - serial: 2n, - shortID: 2n, - shortID2: 1002n, + serial: 3n, + shortID: 3n, + shortID2: 1003n, num: null, ['_0_version']: WATERMARK_REGEX, }, @@ -928,9 +980,9 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { jsonb: null, date: BigInt(Date.UTC(2003, 3, 23)), time: 33011123n, // Convert 09:10:11.123456789 to milliseconds since midnight - serial: 3n, - shortID: 3n, - shortID2: 1003n, + serial: 4n, + shortID: 4n, + shortID2: 1004n, num: null, ['_0_version']: WATERMARK_REGEX, }, @@ -1116,6 +1168,15 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { table_name: 'issues', upstream_type: 'json', }, + { + character_max_length: null, + column_name: 'jsonArray', + is_array: 1n, + is_enum: 0n, + is_not_null: 0n, + table_name: 'issues', + upstream_type: 'json[]', + }, { character_max_length: null, column_name: 'jsonb', @@ -1125,6 +1186,15 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { table_name: 'issues', upstream_type: 'jsonb', }, + { + character_max_length: null, + column_name: 'jsonbArray', + is_array: 1n, + is_enum: 0n, + is_not_null: 0n, + table_name: 'issues', + upstream_type: 'jsonb[]', + }, { character_max_length: null, column_name: 'num', diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index 6ba54fac64..dc688ae2a0 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -156,15 +156,10 @@ export async function initialSync( ? numTables : Math.min(tableCopyWorkers, numTables); - const copyPool = pgClient( - lc, - upstreamURI, - { - max: numWorkers, - connection: {['application_name']: 'initial-sync-copy-worker'}, - }, - {returnJsonAsString: true}, - ); + const copyPool = pgClient(lc, upstreamURI, { + max: numWorkers, + connection: {['application_name']: 'initial-sync-copy-worker'}, + }); const copiers = startTableCopyWorkers( lc, copyPool, @@ -463,7 +458,7 @@ async function copy( } lc.info?.(`Starting copy stream of ${tableName}:`, selectStmt); - const pgParsers = await getTypeParsers(dbClient); + const pgParsers = await getTypeParsers(dbClient, {returnJsonAsString: true}); const parsers = columnSpecs.map(c => { const pgParse = pgParsers.getTypeParser(c.typeOID); return (val: string) => diff --git a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.pg.test.ts index e5a98b7523..14a20fbbd4 100644 --- a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.pg.test.ts @@ -33,7 +33,8 @@ describe('pg/logic-replication', {timeout: 30000}, () => { json JSON, num NUMERIC, ints INT4[], - times TIMESTAMPTZ[] + times TIMESTAMPTZ[], + jsons JSON[] ); CREATE PUBLICATION foo_pub FOR TABLE foo; @@ -112,7 +113,7 @@ describe('pg/logic-replication', {timeout: 30000}, () => { await db.unsafe(` -- tag: "insert" - INSERT INTO foo (id, int, big, flt, bool, date, time, json, num, ints, times) + INSERT INTO foo (id, int, big, flt, bool, date, time, json, num, ints, times, jsons) VALUES ( 'bar', 123, @@ -124,7 +125,8 @@ describe('pg/logic-replication', {timeout: 30000}, () => { '{"zoo":"dar"}', '12345.678909876', ARRAY[1, 2, 3], - ARRAY['2019-01-12T00:30:35.654321Z'::timestamptz, '2019-01-12T00:30:35.123456Z'::timestamptz] + ARRAY['2019-01-12T00:30:35.654321Z'::timestamptz, '2019-01-12T00:30:35.123456Z'::timestamptz], + ARRAY['1'::json, '"2"'::json, '{"a":123}'::json] ); -- tag: "update" @@ -162,11 +164,12 @@ describe('pg/logic-replication', {timeout: 30000}, () => { flt: 456.789, id: 'bar', int: 123, - json: {zoo: 'dar'}, + json: '{"zoo":"dar"}', num: 12345.678909876, time: 1547253035381.101, ints: [1, 2, 3], times: [1547253035654.321, 1547253035123.456], + jsons: [1, '2', {a: 123}], }, }); expect(await msgs.dequeue()).toMatchObject({ @@ -180,9 +183,10 @@ describe('pg/logic-replication', {timeout: 30000}, () => { flt: 456.789, id: 'bar', int: 123, - json: {zoo: 'dar'}, + json: '{"zoo":"dar"}', num: 12345.678909876, time: 1547253035381.101, + jsons: [1, '2', {a: 123}], }, old: null, }); diff --git a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts index eefd874d04..8bf254b23a 100644 --- a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts @@ -101,7 +101,7 @@ export async function subscribe( }, manualKeepaliveTimeout / 5); let destroyed = false; - const typeParsers = await getTypeParsers(db); + const typeParsers = await getTypeParsers(db, {returnJsonAsString: true}); const parser = new PgoutputParser(typeParsers); const messages = Subscription.create({ cleanup: () => { diff --git a/packages/zero-cache/src/types/pg.ts b/packages/zero-cache/src/types/pg.ts index 9a035dbd66..8f4ff3d15c 100644 --- a/packages/zero-cache/src/types/pg.ts +++ b/packages/zero-cache/src/types/pg.ts @@ -185,9 +185,6 @@ function dateToUTCMidnight(date: string): number { export type PostgresValueType = JSONValue | Uint8Array; export type TypeOptions = { - /** Returns JSON values as raw JSON strings (i.e. unparsed). */ - returnJsonAsString?: boolean; - /** * Sends strings directly as JSON values (i.e. without JSON stringification). * The application is responsible for ensuring that string inputs for JSON @@ -202,10 +199,7 @@ export type TypeOptions = { * * @param jsonAsString Keep JSON / JSONB values as strings instead of parsing. */ -export const postgresTypeConfig = ({ - returnJsonAsString, - sendStringAsJson, -}: TypeOptions = {}) => ({ +export const postgresTypeConfig = ({sendStringAsJson}: TypeOptions = {}) => ({ // Type the type IDs as `number` so that Typescript doesn't complain about // referencing external types during type inference. types: { @@ -216,7 +210,7 @@ export const postgresTypeConfig = ({ serialize: sendStringAsJson ? (x: unknown) => (typeof x === 'string' ? x : BigIntJSON.stringify(x)) : BigIntJSON.stringify, - parse: returnJsonAsString ? (x: string) => x : BigIntJSON.parse, + parse: BigIntJSON.parse, }, // Timestamps are converted to PreciseDate objects. timestamp: { From 9733ee8f73d879b10b2ef598d013ddab7ecd2568 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 9 Feb 2026 12:25:12 -0800 Subject: [PATCH 039/495] chore(zero-cache): logic for streaming backfill messages from COPY (#5533) backfill-stream contains the logic for backfilling columns of a single table: * Creating a snapshot transaction at a known LSN (via a temporary replication slot) * Validating that the schema at the snapshot is compatible with that of the requested backfill * Streaming backfill messages from a postgres COPY stream Upcoming: * initiating, managing, and multiplexing backfill streams into the main change stream --- .../pg/backfill-stream.pg.test.ts | 386 ++++++++++++++++++ .../change-source/pg/backfill-stream.ts | 277 +++++++++++++ .../services/change-source/pg/initial-sync.ts | 38 +- 3 files changed, 684 insertions(+), 17 deletions(-) create mode 100644 packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts create mode 100644 packages/zero-cache/src/services/change-source/pg/backfill-stream.ts diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts new file mode 100644 index 0000000000..881d136efd --- /dev/null +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts @@ -0,0 +1,386 @@ +import type {LogContext} from '@rocicorp/logger'; +import {beforeEach, describe, expect} from 'vitest'; +import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import {getConnectionURI, type PgTest, test} from '../../../test/db.ts'; +import type {PostgresDB} from '../../../types/pg.ts'; +import type {BackfillRequest} from '../protocol/current.ts'; +import {streamBackfill} from './backfill-stream.ts'; +import {getPublicationInfo} from './schema/published.ts'; + +describe('backfill-stream', () => { + let lc: LogContext; + let upstream: PostgresDB; + let upstreamURI: string; + let columnBackfillRequest: BackfillRequest; + let tableBackfillRequest: BackfillRequest; + + beforeEach(async ({testDBs}) => { + lc = createSilentLogContext(); + upstream = await testDBs.create('backfill_stream_test_db'); + upstreamURI = getConnectionURI(upstream); + + await upstream.unsafe(/*sql*/ ` + CREATE TABLE foo( + id1 INT8 NOT NULL, + id2 INT4 NOT NULL, + a TEXT, + b JSON, + c JSON[], + PRIMARY KEY(id1, id2) + ); + CREATE TABLE bar( + id1 INT8 NOT NULL, + id2 INT4 NOT NULL, + a TEXT, + b JSON, + c JSON[], + PRIMARY KEY(id1, id2) + ); + CREATE PUBLICATION the_pub FOR TABLE foo; + + DO $$ + BEGIN + FOR i IN 1..10 LOOP + INSERT INTO foo (id1, id2, a, b, c) + VALUES(i, i+1, + REPEAT(i::text, 10), + json_build_object('d', i), + ARRAY[to_json(i), to_json(i+1), to_json((i+2)::text), json_build_object('e', i+3)] + ); + END LOOP; + END $$; + `); + + const {tables} = await getPublicationInfo(upstream, ['the_pub']); + const tableSpec = tables[0]; + + columnBackfillRequest = { + table: { + schema: 'public', + name: 'foo', + metadata: { + schemaOID: tableSpec.schemaOID, + relationOID: tableSpec.oid, + rowKey: { + id1: {attNum: tableSpec.columns.id1.pos}, + id2: {attNum: tableSpec.columns.id2.pos}, + }, + }, + }, + columns: { + c: {attNum: tableSpec.columns.c.pos}, + b: {attNum: tableSpec.columns.b.pos}, + }, + }; + + tableBackfillRequest = { + table: { + schema: 'public', + name: 'foo', + metadata: { + schemaOID: tableSpec.schemaOID, + relationOID: tableSpec.oid, + rowKey: { + id2: {attNum: tableSpec.columns.id2.pos}, + id1: {attNum: tableSpec.columns.id1.pos}, + }, + }, + }, + columns: { + id1: {attNum: tableSpec.columns.id1.pos}, + id2: {attNum: tableSpec.columns.id2.pos}, + a: {attNum: tableSpec.columns.a.pos}, + c: {attNum: tableSpec.columns.c.pos}, + b: {attNum: tableSpec.columns.b.pos}, + }, + }; + + return () => testDBs.drop(upstream); + }); + + test(`column backfill`, async () => { + const stream = streamBackfill( + lc, + upstreamURI, + {slot: 'slot_name', publications: ['the_pub']}, + columnBackfillRequest, + ); + const results = []; + for await (const msg of stream) { + results.push(msg); + } + expect(results).toMatchObject([ + { + tag: 'backfill', + watermark: expect.any(String), + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id1', 'id2']}, + }, + columns: ['c', 'b'], + rowValues: [ + // Column 'c JSON[]' should be an array of JSON values + // Column 'b JSON' should be stringified JSON + [1n, 2, [1, 2, '3', {e: 4}], '{"d" : 1}'], + [2n, 3, [2, 3, '4', {e: 5}], '{"d" : 2}'], + [3n, 4, [3, 4, '5', {e: 6}], '{"d" : 3}'], + [4n, 5, [4, 5, '6', {e: 7}], '{"d" : 4}'], + [5n, 6, [5, 6, '7', {e: 8}], '{"d" : 5}'], + [6n, 7, [6, 7, '8', {e: 9}], '{"d" : 6}'], + [7n, 8, [7, 8, '9', {e: 10}], '{"d" : 7}'], + [8n, 9, [8, 9, '10', {e: 11}], '{"d" : 8}'], + [9n, 10, [9, 10, '11', {e: 12}], '{"d" : 9}'], + [10n, 11, [10, 11, '12', {e: 13}], '{"d" : 10}'], + ], + }, + { + tag: 'backfill-completed', + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id1', 'id2']}, + }, + columns: ['c', 'b'], + }, + ]); + }); + + test(`column backfill: flushed in small batches`, async () => { + const stream = streamBackfill( + lc, + upstreamURI, + {slot: 'slot_name', publications: ['the_pub']}, + columnBackfillRequest, + {flushThresholdBytes: 1024}, // 1K flush threshold + ); + const results = []; + for await (const msg of stream) { + results.push(msg); + } + expect(results).toMatchObject([ + { + tag: 'backfill', + watermark: expect.any(String), + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id1', 'id2']}, + }, + columns: ['c', 'b'], + rowValues: [ + [1n, 2, [1, 2, '3', {e: 4}], '{"d" : 1}'], + [2n, 3, [2, 3, '4', {e: 5}], '{"d" : 2}'], + [3n, 4, [3, 4, '5', {e: 6}], '{"d" : 3}'], + ], + }, + { + tag: 'backfill', + watermark: expect.any(String), + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id1', 'id2']}, + }, + columns: ['c', 'b'], + rowValues: [ + [4n, 5, [4, 5, '6', {e: 7}], '{"d" : 4}'], + [5n, 6, [5, 6, '7', {e: 8}], '{"d" : 5}'], + [6n, 7, [6, 7, '8', {e: 9}], '{"d" : 6}'], + ], + }, + { + tag: 'backfill', + watermark: expect.any(String), + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id1', 'id2']}, + }, + columns: ['c', 'b'], + rowValues: [ + [7n, 8, [7, 8, '9', {e: 10}], '{"d" : 7}'], + [8n, 9, [8, 9, '10', {e: 11}], '{"d" : 8}'], + [9n, 10, [9, 10, '11', {e: 12}], '{"d" : 9}'], + ], + }, + { + tag: 'backfill', + watermark: expect.any(String), + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id1', 'id2']}, + }, + columns: ['c', 'b'], + rowValues: [[10n, 11, [10, 11, '12', {e: 13}], '{"d" : 10}']], + }, + { + tag: 'backfill-completed', + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id1', 'id2']}, + }, + columns: ['c', 'b'], + }, + ]); + }); + + test(`table backfill`, async () => { + const stream = streamBackfill( + lc, + upstreamURI, + {slot: 'slot_name', publications: ['the_pub']}, + tableBackfillRequest, + ); + const results = []; + for await (const msg of stream) { + results.push(msg); + } + // Columns should deduped and ordered: [id2, id1, a, c, b] + expect(results).toMatchObject([ + { + tag: 'backfill', + watermark: expect.any(String), + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id2', 'id1']}, + }, + columns: ['a', 'c', 'b'], + rowValues: [ + [2, 1n, '1111111111', [1, 2, '3', {e: 4}], '{"d" : 1}'], + [3, 2n, '2222222222', [2, 3, '4', {e: 5}], '{"d" : 2}'], + [4, 3n, '3333333333', [3, 4, '5', {e: 6}], '{"d" : 3}'], + [5, 4n, '4444444444', [4, 5, '6', {e: 7}], '{"d" : 4}'], + [6, 5n, '5555555555', [5, 6, '7', {e: 8}], '{"d" : 5}'], + [7, 6n, '6666666666', [6, 7, '8', {e: 9}], '{"d" : 6}'], + [8, 7n, '7777777777', [7, 8, '9', {e: 10}], '{"d" : 7}'], + [9, 8n, '8888888888', [8, 9, '10', {e: 11}], '{"d" : 8}'], + [10, 9n, '9999999999', [9, 10, '11', {e: 12}], '{"d" : 9}'], + [ + 11, + 10n, + '10101010101010101010', + [10, 11, '12', {e: 13}], + '{"d" : 10}', + ], + ], + }, + { + tag: 'backfill-completed', + relation: { + schema: 'public', + name: 'foo', + rowKey: {columns: ['id2', 'id1']}, + }, + columns: ['a', 'c', 'b'], + }, + ]); + }); + + test.each([ + ['Rename unrelated column', 'ALTER TABLE foo RENAME a TO z'], + ['Rename unrelated table', 'ALTER TABLE bar RENAME TO baz'], + ])('Compatible backfill request: %s', async (_name, sqlStmts) => { + await upstream.unsafe(sqlStmts); + const stream = streamBackfill( + lc, + upstreamURI, + {slot: 'slot_name', publications: ['the_pub']}, + columnBackfillRequest, + ); + for await (const _ of stream) { + break; + } + }); + + test.each([ + [ + 'Rename table', + `ALTER TABLE foo RENAME TO baz`, + 'Table has been renamed or dropped', + ], + [ + 'Rename backfilling row key column', + `ALTER TABLE foo RENAME id1 TO id`, + 'Row key (e.g. PRIMARY KEY or INDEX) has changed', + ], + [ + 'Rename backfilling column', + `ALTER TABLE foo RENAME b TO d`, + 'Column b has been renamed or dropped', + ], + [ + 'Drop backfilling row key column', + `ALTER TABLE foo DROP id2`, + 'Row key (e.g. PRIMARY KEY or INDEX) has changed', + ], + [ + 'Drop backfilling column', + `ALTER TABLE foo DROP c`, + 'Column c has been renamed or dropped', + ], + [ + 'Drop backfilling table', + `DROP TABLE foo`, + 'Table has been renamed or dropped', + ], + [ + 'Swap backfilling row key names', + /*sql*/ ` + ALTER TABLE foo RENAME id1 to id; + ALTER TABLE foo RENAME id2 to id1; + ALTER TABLE foo RENAME id to id2; + `, + 'Column id1 no longer corresponds to the original column', + ], + [ + 'Swap backfilling column names', + /*sql*/ ` + ALTER TABLE foo RENAME b to d; + ALTER TABLE foo RENAME c to b; + ALTER TABLE foo RENAME d to c; + `, + 'Column c no longer corresponds to the original column', + ], + [ + 'Swap table names', + /*sql*/ ` + ALTER TABLE foo RENAME TO boo; + ALTER TABLE bar RENAME TO foo; + ALTER TABLE boo RENAME TO bar; + `, + 'Table has been renamed or dropped', + ], + [ + 'Change backfilling row key', + /*sql*/ ` + ALTER TABLE foo DROP CONSTRAINT foo_pkey; + ALTER TABLE foo ADD CONSTRAINT foo_pkey PRIMARY KEY(id1); + `, + 'Row key (e.g. PRIMARY KEY or INDEX) has changed', + ], + ])('Incompatible backfill request: %s', async (_name, sqlStmts, reason) => { + await upstream.unsafe(sqlStmts); + const stream = streamBackfill( + lc, + upstreamURI, + {slot: 'slot_name', publications: ['the_pub']}, + columnBackfillRequest, + ); + + let result: unknown = null; + try { + for await (const _ of stream) { + break; + } + } catch (e) { + result = e; + } + expect(String(result)).toBe( + `SchemaIncompatibilityError: Cannot backfill public.foo[c,b]: ${reason}`, + ); + }); +}); diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts new file mode 100644 index 0000000000..40672ef10c --- /dev/null +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts @@ -0,0 +1,277 @@ +import type {LogContext} from '@rocicorp/logger'; +import {getDefaultHighWaterMark} from 'node:stream'; +import {equals} from '../../../../../shared/src/set-utils.ts'; +import * as v from '../../../../../shared/src/valita.ts'; +import {READONLY} from '../../../db/mode-enum.ts'; +import {TsvParser} from '../../../db/pg-copy.ts'; +import {getTypeParsers, type TypeParser} from '../../../db/pg-type-parser.ts'; +import type {PublishedTableSpec} from '../../../db/specs.ts'; +import {TransactionPool} from '../../../db/transaction-pool.ts'; +import {pgClient} from '../../../types/pg.ts'; +import type { + BackfillCompleted, + BackfillRequest, + JSONValue, + MessageBackfill, +} from '../protocol/current.ts'; +import { + columnMetadataSchema, + tableMetadataSchema, +} from './backfill-metadata.ts'; +import { + createReplicationSlot, + makeSelectPublishedStmt, +} from './initial-sync.ts'; +import {toStateVersionString} from './lsn.ts'; +import {getPublicationInfo} from './schema/published.ts'; +import type {Replica} from './schema/shard.ts'; + +type BackfillParams = Omit; + +type StreamOptions = { + /** + * The number of bytes at which to flush a batch of rows in a + * backfill message. Defaults to Node's getDefaultHighWatermark(). + */ + flushThresholdBytes?: number; +}; + +/** + * Streams a series of `backfill` messages (ending with `backfill-complete`) + * at a set watermark (i.e. LSN). The data is retrieved via a COPY stream + * made at a transaction snapshot corresponding to specific LSN, obtained by + * creating a short-lived replication slot. + */ +export async function* streamBackfill( + lc: LogContext, + upstreamURI: string, + {slot, publications}: Pick, + bf: BackfillRequest, + opts: StreamOptions = {}, +): AsyncGenerator { + lc = lc + .withContext('component', 'backfill') + .withContext('table', bf.table.name); + + const {flushThresholdBytes = getDefaultHighWaterMark(false)} = opts; + const db = pgClient(lc, upstreamURI, { + connection: {['application_name']: 'backfill-stream'}, + }); + const tx = new TransactionPool(lc, READONLY).run(db); + try { + const watermark = await setSnapshot(lc, upstreamURI, tx, slot); + const {tableSpec, backfill} = await validateSchema(tx, publications, bf); + const types = await getTypeParsers(db, {returnJsonAsString: true}); + + // Note: validateSchema ensures that the rowKey and columns are disjoint + const {relation, columns} = backfill; + const cols = [...relation.rowKey.columns, ...columns]; + + yield* stream( + lc, + tx, + backfill, + watermark, + makeSelectPublishedStmt(tableSpec, cols), + cols.map(col => types.getTypeParser(tableSpec.columns[col].typeOID)), + flushThresholdBytes, + ); + } finally { + tx.setDone(); + await db.end(); + } +} + +async function* stream( + lc: LogContext, + tx: TransactionPool, + backfill: BackfillParams, + watermark: string, + selectStmt: string, + colParsers: TypeParser[], + flushThresholdBytes: number, +): AsyncGenerator { + lc.info?.(`Starting backfill copy stream:`, selectStmt); + const copyStream = await tx.processReadTask(sql => + sql.unsafe(`COPY (${selectStmt}) TO STDOUT`).readable(), + ); + + const tsvParser = new TsvParser(); + let totalRows = 0; + let rowValues: JSONValue[][] = []; + let bufferedBytes = 0; + + // Tracks the row being parsed. + let row: JSONValue[] = Array.from({length: colParsers.length}); + let col = 0; + + for await (const data of copyStream) { + const chunk = data as Buffer; + for (const text of tsvParser.parse(chunk)) { + row[col] = text === null ? null : (colParsers[col](text) as JSONValue); + + if (++col === colParsers.length) { + rowValues.push(row); + totalRows++; + bufferedBytes += chunk.byteLength; + + row = Array.from({length: colParsers.length}); + col = 0; + + if (bufferedBytes >= flushThresholdBytes) { + yield {tag: 'backfill', ...backfill, watermark, rowValues}; + lc.debug?.( + `Flushed ${rowValues.length} rows (${bufferedBytes} bytes)`, + ); + rowValues = []; + bufferedBytes = 0; + } + } + } + } + + // Flush the last batch of rows. + if (rowValues.length > 0) { + yield {tag: 'backfill', ...backfill, watermark, rowValues}; + lc.debug?.(`Flushed ${rowValues.length} rows (${bufferedBytes} bytes)`); + } + + yield {tag: 'backfill-completed', ...backfill}; + lc.info?.(`Finished streaming ${totalRows} rows`); +} + +/** + * Creates (and drops) a replication slot in order to obtain a snapshot + * that corresponds with a specific LSN. Sets the snapshot on the + * TransactionPool and returns the watermark corresponding to the LSN. + * + * (Note that PG's other LSN-related functions are not scoped to a + * transaction; this is the only way to get set a transaction at a specific + * LSN.) + */ +async function setSnapshot( + lc: LogContext, + upstreamURI: string, + tx: TransactionPool, + slotNamePrefix: string, +) { + const replicationSession = pgClient(lc, upstreamURI, { + ['fetch_types']: false, // Necessary for the streaming protocol + connection: {replication: 'database'}, // https://www.postgresql.org/docs/current/protocol-replication.html + }); + const tempSlot = `${slotNamePrefix}_bf_${Date.now()}`; + try { + const {snapshot_name: snapshot, consistent_point: lsn} = + await createReplicationSlot(lc, replicationSession, tempSlot); + + await tx.processReadTask(sql => + sql.unsafe(`SET TRANSACTION SNAPSHOT '${snapshot}'`), + ); + // Once the snapshot has been set, the replication session and slot can + // be closed / dropped. + await replicationSession.unsafe(`DROP_REPLICATION_SLOT "${tempSlot}"`); + + const watermark = toStateVersionString(lsn); + lc.info?.(`Opened snapshot transaction at LSN ${lsn} (${watermark})`); + return watermark; + } catch (e) { + // In the event of a failure, clean up the replication slot if created. + await replicationSession.unsafe( + /*sql*/ + `SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots + WHERE slot_name = '${tempSlot}'`, + ); + lc.error?.(`Failed to create backfill snapshot`, e); + throw e; + } finally { + await replicationSession.end(); + } +} + +function validateSchema( + tx: TransactionPool, + publications: string[], + bf: BackfillRequest, +): Promise<{ + tableSpec: PublishedTableSpec; + backfill: BackfillParams; +}> { + return tx.processReadTask(async sql => { + const {tables} = await getPublicationInfo(sql, publications); + const spec = tables.find( + spec => spec.schema === bf.table.schema && spec.name === bf.table.name, + ); + if (!spec) { + throw new SchemaIncompatibilityError( + bf, + `Table has been renamed or dropped`, + ); + } + const tableMeta = v.parse(bf.table.metadata, tableMetadataSchema); + if (spec.schemaOID !== tableMeta.schemaOID) { + throw new SchemaIncompatibilityError( + bf, + `Schema no longer corresponds to the original schema`, + ); + } + if (spec.oid !== tableMeta.relationOID) { + throw new SchemaIncompatibilityError( + bf, + `Table no longer corresponds to the original table`, + ); + } + if ( + !equals( + new Set(Object.keys(tableMeta.rowKey)), + new Set(spec.replicaIdentityColumns), + ) + ) { + throw new SchemaIncompatibilityError( + bf, + 'Row key (e.g. PRIMARY KEY or INDEX) has changed', + ); + } + const allCols = [ + ...Object.entries(tableMeta.rowKey), + ...Object.entries(bf.columns), + ]; + for (const [col, val] of allCols) { + const colSpec = spec.columns[col]; + if (!colSpec) { + throw new SchemaIncompatibilityError( + bf, + `Column ${col} has been renamed or dropped`, + ); + } + const colMeta = v.parse(val, columnMetadataSchema); + if (colMeta.attNum !== colSpec.pos) { + throw new SchemaIncompatibilityError( + bf, + `Column ${col} no longer corresponds to the original column`, + ); + } + } + const backfill: BackfillParams = { + relation: { + schema: bf.table.schema, + name: bf.table.name, + rowKey: {columns: Object.keys(tableMeta.rowKey)}, + }, + columns: Object.keys(bf.columns).filter( + col => !(col in tableMeta.rowKey), + ), + }; + return {tableSpec: spec, backfill}; + }); +} + +export class SchemaIncompatibilityError extends Error { + readonly name = 'SchemaIncompatibilityError'; + + constructor(bf: BackfillRequest, msg: string) { + super( + `Cannot backfill ${bf.table.schema}.${bf.table.name}` + + `[${Object.keys(bf.columns).join(',')}]: ${msg}`, + ); + } +} diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index dc688ae2a0..c187e7f63e 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -330,7 +330,7 @@ type ReplicationSlot = { // Note: The replication connection does not support the extended query protocol, // so all commands must be sent using sql.unsafe(). This is technically safe // because all placeholder values are under our control (i.e. "slotName"). -async function createReplicationSlot( +export async function createReplicationSlot( lc: LogContext, session: postgres.Sql, slotName: string, @@ -377,6 +377,22 @@ const MB = 1024 * 1024; const MAX_BUFFERED_ROWS = 10_000; const BUFFERED_SIZE_THRESHOLD = 8 * MB; +export function makeSelectPublishedStmt( + table: PublishedTableSpec, + columns: string[], +) { + const filterConditions = Object.values(table.publications) + .map(({rowFilter}) => rowFilter) + .filter(f => !!f); // remove nulls + return ( + /*sql*/ ` + SELECT ${columns.map(id).join(',')} FROM ${id(table.schema)}.${id(table.name)}` + + (filterConditions.length === 0 + ? '' + : /*sql*/ ` WHERE ${filterConditions.join(' OR ')}`) + ); +} + async function copy( lc: LogContext, table: PublishedTableSpec, @@ -391,16 +407,13 @@ async function copy( const tableName = liteTableName(table); const orderedColumns = Object.entries(table.columns); + const columnNames = orderedColumns.map(([c]) => c); const columnSpecs = orderedColumns.map(([_name, spec]) => spec); - const selectColumns = orderedColumns.map(([c]) => id(c)).join(','); - const insertColumns = orderedColumns.map(([c]) => c); - const insertColumnList = insertColumns.map(c => id(c)).join(','); + const insertColumnList = columnNames.map(c => id(c)).join(','); // (?,?,?,?,?) const valuesSql = - insertColumns.length > 0 - ? `(${'?,'.repeat(insertColumns.length - 1)}?)` - : '()'; + columnNames.length > 0 ? `(${'?,'.repeat(columnNames.length - 1)}?)` : '()'; const insertSql = /*sql*/ ` INSERT INTO "${tableName}" (${insertColumnList}) VALUES ${valuesSql}`; const insertStmt = to.prepare(insertSql); @@ -409,16 +422,7 @@ async function copy( insertSql + `,${valuesSql}`.repeat(INSERT_BATCH_SIZE - 1), ); - const filterConditions = Object.values(table.publications) - .map(({rowFilter}) => rowFilter) - .filter(f => !!f); // remove nulls - const selectStmt = - /*sql*/ ` - SELECT ${selectColumns} FROM ${id(table.schema)}.${id(table.name)}` + - (filterConditions.length === 0 - ? '' - : /*sql*/ ` WHERE ${filterConditions.join(' OR ')}`); - + const selectStmt = makeSelectPublishedStmt(table, columnNames); const valuesPerRow = columnSpecs.length; const valuesPerBatch = valuesPerRow * INSERT_BATCH_SIZE; From defb3161684d7fcfe50a2e9d25077ba8339c87aa Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 9 Feb 2026 13:12:31 -0800 Subject: [PATCH 040/495] chore(zero-cache): move non-pg-specific change-source logic into common (#5534) Make a `change-source/common` package to place code used by both the `pg` and `custom` change source implementations. This organizational change facilitates writing new (e.g. pg) features in a way that makes it easier to added to other (i.e. custom) change source implementations. --- .../change-stream-multiplexer.test.ts | 0 .../{pg => common}/change-stream-multiplexer.ts | 0 .../{ => common}/replica-schema.test.ts | 4 ++-- .../change-source/{ => common}/replica-schema.ts | 14 +++++++------- .../services/change-source/custom/sync-schema.ts | 2 +- .../src/services/change-source/pg/change-source.ts | 2 +- .../src/services/change-source/pg/sync-schema.ts | 2 +- packages/zero-cache/src/workers/replicator.ts | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) rename packages/zero-cache/src/services/change-source/{pg => common}/change-stream-multiplexer.test.ts (100%) rename packages/zero-cache/src/services/change-source/{pg => common}/change-stream-multiplexer.ts (100%) rename packages/zero-cache/src/services/change-source/{ => common}/replica-schema.test.ts (98%) rename packages/zero-cache/src/services/change-source/{ => common}/replica-schema.ts (89%) diff --git a/packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.test.ts b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts similarity index 100% rename from packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.test.ts rename to packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts diff --git a/packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.ts b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts similarity index 100% rename from packages/zero-cache/src/services/change-source/pg/change-stream-multiplexer.ts rename to packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts diff --git a/packages/zero-cache/src/services/change-source/replica-schema.test.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts similarity index 98% rename from packages/zero-cache/src/services/change-source/replica-schema.test.ts rename to packages/zero-cache/src/services/change-source/common/replica-schema.test.ts index 91ded78038..4104837e6d 100644 --- a/packages/zero-cache/src/services/change-source/replica-schema.test.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts @@ -1,10 +1,10 @@ import {beforeEach, describe, test} from 'vitest'; -import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; +import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; import { DbFile, expectMatchingObjectsInTables, initDB as initLiteDB, -} from '../../test/lite.ts'; +} from '../../../test/lite.ts'; import { CREATE_V6_COLUMN_METADATA_TABLE, CREATE_V7_CHANGE_LOG, diff --git a/packages/zero-cache/src/services/change-source/replica-schema.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.ts similarity index 89% rename from packages/zero-cache/src/services/change-source/replica-schema.ts rename to packages/zero-cache/src/services/change-source/common/replica-schema.ts index 6a239581c0..c186513032 100644 --- a/packages/zero-cache/src/services/change-source/replica-schema.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.ts @@ -1,19 +1,19 @@ import type {LogContext} from '@rocicorp/logger'; import {SqliteError} from '@rocicorp/zero-sqlite3'; -import type {Database} from '../../../../zqlite/src/db.ts'; -import {listTables} from '../../db/lite-tables.ts'; +import type {Database} from '../../../../../zqlite/src/db.ts'; +import {listTables} from '../../../db/lite-tables.ts'; import { runSchemaMigrations, type IncrementalMigrationMap, type Migration, -} from '../../db/migration-lite.ts'; -import {AutoResetSignal} from '../change-streamer/schema/tables.ts'; -import {populateFromExistingTables} from '../replicator/schema/column-metadata.ts'; +} from '../../../db/migration-lite.ts'; +import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; +import {populateFromExistingTables} from '../../replicator/schema/column-metadata.ts'; import { CREATE_RUNTIME_EVENTS_TABLE, recordEvent, -} from '../replicator/schema/replication-state.ts'; -import {CREATE_TABLE_METADATA_TABLE} from '../replicator/schema/table-metadata.ts'; +} from '../../replicator/schema/replication-state.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../../replicator/schema/table-metadata.ts'; export async function initReplica( log: LogContext, diff --git a/packages/zero-cache/src/services/change-source/custom/sync-schema.ts b/packages/zero-cache/src/services/change-source/custom/sync-schema.ts index c532cbe501..c689e94a10 100644 --- a/packages/zero-cache/src/services/change-source/custom/sync-schema.ts +++ b/packages/zero-cache/src/services/change-source/custom/sync-schema.ts @@ -1,6 +1,6 @@ import type {LogContext} from '@rocicorp/logger'; import type {ShardConfig} from '../../../types/shards.ts'; -import {initReplica} from '../replica-schema.ts'; +import {initReplica} from '../common/replica-schema.ts'; import {initialSync} from './change-source.ts'; export async function initSyncSchema( diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 67fcf9a85f..1e38fa6935 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -38,6 +38,7 @@ import { type SubscriptionState, } from '../../replicator/schema/replication-state.ts'; import type {ChangeSource, ChangeStream} from '../change-source.ts'; +import {ChangeStreamMultiplexer} from '../common/change-stream-multiplexer.ts'; import type {BackfillRequest, JSONObject} from '../protocol/current.ts'; import type { Identifier, @@ -50,7 +51,6 @@ import type { Data, } from '../protocol/current/downstream.ts'; import type {TableMetadata} from './backfill-metadata.ts'; -import {ChangeStreamMultiplexer} from './change-stream-multiplexer.ts'; import {type InitialSyncOptions} from './initial-sync.ts'; import type { Message, diff --git a/packages/zero-cache/src/services/change-source/pg/sync-schema.ts b/packages/zero-cache/src/services/change-source/pg/sync-schema.ts index aebf517544..bc672c65bb 100644 --- a/packages/zero-cache/src/services/change-source/pg/sync-schema.ts +++ b/packages/zero-cache/src/services/change-source/pg/sync-schema.ts @@ -1,6 +1,6 @@ import type {LogContext} from '@rocicorp/logger'; import type {ShardConfig} from '../../../types/shards.ts'; -import {initReplica} from '../replica-schema.ts'; +import {initReplica} from '../common/replica-schema.ts'; import {initialSync, type InitialSyncOptions} from './initial-sync.ts'; export async function initSyncSchema( diff --git a/packages/zero-cache/src/workers/replicator.ts b/packages/zero-cache/src/workers/replicator.ts index 1011af7bb2..a8fe0536c4 100644 --- a/packages/zero-cache/src/workers/replicator.ts +++ b/packages/zero-cache/src/workers/replicator.ts @@ -3,7 +3,7 @@ import * as v from '../../../shared/src/valita.ts'; import {Database} from '../../../zqlite/src/db.ts'; import type {ReplicaOptions} from '../config/zero-config.ts'; import {deleteLiteDB} from '../db/delete-lite-db.ts'; -import {upgradeReplica} from '../services/change-source/replica-schema.ts'; +import {upgradeReplica} from '../services/change-source/common/replica-schema.ts'; import {Notifier} from '../services/replicator/notifier.ts'; import type { ReplicaState, From 1b53effd10c5dd9ef146f7c6a7fac3e2cb55952b Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 9 Feb 2026 18:18:08 -0800 Subject: [PATCH 041/495] chore(zero-cache): require a rowKey in the TableMetadata object (#5535) Slightly walk back the protocol widening in https://github.com/rocicorp/mono/pull/5531 and restore the requirement that `TableMetadata` objects contain a `rowKey`. Although downstream clients still treat this objects opaquely, having the row key will facilitate upstream-agnostic backfill implementation. --- .../services/change-source/pg/backfill-stream.pg.test.ts | 5 +++-- .../src/services/change-source/protocol/current/data.ts | 7 ++++++- .../src/services/change-source/protocol/version.test.ts | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts index 881d136efd..6a9dce275b 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts @@ -1,6 +1,7 @@ import type {LogContext} from '@rocicorp/logger'; import {beforeEach, describe, expect} from 'vitest'; import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import {must} from '../../../../../shared/src/must.ts'; import {getConnectionURI, type PgTest, test} from '../../../test/db.ts'; import type {PostgresDB} from '../../../types/pg.ts'; import type {BackfillRequest} from '../protocol/current.ts'; @@ -59,7 +60,7 @@ describe('backfill-stream', () => { schema: 'public', name: 'foo', metadata: { - schemaOID: tableSpec.schemaOID, + schemaOID: must(tableSpec.schemaOID), relationOID: tableSpec.oid, rowKey: { id1: {attNum: tableSpec.columns.id1.pos}, @@ -78,7 +79,7 @@ describe('backfill-stream', () => { schema: 'public', name: 'foo', metadata: { - schemaOID: tableSpec.schemaOID, + schemaOID: must(tableSpec.schemaOID), relationOID: tableSpec.oid, rowKey: { id2: {attNum: tableSpec.columns.id2.pos}, diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.ts index 6488011bee..b7e79de5ec 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/data.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.ts @@ -91,7 +91,12 @@ export const newRelationSchema = v.object({ // handled. The is an opaque object that clients must track (and update) based // on `create-table`, `add-column`, and `table-update-metadata` messages, and // pass in BackfillRequests when there are columns to be backfilled. -export const tableMetadataSchema = jsonObjectSchema; +// +// Note that the backfill-related change-source implementation does, however, +// rely on the rowKey (columns) being specified in the message. +export const tableMetadataSchema = v + .object({rowKey: v.record(jsonValueSchema)}) + .rest(jsonValueSchema); export type TableMetadata = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index f0b23e41f2..630e899822 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '2a1vwoxr1ozfw', '/changes/v0/stream'); + t(current, '35xbr3b3bx7j5', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '2a1vwoxr1ozfw', '/changes/v0/stream'); + t(v0, '35xbr3b3bx7j5', '/changes/v0/stream'); }); From 0cdb33421729a646cfd3870a0a2e79e70c8613be Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 10 Feb 2026 11:03:34 -0800 Subject: [PATCH 042/495] chore(zero-cache): add more logging/tests for schema changes (#5536) For investigating: https://discord.com/channels/830183651022471199/1468438348426248234/1469991015766294690 --- .../pg/change-source.end-to-mid.pg.test.ts | 11 ++++++++--- .../src/services/change-source/pg/change-source.ts | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index 4cf3e5215f..f324be84e3 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -1492,8 +1492,11 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { INSERT INTO existing_full (a, b) VALUES ('e', 'f'); ALTER PUBLICATION zero_some_public ADD TABLE existing; - ALTER PUBLICATION zero_some_public ADD TABLE existing_full; + ALTER TABLE existing REPLICA IDENTITY FULL; UPDATE existing SET a = a; + ALTER TABLE existing REPLICA IDENTITY DEFAULT; + + ALTER PUBLICATION zero_some_public ADD TABLE existing_full; UPDATE existing_full SET a = a; `, [ @@ -1510,6 +1513,10 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { }, {tag: 'create-index'}, {tag: 'create-index'}, + {tag: 'update-table-metadata'}, + {tag: 'update'}, + {tag: 'update'}, + {tag: 'update-table-metadata'}, { tag: 'create-table', metadata: { @@ -1521,8 +1528,6 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { {tag: 'create-index'}, {tag: 'update'}, {tag: 'update'}, - {tag: 'update'}, - {tag: 'update'}, ], { existing: [ diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 1e38fa6935..b513941a8d 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -651,8 +651,9 @@ class ChangeMaker { ).map(change => ['data', change] satisfies Data); this.#lc + .withContext('tag', event.event.tag) .withContext('query', event.context.query) - .info?.(`${changes.length} schema change(s)`, changes); + .info?.(`${changes.length} schema change(s)`, {changes}); const replicaIdentities = replicaIdentitiesForTablesWithoutPrimaryKeys( event.schema, From e4149ac985c107dcbae7518b7f32bba261cb41ee Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 10 Feb 2026 13:46:27 -0800 Subject: [PATCH 043/495] chore(zero-cache): add more logging to ddl event trigger (#5537) Log more information in the ddl event trigger For debugging: https://discord.com/channels/830183651022471199/1468438348426248234/1469991015766294690 --- .../change-source/pg/schema/ddl.pg.test.ts | 28 +++++----- .../services/change-source/pg/schema/ddl.ts | 54 +++++++++---------- .../change-source/pg/schema/init.pg.test.ts | 4 +- .../services/change-source/pg/schema/init.ts | 20 ++++--- packages/zero-cache/src/test/db.ts | 6 ++- 5 files changed, 57 insertions(+), 55 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts index 552a8e5c35..5416fc0fec 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts @@ -1331,39 +1331,39 @@ describe('change-source/tables/ddl', () => { test.each([ [ 'CREATE TABLE private.bar(id TEXT PRIMARY KEY, a INT4 UNIQUE, b INT8 UNIQUE, UNIQUE(b, a))', - ['zero(0) ignoring private.bar'], + [/ignoring CREATE TABLE .*private.bar/], ], [ 'CREATE INDEX foo_name_index on private.foo (name desc, id)', - ['zero(0) ignoring private.foo_name_index'], + [/ignoring CREATE INDEX .*private.foo_name_index/], ], [ 'ALTER TABLE private.foo RENAME TO food', - ['zero(0) ignoring private.food'], + [/ignoring ALTER TABLE .*private.food/], ], [ 'ALTER TABLE private.foo ADD username TEXT UNIQUE', - ['zero(0) ignoring private.foo'], + [/ignoring ALTER TABLE .*private.foo/], ], [ `ALTER TABLE private.foo ADD bar text DEFAULT 'boo'`, - ['zero(0) ignoring private.foo'], + [/ignoring ALTER TABLE .*private.foo/], ], [ `ALTER TABLE private.foo ALTER name SET DEFAULT 'alice'`, - ['zero(0) ignoring private.foo'], + [/ignoring ALTER TABLE .*private.foo/], ], [ `ALTER TABLE private.foo RENAME name to handle`, - ['zero(0) ignoring private.foo.handle'], + [/ignoring ALTER TABLE .*private.foo.handle/], ], [ `ALTER TABLE private.foo drop description`, - ['zero(0) ignoring private.foo'], + [/ignoring ALTER TABLE .*private.foo/], ], [ `ALTER PUBLICATION nonzeropub ADD TABLE pub.yoo`, - ['zero(0) ignoring pub.yoo in publication nonzeropub'], + [/ignoring ALTER PUBLICATION .*pub.yoo in publication nonzeropub/], ], [ ` @@ -1379,16 +1379,16 @@ describe('change-source/tables/ddl', () => { ); SELECT "dataVersion", "schemaVersion", "minSafeVersion" FROM "cvr"."versionHistory"; `, - ['zero(0) ignoring cvr."versionHistory"'], + [/ignoring CREATE TABLE .*cvr.\\"versionHistory\\"/], ], [ `CREATE TABLE IF NOT EXISTS pub.foo(id TEXT PRIMARY KEY, name TEXT UNIQUE, description TEXT);`, [ - `relation "foo" already exists, skipping`, - `zero(0) ignoring noop CREATE TABLE`, + /relation \"foo\" already exists, skipping/, + /ignoring CREATE TABLE .*\"object_identity\":null/, ], ], - ] satisfies [string, string[]][])( + ] satisfies [string, RegExp[]][])( 'ignore unrelated events: %s', async (query, expectedNotices) => { while (notices.size()) { @@ -1423,7 +1423,7 @@ describe('change-source/tables/ddl', () => { for (const n of expectedNotices) { const notice = await notices.dequeue(); - expect(notice.message).toBe(n); + expect(notice.message).toMatch(n); } }, ); diff --git a/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts b/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts index 346b7d4d59..ee75b75a5f 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts @@ -107,10 +107,10 @@ END $$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION ${schema}.notice_ignore(object_id TEXT) +CREATE OR REPLACE FUNCTION ${schema}.notice_ignore(tag TEXT, target record) RETURNS void AS $$ BEGIN - RAISE NOTICE 'zero(%) ignoring %', ${lit(shardNum)}, object_id; + RAISE NOTICE 'zero(%) ignoring % %', ${lit(shardNum)}, tag, row_to_json(target); END $$ LANGUAGE plpgsql; @@ -157,7 +157,7 @@ CREATE OR REPLACE FUNCTION ${schema}.emit_ddl_end(tag TEXT) RETURNS void AS $$ DECLARE publications TEXT[]; - cmd RECORD; + target RECORD; relevant RECORD; schema_specs TEXT; message TEXT; @@ -167,78 +167,72 @@ BEGIN SELECT objid, object_type, object_identity FROM pg_event_trigger_ddl_commands() - WHERE object_type IN ( - 'table', - 'table column', - 'index', - 'publication relation', - 'publication namespace', - 'schema') - LIMIT 1 INTO cmd; + LIMIT 1 INTO target; -- Filter DDL updates that are not relevant to the shard (i.e. publications) when possible. - IF cmd.object_type = 'table' OR cmd.object_type = 'table column' THEN + IF target.object_type = 'table' OR target.object_type = 'table column' THEN SELECT ns.nspname AS "schema", c.relname AS "name" FROM pg_class AS c JOIN pg_namespace AS ns ON c.relnamespace = ns.oid JOIN pg_publication_tables AS pb ON pb.schemaname = ns.nspname AND pb.tablename = c.relname - WHERE c.oid = cmd.objid AND pb.pubname = ANY (publications) + WHERE c.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(cmd.object_identity); + PERFORM ${schema}.notice_ignore(tag, target); RETURN; END IF; - cmd.object_type := 'table'; -- normalize the 'table column' target to 'table' - - ELSIF cmd.object_type = 'index' THEN + ELSIF target.object_type = 'index' THEN SELECT ns.nspname AS "schema", c.relname AS "name" FROM pg_class AS c JOIN pg_namespace AS ns ON c.relnamespace = ns.oid JOIN pg_indexes as ind ON ind.schemaname = ns.nspname AND ind.indexname = c.relname JOIN pg_publication_tables AS pb ON pb.schemaname = ns.nspname AND pb.tablename = ind.tablename - WHERE c.oid = cmd.objid AND pb.pubname = ANY (publications) + WHERE c.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(cmd.object_identity); + PERFORM ${schema}.notice_ignore(tag, target); RETURN; END IF; - ELSIF cmd.object_type = 'publication relation' THEN + ELSIF target.object_type = 'publication relation' THEN SELECT pb.pubname FROM pg_publication_rel AS rel JOIN pg_publication AS pb ON pb.oid = rel.prpubid - WHERE rel.oid = cmd.objid AND pb.pubname = ANY (publications) + WHERE rel.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(cmd.object_identity); + PERFORM ${schema}.notice_ignore(tag, target); RETURN; END IF; - ELSIF cmd.object_type = 'publication namespace' THEN + ELSIF target.object_type = 'publication namespace' THEN SELECT pb.pubname FROM pg_publication_namespace AS ns JOIN pg_publication AS pb ON pb.oid = ns.pnpubid - WHERE ns.oid = cmd.objid AND pb.pubname = ANY (publications) + WHERE ns.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(cmd.object_identity); + PERFORM ${schema}.notice_ignore(tag, target); RETURN; END IF; - ELSIF cmd.object_type = 'schema' THEN + ELSIF target.object_type = 'schema' THEN SELECT ns.nspname AS "schema", c.relname AS "name" FROM pg_class AS c JOIN pg_namespace AS ns ON c.relnamespace = ns.oid JOIN pg_publication_tables AS pb ON pb.schemaname = ns.nspname AND pb.tablename = c.relname - WHERE ns.oid = cmd.objid AND pb.pubname = ANY (publications) + WHERE ns.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(cmd.object_identity); + PERFORM ${schema}.notice_ignore(tag, target); RETURN; END IF; - ELSIF tag LIKE 'CREATE %' THEN - PERFORM ${schema}.notice_ignore('noop ' || tag); + -- no-op CREATE IF NOT EXIST statements + ELSIF tag LIKE 'CREATE %' AND target.object_type IS NULL THEN + PERFORM ${schema}.notice_ignore(tag, target); RETURN; END IF; + RAISE INFO 'Creating ddlUpdate for % %', tag, row_to_json(target); + -- Construct and emit the DdlUpdateEvent message. SELECT json_build_object('tag', tag) INTO event; diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts index e1002e25a6..5f9023e208 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts @@ -21,8 +21,8 @@ const SHARD_NUM = 23; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 13, - schemaVersion: 13, + dataVersion: 14, + schemaVersion: 14, minSafeVersion: 1, lock: 'v', } as const; diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.ts index 385a7b8082..610477e750 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.ts @@ -196,14 +196,8 @@ function getIncrementalMigrations( 11: {}, // Upgrade DDL trigger to query schemaOID, needed information for auto-backfill. - 12: { - migrateSchema: async (lc, sql) => { - const [{publications}] = await sql<{publications: string[]}[]>` - SELECT publications FROM ${sql(shardConfigTable)}`; - await setupTriggers(lc, sql, {...shard, publications}); - lc.info?.(`Upgraded DDL event triggers`); - }, - }, + // (subsumed by v14) + 12: {}, // Recreates the legacy schemaVersions table that was prematurely dropped // in the (former) v11 migration. It needs to remain present for at least one @@ -227,6 +221,16 @@ function getIncrementalMigrations( `; }, }, + + // Upgrade DDL trigger to log more info to PG logs. + 14: { + migrateSchema: async (lc, sql) => { + const [{publications}] = await sql<{publications: string[]}[]>` + SELECT publications FROM ${sql(shardConfigTable)}`; + await setupTriggers(lc, sql, {...shard, publications}); + lc.info?.(`Upgraded DDL event triggers`); + }, + }, }; } diff --git a/packages/zero-cache/src/test/db.ts b/packages/zero-cache/src/test/db.ts index a4ad4a9e93..ffe7b34661 100644 --- a/packages/zero-cache/src/test/db.ts +++ b/packages/zero-cache/src/test/db.ts @@ -36,8 +36,12 @@ const CONNECTION_URI = mustInject('pgConnectionString'); export type OnNoticeFn = (n: postgres.Notice) => void; +const IGNORE_LEVELS = new Set(['DEBUG', 'INFO', 'NOTICE']); + const defaultOnNotice: OnNoticeFn = n => { - n.severity !== 'NOTICE' && console.log(n); + if (!IGNORE_LEVELS.has(n.severity)) { + console.log(n); + } }; export class TestDBs { From 7259a83f56dfa8e5065e89bacb564d586535460e Mon Sep 17 00:00:00 2001 From: GRBurst <4647221+GRBurst@users.noreply.github.com> Date: Wed, 11 Feb 2026 11:54:01 +0100 Subject: [PATCH 044/495] feat(zero): add support for timetz datatype (#5417) Based on the PR https://github.com/rocicorp/mono/pull/4671 adding support for `time` datatype, this adds the `timetz` datatype. Interestingly, everything to do so was already in place (like the [timetz type](https://github.com/rocicorp/mono/blob/main/packages/zero-cache/src/types/pg-types.ts#L51)), so we only have to slightly extend existing logic. You can find information about the pg types in postgres' [datatype-date doc](https://www.postgresql.org/docs/current/datatype-datetime.html). Tests were added to test the new behavior. Note: `time` is actually `time without timezone` and therefore adding this would only adding the correct mapping. Hence the added code is mainly related to support `timezone`s and is similar to the code that is in place for `timestamp with timezone`. Edit: I tested this PR in our application test setup and with our application now as well. I was previously facing the error: ``` Error: Schema incompatibility detected between your zero schema definition and the database: - Type mismatch for column "time" in table "": time without time zone is currently unsupported in Zero. Please file a bug at https://bugs.rocicorp.dev/ Please update your schema definition to match the database or migrate your database to match the schema. ``` This PR solves our problems (test passes with it and ui works) and removes a blocker for us. The outcome is as expected. | postgres | app ui | | ------------- | --------- | | image | image | --------- Signed-off-by: GRBurst Co-authored-by: Erik Arvidsson --- packages/zero-cache/src/types/pg-data-type.ts | 2 + packages/zero-cache/src/types/pg.pg.test.ts | 32 ++++++--- packages/zero-cache/src/types/pg.test.ts | 67 ++++++++++--------- packages/zero-cache/src/types/pg.ts | 32 +++++++-- 4 files changed, 87 insertions(+), 46 deletions(-) diff --git a/packages/zero-cache/src/types/pg-data-type.ts b/packages/zero-cache/src/types/pg-data-type.ts index 872001ed8c..1db401137a 100644 --- a/packages/zero-cache/src/types/pg-data-type.ts +++ b/packages/zero-cache/src/types/pg-data-type.ts @@ -47,6 +47,8 @@ export const pgToZqlTypeMap = Object.freeze({ // Date/Time types 'date': 'number', 'time': 'number', + 'time with time zone': 'number', + 'time without time zone': 'number', 'timestamp': 'number', 'timestamptz': 'number', 'timestamp with time zone': 'number', diff --git a/packages/zero-cache/src/types/pg.pg.test.ts b/packages/zero-cache/src/types/pg.pg.test.ts index c4cde0ff97..5d0561d406 100644 --- a/packages/zero-cache/src/types/pg.pg.test.ts +++ b/packages/zero-cache/src/types/pg.pg.test.ts @@ -21,6 +21,8 @@ describe('types/pg', () => { beforeEach(async ({testDBs}) => { db = await testDBs.create('pg_types'); + // Ensures deterministic behavior of the tests + await db.unsafe("SET TIME ZONE 'UTC'"); await db.unsafe(` CREATE TABLE bigints( big int8, @@ -38,7 +40,9 @@ describe('types/pg', () => { ); CREATE TABLE times( time time, - times time[] + timetz timetz, + times time[], + timetzs timetz[] ); `); @@ -108,18 +112,30 @@ describe('types/pg', () => { }); testPg.for([ - ['00:00', 0], - ['09:15:32', 33332000], - ['14:15:10.1234564', 51310123], // default precision of postgres is 6 fractional digits -> rounded down - ['24:00', 86400000], - ])('time: %s', async ([input, expected]) => { + ['00:00', 0, 0], + ['09:15:32', 33332000, 33332000], + ['14:15:10.1234564', 51310123, 51310123], // default precision of postgres is 6 fractional digits -> rounded down + ['24:00', 86400000, 86400000], // PostgreSQL allows 24:00 as a special case representing midnight at the end of the day, which is equivalent to 00:00 of the next day. This is represented as 86400000 milliseconds, which is the total number of milliseconds in a day. + + // Timezone tests + ['12:00:00+00', 43200000, 43200000], + ['12:00:00+02', 43200000, 36000000], + ['12:00:00-05', 43200000, 61200000], + + ['01:00:00+02', 3600000, 82800000], // time: 01:00, timetz: 23:00 prev day + ['23:00:00-02', 82800000, 3600000], // time: 23:00, timetz: 01:00 next day + ])('time: %s', async ([input, expectedTime, expectedTimeTz]) => { await db`INSERT INTO times ${db({ time: input, + timetz: input, times: [input, input], + timetzs: [input, input], })}`; expect((await db`SELECT * FROM times`)[0]).toEqual({ - time: expected, - times: [expected, expected], + time: expectedTime, + timetz: expectedTimeTz, + times: [expectedTime, expectedTime], + timetzs: [expectedTimeTz, expectedTimeTz], }); }); diff --git a/packages/zero-cache/src/types/pg.test.ts b/packages/zero-cache/src/types/pg.test.ts index 3f39cde18c..eddbcf2c26 100644 --- a/packages/zero-cache/src/types/pg.test.ts +++ b/packages/zero-cache/src/types/pg.test.ts @@ -29,31 +29,31 @@ describe('timestampToFpMillis', () => { describe('millisecondsToPostgresTime', () => { describe('valid inputs', () => { test.each([ - ['0 milliseconds', 0, '00:00:00.000'], - ['1 second (1000ms)', 1000, '00:00:01.000'], - ['1 minute (60000ms)', 60000, '00:01:00.000'], - ['1 hour (3600000ms)', 3600000, '01:00:00.000'], - ['1 millisecond', 1, '00:00:00.001'], - ['123 milliseconds', 123, '00:00:00.123'], - ['999 milliseconds', 999, '00:00:00.999'], + ['0 milliseconds', 0, '00:00:00.000+00'], + ['1 second (1000ms)', 1000, '00:00:01.000+00'], + ['1 minute (60000ms)', 60000, '00:01:00.000+00'], + ['1 hour (3600000ms)', 3600000, '01:00:00.000+00'], + ['1 millisecond', 1, '00:00:00.001+00'], + ['123 milliseconds', 123, '00:00:00.123+00'], + ['999 milliseconds', 999, '00:00:00.999+00'], [ 'complex time 12:34:56.789', 12 * 3600000 + 34 * 60000 + 56 * 1000 + 789, - '12:34:56.789', + '12:34:56.789+00', ], [ 'maximum valid time (23:59:59.999)', 24 * 60 * 60 * 1000 - 1, - '23:59:59.999', + '23:59:59.999+00', ], [ 'single digit padding (01:02:03.004)', 1 * 3600000 + 2 * 60000 + 3 * 1000 + 4, - '01:02:03.004', + '01:02:03.004+00', ], - ['millisecond padding - 1000ms', 1000, '00:00:01.000'], - ['millisecond padding - 1010ms', 1010, '00:00:01.010'], - ['millisecond padding - 1100ms', 1100, '00:00:01.100'], + ['millisecond padding - 1000ms', 1000, '00:00:01.000+00'], + ['millisecond padding - 1010ms', 1010, '00:00:01.010+00'], + ['millisecond padding - 1100ms', 1100, '00:00:01.100+00'], ])('should convert %s correctly to %s', (_caseName, input, expected) => { expect(millisecondsToPostgresTime(input)).toBe(expected); }); @@ -64,12 +64,12 @@ describe('millisecondsToPostgresTime', () => { [ 'last millisecond of day', 23 * 3600000 + 59 * 60000 + 59 * 1000 + 999, - '23:59:59.999', + '23:59:59.999+00', ], - ['noon exactly', 12 * 3600000, '12:00:00.000'], - ['10 seconds', 10000, '00:00:10.000'], - ['100 seconds', 100000, '00:01:40.000'], - ['1000 seconds', 1000000, '00:16:40.000'], + ['noon exactly', 12 * 3600000, '12:00:00.000+00'], + ['10 seconds', 10000, '00:00:10.000+00'], + ['100 seconds', 100000, '00:01:40.000+00'], + ['1000 seconds', 1000000, '00:16:40.000+00'], ])('should handle %s', (_caseName, input, expected) => { expect(millisecondsToPostgresTime(input)).toBe(expected); }); @@ -98,11 +98,11 @@ describe('millisecondsToPostgresTime', () => { describe('precision and formatting', () => { test.each([ - ['zero', 0, '00:00:00.000'], - ['1 second exact', 1000, '00:00:01.000'], - ['1 second + 1ms', 1001, '00:00:01.001'], - ['1 second + 10ms', 1010, '00:00:01.010'], - ['1 second + 100ms', 1100, '00:00:01.100'], + ['zero', 0, '00:00:00.000+00'], + ['1 second exact', 1000, '00:00:01.000+00'], + ['1 second + 1ms', 1001, '00:00:01.001+00'], + ['1 second + 10ms', 1010, '00:00:01.010+00'], + ['1 second + 100ms', 1100, '00:00:01.100+00'], ])( 'should include three decimal places for %s', (_caseName, input, expected) => { @@ -119,18 +119,18 @@ describe('millisecondsToPostgresTime', () => { 'should maintain consistent format length for %s', (_caseName, input) => { const result = millisecondsToPostgresTime(input); - expect(result.length).toBe(12); // HH:MM:SS.mmm = 12 characters - expect(result).toMatch(/^\d{2}:\d{2}:\d{2}\.\d{3}$/); + expect(result.length).toBe(15); // HH:MM:SS.mmm+00 = 15 characters + expect(result).toMatch(/^\d{2}:\d{2}:\d{2}\.\d{3}\+00$/); }, ); }); describe('mathematical accuracy', () => { test.each([ - ['midnight', 0, 0, 0, 0, '00:00:00.000'], - ['all ones', 1, 1, 1, 1, '01:01:01.001'], - ['random time', 10, 30, 45, 500, '10:30:45.500'], - ['end of day', 23, 59, 59, 999, '23:59:59.999'], + ['midnight', 0, 0, 0, 0, '00:00:00.000+00'], + ['all ones', 1, 1, 1, 1, '01:01:01.001+00'], + ['random time', 10, 30, 45, 500, '10:30:45.500+00'], + ['end of day', 23, 59, 59, 999, '23:59:59.999+00'], ])( 'should convert %s accurately', (_caseName, hours, minutes, seconds, ms, expected) => { @@ -140,9 +140,9 @@ describe('millisecondsToPostgresTime', () => { ); test.each([ - ['0.1ms rounds down', 0.1, '00:00:00.000'], - ['999.9ms rounds down', 999.9, '00:00:00.999'], - ['1000.1ms rounds down', 1000.1, '00:00:01.000'], + ['0.1ms rounds down', 0.1, '00:00:00.000+00'], + ['999.9ms rounds down', 999.9, '00:00:00.999+00'], + ['1000.1ms rounds down', 1000.1, '00:00:01.000+00'], ])( 'should handle floating point precision: %s', (_caseName, input, expected) => { @@ -220,6 +220,9 @@ describe('postgresTimeToMilliseconds', () => { ['24:00:00 exactly', '24:00:00', 86400000], ['24:00:00 with zero milliseconds', '24:00:00.000', 86400000], ['24:00:00 with zero microseconds', '24:00:00.000000', 86400000], + ['24:00:00 with UTC timezone', '24:00:00+00', 86400000], + ['24:00:00 with positive timezone offset', '24:00:00+02', 79200000], + ['24:00:00 with negative timezone (wraps)', '24:00:00-05', 18000000], ])('should handle %s', (_caseName, input, expected) => { expect(postgresTimeToMilliseconds(input)).toBe(expected); }); diff --git a/packages/zero-cache/src/types/pg.ts b/packages/zero-cache/src/types/pg.ts index 8f4ff3d15c..218133eba2 100644 --- a/packages/zero-cache/src/types/pg.ts +++ b/packages/zero-cache/src/types/pg.ts @@ -12,6 +12,7 @@ import { TIME, TIMESTAMP, TIMESTAMPTZ, + TIMETZ, } from './pg-types.ts'; // exported for testing. @@ -99,7 +100,7 @@ export function millisecondsToPostgresTime(milliseconds: number): string { const seconds = totalSeconds % 60; const ms = milliseconds % 1000; - return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${ms.toString().padStart(3, '0')}`; + return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${ms.toString().padStart(3, '0')}+00`; } export function postgresTimeToMilliseconds(timeString: string): number { @@ -108,13 +109,15 @@ export function postgresTimeToMilliseconds(timeString: string): number { throw new Error('Invalid time string: must be a non-empty string'); } - // Regular expression to match HH:MM:SS or HH:MM:SS.mmm format - const timeRegex = /^(\d{1,2}):(\d{2}):(\d{2})(?:\.(\d{1,6}))?$/; + // Regular expression to match HH:MM:SS, HH:MM:SS.mmm, or HH:MM:SS+00 / HH:MM:SS.mmm+00 + // Supports optional timezone offset + const timeRegex = + /^(\d{1,2}):(\d{2}):(\d{2})(?:\.(\d{1,6}))?(?:([+-])(\d{1,2})(?::(\d{2}))?)?$/; const match = timeString.match(timeRegex); if (!match) { throw new Error( - `Invalid time format: "${timeString}". Expected HH:MM:SS or HH:MM:SS.mmm`, + `Invalid time format: "${timeString}". Expected HH:MM:SS[.mmm][+|-HH[:MM]]`, ); } @@ -161,9 +164,26 @@ export function postgresTimeToMilliseconds(timeString: string): number { } // Calculate total milliseconds - const totalMs = + let totalMs = hours * 3600000 + minutes * 60000 + seconds * 1000 + milliseconds; + // Timezone Offset + if (match[5]) { + const sign = match[5] === '+' ? 1 : -1; + const tzHours = parseInt(match[6], 10); + const tzMinutes = match[7] ? parseInt(match[7], 10) : 0; + const offsetMs = sign * (tzHours * 3600000 + tzMinutes * 60000); + totalMs -= offsetMs; + } + + // Normalize to 0-24h only if outside valid range + if (totalMs > MILLISECONDS_PER_DAY || totalMs < 0) { + return ( + ((totalMs % MILLISECONDS_PER_DAY) + MILLISECONDS_PER_DAY) % + MILLISECONDS_PER_DAY + ); + } + return totalMs; } @@ -222,7 +242,7 @@ export const postgresTypeConfig = ({sendStringAsJson}: TypeOptions = {}) => ({ // Times are converted as strings time: { to: TIME, - from: [TIME], + from: [TIME, TIMETZ], serialize: (x: unknown) => { switch (typeof x) { case 'string': From 72b010fb849cfde43805dcdb0ce33751df027ea7 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 11 Feb 2026 12:03:47 +0100 Subject: [PATCH 045/495] fix(replicache-perf): remove unsupported devtools option (#5540) The `devtools` option was removed from `launchPersistentContext()` in Playwright v1.58.0. It's only supported in the regular `launch()` method. When running with `--devtools`, the browser still stays open indefinitely, allowing users to manually open DevTools (F12 or browser menu). See: https://github.com/microsoft/playwright/releases/tag/v1.58.0 --- packages/replicache-perf/src/runner.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/replicache-perf/src/runner.ts b/packages/replicache-perf/src/runner.ts index 87d7b7ccf0..e3340ce8cf 100644 --- a/packages/replicache-perf/src/runner.ts +++ b/packages/replicache-perf/src/runner.ts @@ -193,10 +193,9 @@ async function main() { } first = false; assert(browser !== 'all'); - const context = await playwright[browser].launchPersistentContext( - userDataDir, - {devtools: options.devtools ?? false}, - ); + + const context = + await playwright[browser].launchPersistentContext(userDataDir); const page = await context.newPage(); // The perf test should only import out/replicache. From 15b2ebf75d8e26cb3d920c2adca066ea315e3fb9 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 11 Feb 2026 09:27:10 -0800 Subject: [PATCH 046/495] chore(zero-cache): BackfillManager initiates and manages backfill streams (#5538) The BackfillManager is an upstream-agnostic producer of Change messages that initiates [backfill streams](https://github.com/rocicorp/mono/pull/5533) (of which there is currently a single postgres implementation) and uses the [ChangeStreamMultiplexer](url) to package the messages into intervening transactions (with [minor versions](https://github.com/rocicorp/mono/pull/5512)) when there are no pending changes from the main replication stream. This implements most aspects backfill control and management, including: * [initiation](https://www.notion.so/replicache/Auto-backfill-Schema-Change-Replication-2cb3bed8954580ee8c92e3a730c38772?source=copy_link#2e03bed895458075bda6f8f4dbe9f64f) of backfill requests from schema changes with backfill directives * [invalidation](https://www.notion.so/replicache/Auto-backfill-Schema-Change-Replication-2cb3bed8954580ee8c92e3a730c38772?source=copy_link#2e73bed895458039b4eed7f02396c4fa) of running backfill requests, and updating pending backfill metadata, based on schema changes from the replication stream * [resumption](https://www.notion.so/replicache/Auto-backfill-Schema-Change-Replication-2cb3bed8954580ee8c92e3a730c38772?source=copy_link#2e73bed8954580e5962ef5cd80162619) of [backfill requests from the change-streamer](https://github.com/rocicorp/mono/pull/5498) if the previous replication session ended before a backfill completed * [completion](https://www.notion.so/replicache/Auto-backfill-Schema-Change-Replication-2cb3bed8954580ee8c92e3a730c38772?source=copy_link#2e73bed8954580899daecdf7b0490efc) of backfill requests The next (and final) step is the actual creation of the backfill directives at the ChangeSource level to kick everything off. --- .../common/backfill-manager.test.ts | 1486 +++++++++++++++++ .../change-source/common/backfill-manager.ts | 472 ++++++ .../common/change-stream-multiplexer.test.ts | 9 +- .../common/change-stream-multiplexer.ts | 27 +- .../change-source/pg/change-source.ts | 33 +- 5 files changed, 1998 insertions(+), 29 deletions(-) create mode 100644 packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts create mode 100644 packages/zero-cache/src/services/change-source/common/backfill-manager.ts diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts new file mode 100644 index 0000000000..b86f2048de --- /dev/null +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts @@ -0,0 +1,1486 @@ +import type {LogContext} from '@rocicorp/logger'; +import {beforeEach, describe, expect, test} from 'vitest'; +import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import {must} from '../../../../../shared/src/must.ts'; +import {Queue} from '../../../../../shared/src/queue.ts'; +import {sleep} from '../../../../../shared/src/sleep.ts'; +import { + majorVersionFromString, + majorVersionToString, +} from '../../../types/state-version.ts'; +import type { + BackfillCompleted, + BackfillRequest, + ChangeStreamMessage, + MessageBackfill, +} from '../protocol/current.ts'; +import {BackfillManager} from './backfill-manager.ts'; +import {ChangeStreamMultiplexer} from './change-stream-multiplexer.ts'; + +describe('backfill-manager', () => { + let backfillManager: BackfillManager; + let changeStream: ChangeStreamMultiplexer; + let backfillRequests: BackfillRequest[]; + let testStreams: ((MessageBackfill | BackfillCompleted)[] | Error)[]; + let changes: Queue; + let lc: LogContext; + + beforeEach(() => { + lc = createSilentLogContext(); + changeStream = new ChangeStreamMultiplexer(lc, '123'); + backfillManager = new BackfillManager( + lc, + changeStream, + backfillStreamer, + 10, + 50, + ); + changeStream.addProducers(backfillManager).addListeners(backfillManager); + backfillRequests = []; + testStreams = []; + changes = new Queue(); + + // Drain ChangeStreamMessages to the changes queue. + void (async () => { + for await (const msg of changeStream.asSource()) { + changes.enqueue(msg); + } + })(); + }); + + async function* backfillStreamer( + req: BackfillRequest, + ): AsyncGenerator { + lc.debug?.(`starting test backfill stream for`, req); + backfillRequests.push(req); + const stream = must( + testStreams.shift(), + `No more testStreams configured by test`, + ); + + if (stream instanceof Error) { + throw stream; // For testing backfill errors + } + + for (const msg of stream) { + yield msg; + } + } + + async function drainChanges(n: number): Promise { + const c: ChangeStreamMessage[] = []; + for (let i = 0; i < n; i++) { + c.push(await changes.dequeue()); + } + return c; + } + + test('backfill initiated by change-streamer request', async () => { + testStreams.push([ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [ + [1, 2], + [3, 4], + ], + }, + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [ + [5, 6], + [7, 8], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + }, + ]); + + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + + expect(await drainChanges(5)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '123.01'}], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + rowValues: [ + [1, 2], + [3, 4], + ], + tag: 'backfill', + watermark: '130', + }, + ], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + rowValues: [ + [5, 6], + [7, 8], + ], + tag: 'backfill', + watermark: '130', + }, + ], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + tag: 'backfill-completed', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '123.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + }); + + test('table backfill initiated by create-table', async () => { + testStreams.push([ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [ + [1, 2], + [3, 4], + ], + }, + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [ + [5, 6], + [7, 8], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + }, + ]); + void backfillManager.run('123', []); + + await changeStream.reserve('main'); + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'create-table', + spec: { + schema: 'foo', + name: 'bar', + columns: { + a: {dataType: 'text', pos: 0}, + b: {dataType: 'text', pos: 1}, + }, + }, + metadata: {rowKey: {a: 123}}, + backfill: { + a: {id: '123'}, + b: {id: '234'}, + }, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('125'); + + expect(await drainChanges(8)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + backfill: {a: {id: '123'}, b: {id: '234'}}, + metadata: {rowKey: {a: 123}}, + spec: { + columns: { + a: {dataType: 'text', pos: 0}, + b: {dataType: 'text', pos: 1}, + }, + name: 'bar', + schema: 'foo', + }, + tag: 'create-table', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + rowValues: [ + [1, 2], + [3, 4], + ], + tag: 'backfill', + watermark: '130', + }, + ], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + rowValues: [ + [5, 6], + [7, 8], + ], + tag: 'backfill', + watermark: '130', + }, + ], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + tag: 'backfill-completed', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + }); + + test('column backfill initiated by add-column', async () => { + testStreams.push([ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [ + [1, 2], + [3, 4], + ], + }, + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [ + [5, 6], + [7, 8], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + }, + ]); + void backfillManager.run('123', []); + + await changeStream.reserve('main'); + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '130'}], + [ + 'data', + { + tag: 'add-column', + table: { + schema: 'foo', + name: 'bar', + }, + column: {name: 'b', spec: {dataType: 'text', pos: 1}}, + tableMetadata: {rowKey: {a: 123}}, + backfill: {id: '789'}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '130'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('130'); + + expect(await drainChanges(8)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '130'}], + [ + 'data', + { + backfill: {id: '789'}, + tableMetadata: {rowKey: {a: 123}}, + table: { + name: 'bar', + schema: 'foo', + }, + column: {name: 'b', spec: {dataType: 'text', pos: 1}}, + tag: 'add-column', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '130'}], + ['begin', {tag: 'begin'}, {commitWatermark: '130.01'}], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + rowValues: [ + [1, 2], + [3, 4], + ], + tag: 'backfill', + watermark: '130', + }, + ], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + rowValues: [ + [5, 6], + [7, 8], + ], + tag: 'backfill', + watermark: '130', + }, + ], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + tag: 'backfill-completed', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '130.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + { + columns: {b: {id: '789'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + }); + + test('backfill metadata updated by schema changes', async () => { + testStreams.push([ + { + tag: 'backfill-completed', + relation: {schema: 'boo', name: 'far', rowKey: {columns: ['z']}}, + columns: ['d', 'c'], + }, + ]); + void backfillManager.run('123', []); + + await changeStream.reserve('main'); + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'create-table', + spec: { + schema: 'zoo', + name: 'dar', + columns: { + a: {dataType: 'text', pos: 0}, + b: {dataType: 'text', pos: 1}, + }, + }, + metadata: {rowKey: {a: 123}}, + backfill: { + a: {id: '123'}, + b: {id: '234'}, + }, + }, + ], + [ + 'data', + { + tag: 'create-table', + spec: { + schema: 'foo', + name: 'bar', + columns: { + a: {dataType: 'text', pos: 0}, + b: {dataType: 'text', pos: 1}, + }, + }, + metadata: {rowKey: {a: 123}}, + backfill: { + a: {id: '123'}, + b: {id: '234'}, + }, + }, + ], + [ + 'data', + { + tag: 'add-column', + table: {schema: 'foo', name: 'bar'}, + column: {name: 'e', spec: {dataType: 'text', pos: 1}}, + tableMetadata: {rowKey: {a: 123}}, + backfill: {id: '999'}, + }, + ], + [ + 'data', + { + tag: 'update-column', + table: {schema: 'foo', name: 'bar'}, + old: {name: 'b', spec: {dataType: 'text', pos: 1}}, + new: {name: 'd', spec: {dataType: 'text', pos: 1}}, + }, + ], + [ + 'data', + { + tag: 'add-column', + table: {schema: 'foo', name: 'bar'}, + column: {name: 'c', spec: {dataType: 'text', pos: 1}}, + tableMetadata: {rowKey: {a: 123}}, + backfill: {id: '765'}, + }, + ], + [ + 'data', + { + tag: 'drop-column', + table: {schema: 'foo', name: 'bar'}, + column: 'e', + }, + ], + [ + 'data', + { + tag: 'update-column', + table: {schema: 'foo', name: 'bar'}, + old: {name: 'a', spec: {dataType: 'text', pos: 1}}, + new: {name: 'z', spec: {dataType: 'text', pos: 1}}, + }, + ], + [ + 'data', + { + tag: 'update-table-metadata', + table: {schema: 'foo', name: 'bar'}, + old: {rowKey: {a: 123}}, + new: {rowKey: {z: 123}}, + }, + ], + [ + 'data', + { + tag: 'rename-table', + old: {schema: 'foo', name: 'bar'}, + new: {schema: 'boo', name: 'far'}, + }, + ], + [ + 'data', + { + tag: 'drop-table', + id: {schema: 'zoo', name: 'dar'}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('125'); + + expect((await drainChanges(15)).slice(-3)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + [ + 'data', + { + columns: ['d', 'c'], + relation: { + name: 'far', + rowKey: {columns: ['z']}, + schema: 'boo', + }, + tag: 'backfill-completed', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + { + columns: { + c: {id: '765'}, + d: {id: '234'}, + z: {id: '123'}, + }, + table: { + metadata: {rowKey: {z: 123}}, + name: 'far', + schema: 'boo', + }, + }, + ]); + }); + + test('backfill canceled and retried because of column drop', async () => { + testStreams.push( + [ + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + }, + ], + [ + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: [], + }, + ], + ); + await changeStream.reserve('main'); + + // Backfill manager will start the first request and block on the + // 'main' change-stream reservation. + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + }, + ]); + + // In the meantime, a column gets dropped on the main stream. + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'drop-column', + table: {schema: 'foo', name: 'bar'}, + column: 'b', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('125'); + + // The first request is canceled and only the changes from + // the updated request are streamed. + expect(await drainChanges(6)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'drop-column', + table: {schema: 'foo', name: 'bar'}, + column: 'b', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + [ + 'data', + { + tag: 'backfill-completed', + relation: { + schema: 'foo', + name: 'bar', + rowKey: {columns: ['a']}, + }, + columns: [], + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + // Canceled request + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + // Updated request + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}}, + }, + ]); + }); + + test('backfill canceled and retried because of table rename', async () => { + testStreams.push( + [ + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + }, + ], + [ + { + tag: 'backfill-completed', + relation: {schema: 'boo', name: 'far', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + }, + ], + ); + await changeStream.reserve('main'); + + // Backfill manager will start the first request and block on the + // 'main' change-stream reservation. + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + }, + ]); + + // In the meantime, the table gets renamed on the main stream. + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'rename-table', + old: {schema: 'foo', name: 'bar'}, + new: {schema: 'boo', name: 'far'}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('125'); + + // The first request is canceled and only the changes from + // the updated request are streamed. + expect(await drainChanges(6)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'rename-table', + old: {schema: 'foo', name: 'bar'}, + new: {schema: 'boo', name: 'far'}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + [ + 'data', + { + tag: 'backfill-completed', + columns: ['a', 'b'], + relation: { + schema: 'boo', + name: 'far', + rowKey: {columns: ['a']}, + }, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + // Canceled request + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + // Updated request + { + table: { + schema: 'boo', + name: 'far', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + ]); + }); + + test('backfill canceled and retried because of table metadata update', async () => { + testStreams.push( + [ + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + }, + ], + [ + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['b']}}, + columns: ['a', 'b'], + }, + ], + ); + await changeStream.reserve('main'); + + // Backfill manager will start the first request and block on the + // 'main' change-stream reservation. + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + }, + ]); + + // In the meantime, the the row key in table metadata is changed + // on the main stream. + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'update-table-metadata', + table: {schema: 'foo', name: 'bar'}, + old: {rowKey: {a: 123}}, + new: {rowKey: {b: 234}}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('125'); + + // The first request is canceled and only the changes from + // the updated request are streamed. + expect(await drainChanges(6)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'update-table-metadata', + table: {schema: 'foo', name: 'bar'}, + old: {rowKey: {a: 123}}, + new: {rowKey: {b: 234}}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + [ + 'data', + { + tag: 'backfill-completed', + columns: ['a', 'b'], + relation: { + schema: 'foo', + name: 'bar', + rowKey: {columns: ['b']}, + }, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + // Canceled request + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + // Updated request + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {b: 234}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + ]); + }); + + test("backfill canceled and retried because a row's key is updated", async () => { + testStreams.push( + [ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + watermark: '130', + rowValues: [ + [ + [1, 2], + [3, 4], + ], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + }, + ], + [ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + watermark: '150', + rowValues: [ + [ + [5, 6], + [3, 4], + ], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + }, + ], + ); + await changeStream.reserve('main'); + + // Backfill manager will start the first request block on the + // 'main' change-stream reservation. + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + }, + ]); + + // In the meantime, the one of the rows updates its key. + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '140'}], + [ + 'data', + { + tag: 'update', + relation: { + schema: 'foo', + name: 'bar', + rowKey: {columns: ['a']}, + }, + key: {a: 1}, + new: {a: 5}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '140'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('140'); + + // The first request is canceled and only the changes from + // the updated request are streamed. + expect(await drainChanges(7)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '140'}], + [ + 'data', + { + tag: 'update', + relation: { + schema: 'foo', + name: 'bar', + rowKey: {columns: ['a']}, + }, + key: {a: 1}, + new: {a: 5}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '140'}], + ['begin', {tag: 'begin'}, {commitWatermark: '140.01'}], + [ + 'data', + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + watermark: '150', + rowValues: [ + [ + [5, 6], + [3, 4], + ], + ], + }, + ], + [ + 'data', + { + tag: 'backfill-completed', + columns: ['a', 'b'], + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '140.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + // Canceled request + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + // Retry + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + ]); + }); + + test('backfill canceled because of table drop', async () => { + testStreams.push([ + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + }, + ]); + await changeStream.reserve('main'); + + // Backfill manager will start the first request and block on the + // 'main' change-stream reservation. + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + }, + ]); + + // In the meantime, the table gets renamed on the main stream. + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'drop-table', + id: {schema: 'foo', name: 'bar'}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('125'); + + // The backfill request is canceled + expect(await drainChanges(3)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'drop-table', + id: {schema: 'foo', name: 'bar'}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + // Canceled request + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + ]); + }); + + test('column added to backfilling table', async () => { + testStreams.push( + [ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + watermark: '130', + rowValues: [ + [ + [1, 2], + [3, 4], + ], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + }, + ], + [ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['c', 'd'], + watermark: '150', + rowValues: [ + [ + [5, 6], + [3, 4], + ], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['c', 'd'], + }, + ], + ); + await changeStream.reserve('main'); + + // Backfill manager will start the first request block on the + // 'main' change-stream reservation. + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + }, + ]); + + // In the meantime, more columns get added to the table. + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '140'}], + [ + 'data', + { + tag: 'add-column', + table: {schema: 'foo', name: 'bar'}, + column: {name: 'c', spec: {dataType: 'text', pos: 2}}, + tableMetadata: {rowKey: {a: 123}}, + backfill: {id: '777'}, + }, + ], + [ + 'data', + { + tag: 'add-column', + table: {schema: 'foo', name: 'bar'}, + column: {name: 'd', spec: {dataType: 'text', pos: 2}}, + tableMetadata: {rowKey: {a: 123}}, + backfill: {id: '888'}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '140'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('140'); + + expect(await drainChanges(12)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '140'}], + [ + 'data', + { + tag: 'add-column', + table: {schema: 'foo', name: 'bar'}, + column: {name: 'c', spec: {dataType: 'text', pos: 2}}, + tableMetadata: {rowKey: {a: 123}}, + backfill: {id: '777'}, + }, + ], + [ + 'data', + { + tag: 'add-column', + table: {schema: 'foo', name: 'bar'}, + column: {name: 'd', spec: {dataType: 'text', pos: 2}}, + tableMetadata: {rowKey: {a: 123}}, + backfill: {id: '888'}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '140'}], + ['begin', {tag: 'begin'}, {commitWatermark: '140.01'}], + [ + 'data', + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['a', 'b'], + watermark: '130', + rowValues: [ + [ + [1, 2], + [3, 4], + ], + ], + }, + ], + [ + 'data', + { + tag: 'backfill-completed', + columns: ['a', 'b'], + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '140.01'}], + ['begin', {tag: 'begin'}, {commitWatermark: '140.02'}], + [ + 'data', + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['c', 'd'], + watermark: '150', + rowValues: [ + [ + [5, 6], + [3, 4], + ], + ], + }, + ], + [ + 'data', + { + tag: 'backfill-completed', + columns: ['c', 'd'], + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + }, + ], + ['commit', {tag: 'commit'}, {watermark: '140.02'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + // First request + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {a: {id: '123'}, b: {id: '234'}}, + }, + // More columns + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {c: {id: '777'}, d: {id: '888'}}, + }, + ]); + }); + + test('backfill retried on stream error', async () => { + testStreams.push( + new Error('failure 1'), + new Error('failure 2'), + new Error('failure 3'), + [ + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + }, + ], + ); + + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + + expect(await drainChanges(3)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '123.01'}], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + tag: 'backfill-completed', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '123.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + }); + + test('backfill stream yields to other stream reservations', async () => { + testStreams.push([ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [[1, 2]], + }, + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [[2, 3]], + }, + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [[3, 4]], + }, + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [[5, 6]], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + }, + ]); + await changeStream.reserve('main'); + + // Start the backfill with the table already reserved. + void backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + + // Repeatedly reserve and hold the reservation for 2 ms. + void (async function () { + let ver = majorVersionFromString('140'); + for (let i = 0; i < 6; i++, ver++) { + changeStream.release(majorVersionToString(ver)); + await changeStream.reserve('main'); + await sleep(50); + } + })(); + + // Each 'backfill' message is wrapped in a separate transaction because + // the backfill-manager yielded the stream between every message. + expect(await drainChanges(15)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '141.01'}], + [ + 'data', + { + columns: ['b'], + relation: { + name: 'bar', + rowKey: {columns: ['a']}, + schema: 'foo', + }, + rowValues: [[1, 2]], + tag: 'backfill', + watermark: '130', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '141.01'}], + ['begin', {tag: 'begin'}, {commitWatermark: '142.01'}], + [ + 'data', + { + columns: ['b'], + relation: { + name: 'bar', + rowKey: {columns: ['a']}, + schema: 'foo', + }, + rowValues: [[2, 3]], + tag: 'backfill', + watermark: '130', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '142.01'}], + ['begin', {tag: 'begin'}, {commitWatermark: '143.01'}], + [ + 'data', + { + columns: ['b'], + relation: { + name: 'bar', + rowKey: {columns: ['a']}, + schema: 'foo', + }, + rowValues: [[3, 4]], + tag: 'backfill', + watermark: '130', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '143.01'}], + ['begin', {tag: 'begin'}, {commitWatermark: '144.01'}], + [ + 'data', + { + columns: ['b'], + relation: { + name: 'bar', + rowKey: {columns: ['a']}, + schema: 'foo', + }, + rowValues: [[5, 6]], + tag: 'backfill', + watermark: '130', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '144.01'}], + ['begin', {tag: 'begin'}, {commitWatermark: '145.01'}], + [ + 'data', + { + columns: ['b'], + relation: { + name: 'bar', + rowKey: {columns: ['a']}, + schema: 'foo', + }, + tag: 'backfill-completed', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '145.01'}], + ]); + }); +}); diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts new file mode 100644 index 0000000000..346fee66b0 --- /dev/null +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -0,0 +1,472 @@ +import type {LogContext} from '@rocicorp/logger'; +import {assert} from '../../../../../shared/src/asserts.ts'; +import {stringify} from '../../../../../shared/src/bigint-json.ts'; +import {CustomKeyMap} from '../../../../../shared/src/custom-key-map.ts'; +import {must} from '../../../../../shared/src/must.ts'; +import { + majorVersionToString, + stateVersionFromString, + stateVersionToString, + type StateVersion, +} from '../../../types/state-version.ts'; +import type { + BackfillCompleted, + BackfillRequest, + ChangeStreamMessage, + Identifier, + MessageBackfill, +} from '../protocol/current.ts'; +import type { + Cancelable, + ChangeStreamMultiplexer, + Listener, +} from './change-stream-multiplexer.ts'; + +function tableKey({schema, name}: Identifier) { + return `${schema}.${name}`; +} + +type BackfillStreamer = ( + req: BackfillRequest, +) => AsyncGenerator; + +type RunningBackfillState = { + request: BackfillRequest; + canceledReason?: string | undefined; + minMajorVersion: string; +}; + +const MIN_BACKOFF_INTERVAL_MS = 2_000; +const MAX_BACKOFF_INTERVAL_MS = 60_000; + +/** + * The BackfillManager initiates backfills for BackfillRequests from the + * change-streamer (i.e. unfinished backfills from previous sessions) + * or for new backfills signaled by `create-table` or `add-column` messages + * from the change-source. + * + * The BackfillManager registers itself as a change stream listener in order + * to track necessary backfills, and potentially invalidate the in-progress + * backfill (e.g. due to a schema change) so that it can be retried at a + * new snapshot. + * + * The manager also handles low priority streaming of the backfill messages + * using the {@link ChangeStreamMultiplexer}, implementing a policy of always + * releasing its reservation if another producer (i.e. the main change stream) + * has messages to stream. + */ +export class BackfillManager implements Cancelable, Listener { + readonly #lc: LogContext; + + /** + * Tracks the metadata of required backfills based on schema changes + * and initial backfill requests. + */ + readonly #requiredBackfills = new CustomKeyMap( + tableKey, + ); + readonly #changeStreamer: ChangeStreamMultiplexer; + readonly #backfillStreamer: BackfillStreamer; + + /** + * The current running backfill. The backfill request is always also in + * `#requiredBackfills` (technically, it can be a subset of what's in + * `#requiredBackfills`); the request is removed from `#requiredBackfills` + * upon completion. + */ + #runningBackfill: RunningBackfillState | null = null; + + /** The last seen watermark in the change stream. */ + #changeStreamWatermark: StateVersion | null = null; + + constructor( + lc: LogContext, + changeStreamer: ChangeStreamMultiplexer, + backfillStreamer: BackfillStreamer, + minBackoffMs = MIN_BACKOFF_INTERVAL_MS, + maxBackoffMs = MAX_BACKOFF_INTERVAL_MS, + ) { + this.#lc = lc.withContext('component', 'backfill-manager'); + this.#changeStreamer = changeStreamer; + this.#backfillStreamer = backfillStreamer; + this.#minBackoffMs = minBackoffMs; + this.#maxBackoffMs = maxBackoffMs; + this.#retryDelayMs = minBackoffMs; + } + + run(lastWatermark: string, initialRequests: BackfillRequest[]) { + this.#changeStreamWatermark = stateVersionFromString(lastWatermark); + initialRequests.forEach(req => + this.#setRequiredBackfill('initial-request', req), + ); + this.#checkAndStartBackfill(); + } + + readonly #minBackoffMs: number; + readonly #maxBackoffMs: number; + #retryDelayMs: number; + #backfillRetryTimer: NodeJS.Timeout | undefined; + + #checkAndStartBackfill() { + if (!this.#backfillRetryTimer && !this.#runningBackfill) { + // Use the iterator to pick the first request. + for (const first of this.#requiredBackfills.values()) { + const state = {request: first, minMajorVersion: ''}; + const lc = this.#lc.withContext('table', first.table.name); + + this.#runningBackfill = state; + void this.#runBackfill(lc, state) + .then(() => { + this.#stopRunningBackfill('backfill exited', state); + this.#retryDelayMs = this.#minBackoffMs; // reset on success + }) + // For unexpected errors (e.g. upstream replication slot + // unavailability), retry with exponential backoff. + .catch(e => { + this.#stopRunningBackfill(String(e), state); + this.#retryBackfillWithBackoff(e); + }); + return; + } + } + } + + #retryBackfillWithBackoff(e: unknown) { + const log = this.#retryDelayMs === this.#maxBackoffMs ? 'error' : 'warn'; + this.#lc[log]?.( + `Error running backfill. Retrying in ${this.#retryDelayMs} ms`, + e, + ); + this.#backfillRetryTimer = setTimeout(() => { + this.#backfillRetryTimer = undefined; + this.#checkAndStartBackfill(); + }, this.#retryDelayMs); + + this.#retryDelayMs = Math.min(this.#retryDelayMs * 2, this.#maxBackoffMs); + } + + async #runBackfill(lc: LogContext, state: RunningBackfillState) { + const changeStream = this.#changeStreamer; // Purely for readability + + // backfillTx is set if and only if a changeStreamer reservation has been + // acquired and the backfill stream is inside a transaction. + let backfillTx: string | null = null; + + /** + * @returns the new tx watermark, or null if backfill was cancelled + */ + const beginTxFor = async ( + msg: MessageBackfill | BackfillCompleted, + ): Promise => { + assert(backfillTx === null); + const lastWatermark = await changeStream.reserve('backfill'); + + // After obtaining the changeStream reservation, check if the stream + // had changes that resulted in invalidating / canceling this backfill. + if ( + state.canceledReason || + (msg.tag === 'backfill' && msg.watermark < state.minMajorVersion) + ) { + if (state.canceledReason === undefined) { + assert(msg.tag === 'backfill'); // TypeScript should have figured this out. + this.#stopRunningBackfill( + `row key change at ${state.minMajorVersion} ` + + `postdates backfill watermark at ${msg.watermark}`, + state, + ); + } + changeStream.release(lastWatermark); + return null; + } + + const {major, minor = 0n} = stateVersionFromString(lastWatermark); + const tx = stateVersionToString({ + major, + minor: BigInt(minor) + 1n, + }); + + void changeStream.push(['begin', {tag: 'begin'}, {commitWatermark: tx}]); + return (backfillTx = tx); + }; + + const commitTx = () => { + if (backfillTx) { + void changeStream.push([ + 'commit', + {tag: 'commit'}, + {watermark: backfillTx}, + ]); + changeStream.release(backfillTx); + } + backfillTx = null; + }; + + for await (const msg of this.#backfillStreamer(state.request)) { + // If necessary, yield the reservation to the main stream. + backfillTx && changeStream.waiterDelay() > 0 && commitTx(); + + // Reserve the changeStreamer if not in a transaction. + if ((backfillTx ??= await beginTxFor(msg)) === null) { + lc.info?.( + `backfill stream canceled: ${state.canceledReason}`, + state.request, + ); + this.#checkAndStartBackfill(); // start the next backfill if present + return; // this backfill is canceled + } + + // `await` to allow the change streamer to exert back pressure + // on backfills. + await changeStream.push(['data', msg]); + } + + // Flush any final tx and release the stream. + backfillTx && commitTx(); + lc.debug?.(`backfill stream exited`, state.canceledReason ?? ''); + } + + #backfillRunningFor(table: Identifier): RunningBackfillState | null { + const state = this.#runningBackfill; + return state?.request.table.schema === table.schema && + state.request.table.name === table.name + ? state + : null; + } + + /** + * Stops the running backfill for the specified `reason`. If `instance` is + * specified, the running backfill is stopped only if it is that instance. + * This allows the running backfill itself to clear backfill state without + * accidentally stopping a different (e.g. subsequent) backfill. + */ + #stopRunningBackfill(reason?: string, instance?: RunningBackfillState) { + const backfill = this.#runningBackfill; + if (backfill && backfill === (instance ?? backfill)) { + backfill.canceledReason = reason; + this.#runningBackfill = null; + reason && this.#lc.info?.(`canceling backfill:`, reason); + } + } + + #setRequiredBackfill(source: string, req: BackfillRequest) { + const exists = this.#requiredBackfills.has(req.table); + this.#lc.info?.(`Backfill ${exists ? 'updated' : 'added'} by ${source}`, { + backfill: req, + }); + this.#requiredBackfills.set(req.table, req); + } + + #deleteRequiredBackfill(source: string, id: Identifier) { + const req = this.#requiredBackfills.get(id); + if (req) { + this.#lc.info?.(`Backfill dropped by ${source}`, {backfill: req}); + this.#requiredBackfills.delete(id); + } + } + + /** + * Implements {@link Listener.onChange()}, invoked by the + * {@link ChangeStreamMultiplexer}. + */ + onChange(message: ChangeStreamMessage): void { + if (message[0] === 'begin') { + this.#changeStreamWatermark = stateVersionFromString( + message[2].commitWatermark, + ); + return; + } + if (message[0] === 'commit') { + // Every commit is a candidate for starting the next backfill + // (if one is not currently running). + this.#checkAndStartBackfill(); + return; + } + if (message[0] !== 'data') { + return; + } + const change = message[1]; + const {tag} = change; + switch (tag) { + case 'update-table-metadata': { + const {table, new: metadata} = change; + const backfillRequest = this.#requiredBackfills.get(table); + if (backfillRequest) { + this.#setRequiredBackfill(tag, { + ...backfillRequest, + table: {...backfillRequest.table, metadata}, + }); + if (this.#backfillRunningFor(table)) { + this.#stopRunningBackfill(`TableMetadata updated`); + } + } + break; + } + case 'create-table': { + const { + spec: {schema, name}, + metadata = null, + backfill, + } = change; + + if (backfill) { + this.#setRequiredBackfill(tag, { + table: {schema, name, metadata}, + columns: backfill, + }); + } + break; + } + case 'rename-table': { + const {old, new: newTable} = change; + const backfillRequest = this.#requiredBackfills.get(old); + if (backfillRequest) { + const {schema, name} = newTable; + this.#deleteRequiredBackfill(tag, old); + this.#setRequiredBackfill(tag, { + ...backfillRequest, + table: {...backfillRequest.table, schema, name}, + }); + if (this.#backfillRunningFor(old)) { + this.#stopRunningBackfill(`table renamed`); + } + } + break; + } + case 'drop-table': { + const {id} = change; + const backfillRequest = this.#requiredBackfills.get(id); + if (backfillRequest) { + this.#deleteRequiredBackfill(tag, id); + if (this.#backfillRunningFor(id)) { + this.#stopRunningBackfill(`table dropped`); + } + } + break; + } + case 'add-column': { + const { + table, + tableMetadata: metadata = null, + column, + backfill, + } = change; + if (backfill) { + const backfillRequest = this.#requiredBackfills.get(table); + if (!backfillRequest) { + this.#setRequiredBackfill(tag, { + table: {...table, metadata}, + columns: {[column.name]: backfill}, + }); + } else { + this.#setRequiredBackfill(tag, { + ...backfillRequest, + table: {...backfillRequest.table, metadata}, + columns: { + ...backfillRequest.columns, + [column.name]: backfill, + }, + }); + // Note: The running backfill need not be canceled if a + // new column is added. The new column will be backfilled + // by its own stream after the current backfill completes. + } + } + break; + } + case 'update-column': { + const { + table, + old: {name: oldName}, + new: {name: newName}, + } = change; + if (oldName !== newName) { + const backfillRequest = this.#requiredBackfills.get(table); + if (backfillRequest && oldName in backfillRequest.columns) { + const {[oldName]: colSpec, ...otherCols} = backfillRequest.columns; + this.#setRequiredBackfill(tag, { + ...backfillRequest, + columns: {...otherCols, [newName]: colSpec}, + }); + const backfill = this.#backfillRunningFor(table); + if (backfill && oldName in backfill.request.columns) { + this.#stopRunningBackfill(`column renamed`); + } + } + } + break; + } + case 'drop-column': { + const {table, column} = change; + const backfillRequest = this.#requiredBackfills.get(table); + if (backfillRequest && column in backfillRequest.columns) { + const {[column]: _excluded, ...remaining} = backfillRequest.columns; + this.#setRequiredBackfill(tag, { + ...backfillRequest, + columns: remaining, + }); + const backfill = this.#backfillRunningFor(table); + if (backfill && column in backfill.request.columns) { + this.#stopRunningBackfill(`column dropped`); + } + } + break; + } + case 'update': { + const {relation, key, new: row} = change; + const backfill = this.#backfillRunningFor(relation); + const {major} = must(this.#changeStreamWatermark, `not in a tx`); + if (backfill?.request.table.metadata && key !== null) { + // A corner case that backfill is unable to correctly handle is + // when a row's key changes; this is decomposed into a delete + // of the old key and a set of the new key in the replica change + // log, at which point the backfill algorithm assumes that the + // (old) row is deleted but does not know to backfill the new row. + // In these corner cases, the current backfill is canceled and + // retried if its version precedes this update. + for (const col of Object.keys( + backfill.request.table.metadata.rowKey, + )) { + if (key[col] !== row[col]) { + backfill.minMajorVersion = majorVersionToString(major); + this.#lc.info?.( + `key for row as changed (col: ${col}). ` + + `backfill data must not predate ${backfill.minMajorVersion}`, + ); + break; + } + } + } + break; + } + case 'backfill-completed': { + const {relation, columns} = change; + const backfillRequest = this.#requiredBackfills.get(relation); + assert( + backfillRequest, + () => `No BackfillRequest completed backfill ${stringify(change)}`, + ); + const remaining = Object.entries(backfillRequest.columns).filter( + ([col]) => + !(columns.includes(col) || relation.rowKey.columns.includes(col)), + ); + if (remaining.length === 0) { + this.#deleteRequiredBackfill(tag, relation); + } else { + this.#setRequiredBackfill(tag, { + ...backfillRequest, + columns: Object.fromEntries(remaining), + }); + } + // Technically the backfill is already stopping, but this method + // cleans up the state that tracks it. + this.#stopRunningBackfill(); + break; + } + } + } + + cancel(): void { + this.#stopRunningBackfill(`change stream canceled`); + clearTimeout(this.#backfillRetryTimer); + } +} diff --git a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts index ddc2e9e7c5..cde2fa69f6 100644 --- a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts +++ b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts @@ -26,12 +26,9 @@ describe('change-stream-multiplexer', () => { listenFn1 = vi.fn(); listenFn2 = vi.fn(); - stream = new ChangeStreamMultiplexer( - createSilentLogContext(), - '123', - [{cancel: cancelFn1}, {cancel: cancelFn2}], - [{onChange: listenFn1}, {onChange: listenFn2}], - ); + stream = new ChangeStreamMultiplexer(createSilentLogContext(), '123') + .addProducers({cancel: cancelFn1}, {cancel: cancelFn2}) + .addListeners({onChange: listenFn1}, {onChange: listenFn2}); }); test('reservations', async () => { diff --git a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts index 9d45599f75..a6a806e618 100644 --- a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts +++ b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts @@ -5,11 +5,11 @@ import type {Source} from '../../../types/streams.ts'; import {Subscription} from '../../../types/subscription.ts'; import type {ChangeStreamMessage, StatusMessage} from '../protocol/current.ts'; -type Cancelable = { +export type Cancelable = { cancel(): void; }; -type Listener = { +export type Listener = { onChange(change: ChangeStreamMessage): void; }; @@ -26,7 +26,8 @@ type Waiter = { export class ChangeStreamMultiplexer { readonly #lc: LogContext; readonly #sub: Subscription; - readonly #listeners: Listener[]; + readonly #producers: Cancelable[] = []; + readonly #listeners: Listener[] = []; /** * The `#lastWatermark` tracks the watermark of the last transaction @@ -41,20 +42,24 @@ export class ChangeStreamMultiplexer { */ readonly #waiters: Waiter[] = []; - constructor( - lc: LogContext, - lastWatermark: string, - producers: Cancelable[], - listeners: Listener[], - ) { + constructor(lc: LogContext, lastWatermark: string) { this.#lc = lc; this.#sub = Subscription.create({ - cleanup: () => producers.forEach(p => p.cancel()), + cleanup: () => this.#producers.forEach(p => p.cancel()), }); - this.#listeners = listeners; this.#lastWatermark = lastWatermark; } + addProducers(...p: Cancelable[]): this { + this.#producers.push(...p); + return this; + } + + addListeners(...l: Listener[]): this { + this.#listeners.push(...l); + return this; + } + /** * Called by a producer to "reserve" the exclusive right to push data * changes to the stream. If the stream is currently reserved, diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index b513941a8d..892d00a463 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -38,6 +38,7 @@ import { type SubscriptionState, } from '../../replicator/schema/replication-state.ts'; import type {ChangeSource, ChangeStream} from '../change-source.ts'; +import {BackfillManager} from '../common/backfill-manager.ts'; import {ChangeStreamMultiplexer} from '../common/change-stream-multiplexer.ts'; import type {BackfillRequest, JSONObject} from '../protocol/current.ts'; import type { @@ -51,6 +52,7 @@ import type { Data, } from '../protocol/current/downstream.ts'; import type {TableMetadata} from './backfill-metadata.ts'; +import {streamBackfill} from './backfill-stream.ts'; import {type InitialSyncOptions} from './initial-sync.ts'; import type { Message, @@ -232,9 +234,6 @@ class PostgresChangeSource implements ChangeSource { clientWatermark: string, backfillRequests: BackfillRequest[] = [], ): Promise { - if (backfillRequests.length) { - throw new Error('not implemented yet'); - } const db = pgClient(this.#lc, this.#upstreamUri); const {slot} = this.#replica; @@ -246,7 +245,13 @@ class PostgresChangeSource implements ChangeSource { )); const config = await getInternalShardConfig(db, this.#shard); this.#lc.info?.(`starting replication stream@${slot}`); - return await this.#startStream(db, slot, clientWatermark, config); + return await this.#startStream( + db, + slot, + clientWatermark, + config, + backfillRequests, + ); } finally { void cleanup.then(() => db.end()); } @@ -257,6 +262,7 @@ class PostgresChangeSource implements ChangeSource { slot: string, clientWatermark: string, shardConfig: InternalShardConfig, + backfillRequests: BackfillRequest[], ): Promise { const clientStart = majorVersionFromString(clientWatermark) + 1n; const {messages, acks} = await subscribe( @@ -267,15 +273,18 @@ class PostgresChangeSource implements ChangeSource { clientStart, ); - // At the moment the replication stream is the only producer of changes, - // so the ChangeStreamMultiplexer is largely a no-op, but these is where - // backfill streams will enter the picture. - const changes = new ChangeStreamMultiplexer( - this.#lc, - clientWatermark, - [messages], - [], + // The ChangeStreamMultiplexer facilitates cooperative streaming from + // the main replication stream and backfill streams initiated by the + // BackfillManager. + const changes = new ChangeStreamMultiplexer(this.#lc, clientWatermark); + const backfillManager = new BackfillManager(this.#lc, changes, req => + streamBackfill(this.#lc, this.#upstreamUri, this.#replica, req), ); + changes + .addProducers(messages, backfillManager) + .addListeners(backfillManager); + backfillManager.run(clientWatermark, backfillRequests); + const acker = new Acker(acks); const changeMaker = new ChangeMaker( From d4beda4e0ac26c160aa6520d6397104decabd069 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Thu, 12 Feb 2026 00:15:57 -1000 Subject: [PATCH 047/495] fix(zero-cache): filter NULL values from unique key lookups in getRows (#5542) SQLite's MULTI-INDEX OR optimization completely fails when any branch of an OR query involves NULL values, falling back to a full table scan. This was causing slowdowns of hundreds of times on tables with nullable unique columns. The fix filters out unique keys where any column is NULL before building the OR query. This is both correct (NULL values can't violate uniqueness since NULL != NULL in SQL) and critical for performance. --- .../services/view-syncer/snapshotter.test.ts | 44 ++++++++++++++++++- .../src/services/view-syncer/snapshotter.ts | 16 ++++++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts index 6c4eacc756..348a9c2799 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts @@ -1,5 +1,5 @@ import type {LogContext} from '@rocicorp/logger'; -import {afterEach, beforeEach, describe, expect, test} from 'vitest'; +import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import {computeZqlSpecs, listTables} from '../../db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../../db/specs.ts'; @@ -592,4 +592,46 @@ describe('view-syncer/snapshotter', () => { expect(() => [...diff]).toThrow(ResetPipelinesSignal); }); + + test('getRows filters out unique keys with NULL column values', () => { + // This tests a critical performance optimization: when unique key columns + // have NULL values, they must be filtered out of the OR query. Otherwise, + // SQLite's MULTI-INDEX OR optimization fails and falls back to a full + // table scan (hundreds of times slower on large tables). + + // Insert a user with a NULL handle + replicator.processTransaction( + '05', + messages.insert('users', {id: 30, handle: null}), + ); + + const diff = s.advance(tableSpecs); + expect(diff.curr.version).toBe('05'); + + // Spy on the statement cache to see what queries are generated + const getSpy = vi.spyOn(diff.prev.db.statementCache, 'get'); + + // Consume the diff - this will call getRows for the user with NULL handle + const changes = [...diff]; + expect(changes).toHaveLength(1); + + // Find the getRows query (SELECT from users with WHERE clause) + const getRowsCalls = getSpy.mock.calls.filter( + call => + typeof call[0] === 'string' && + call[0].includes('FROM "users"') && + call[0].includes('WHERE'), + ); + + // Should have made exactly one query for the users table + expect(getRowsCalls).toHaveLength(1); + + // Snapshot the entire query - it should only have "id"=? in WHERE, + // not "handle"=? since handle is NULL + expect(getRowsCalls[0][0]).toBe( + 'SELECT "id","handle","_0_version" FROM "users" WHERE "id"=?', + ); + + getSpy.mockRestore(); + }); }); diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.ts index 4c6f34c32b..92b1e88556 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.ts @@ -341,7 +341,19 @@ class Snapshot { } getRows(table: LiteTableSpecWithKeys, keys: PrimaryKey[], row: RowValue) { - const conds = keys.map(key => key.map(c => `${id(c)}=?`)); + // Filter out keys where any column is NULL. This is both correct and + // critical for performance: + // 1. Correctness: NULL values can't violate uniqueness (NULL != NULL in SQL) + // 2. Performance: SQLite's MULTI-INDEX OR optimization completely fails when + // any branch involves NULL, falling back to a full table scan. This was + // causing slowdowns of hundreds of times on tables with nullable unique columns. + const validKeys = keys.filter(key => + key.every(column => row[column] !== null && row[column] !== undefined), + ); + if (validKeys.length === 0) { + return []; + } + const conds = validKeys.map(key => key.map(c => `${id(c)}=?`)); const cols = Object.keys(table.columns); const cached = this.db.statementCache.get( `SELECT ${cols.map(c => id(c)).join(',')} FROM ${id( @@ -352,7 +364,7 @@ class Snapshot { try { // oxlint-disable-next-line @typescript-eslint/no-explicit-any return cached.statement.all( - keys.flatMap(key => key.map(column => row[column])), + validKeys.flatMap(key => key.map(column => row[column])), ); } finally { this.db.statementCache.return(cached); From 0ca2123fabd62caf97054ea85c6d5bd74e644c27 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 12 Feb 2026 09:39:15 -0800 Subject: [PATCH 048/495] chore(zero-cache): fix backfill replication logic for row-key-only tables (#5544) --- .../replicator/change-processor.test.ts | 86 +++++++++++++++++++ .../services/replicator/change-processor.ts | 4 +- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index 673310001f..efebbb4410 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -3363,6 +3363,92 @@ describe('replicator/change-processor', () => { }, expectedTablesInBackupReplicatorChangeLog: ['bff'], }, + { + name: 'table backfill of row keys only', + setup: ``, + downstream: [ + // Create a table that needs backfilling. + ['begin', bff.begin(), {commitWatermark: '0e'}], + [ + 'data', + bff.createTable( + { + schema: 'public', + name: 'bff', + primaryKey: ['id'], + columns: { + id: {dataType: 'int', pos: 0}, + }, + }, + { + metadata: {rowKey: {columns: ['id']}}, + backfill: { + id: {id: 1}, + }, + }, + ), + ], + [ + 'data', + bff.createIndex({ + name: 'bff_pkey', + schema: 'public', + tableName: 'bff', + unique: true, + columns: { + id: 'ASC', + }, + }), + ], + ['commit', bff.commit(), {watermark: '0e'}], + + ['begin', bff.begin(), {commitWatermark: '123.01'}], + [ + 'data', + { + tag: 'backfill', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['id']}, + }, + watermark: '115', + columns: [], + rowValues: [[2], [83]], + }, + ], + [ + 'data', + { + tag: 'backfill-completed', + relation: { + schema: 'public', + name: 'bff', + rowKey: {columns: ['b', 'a', 'c']}, + }, + columns: ['d', 'e'], + }, + ], + ['commit', fooBarBaz.commit(), {watermark: '123.01'}], + ], + data: { + bff: [ + {id: 2n, _0_version: '123.01'}, + {id: 83n, _0_version: '123.01'}, + ], + ['_zero.changeLog2']: [ + { + backfillingColumnVersions: '{}', + op: 'r', + pos: -1n, + rowKey: '123.01', + stateVersion: '123.01', + table: 'bff', + }, + ], + }, + expectedTablesInBackupReplicatorChangeLog: ['bff'], + }, ]; for (const c of cases) { diff --git a/packages/zero-cache/src/services/replicator/change-processor.ts b/packages/zero-cache/src/services/replicator/change-processor.ts index 438ea5314a..60b84608be 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.ts @@ -821,10 +821,10 @@ class TransactionProcessor { } const updates = rowOp?.op === SET_OP - ? columns.filter( + ? cols.filter( c => (rowOp.backfillingColumnVersions[c] ?? '') <= watermark, ) - : columns; + : cols; if (updates.length === 0) { // row already has newer values for all backfilling columns. skipped++; From d33599a65f0f47a41d49781467d78c3a2866e131 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Thu, 12 Feb 2026 10:20:45 -0700 Subject: [PATCH 049/495] feat(zero-cache): add `updateAuth` (#5530) We added push auth here: https://github.com/rocicorp/mono/pull/5503 Reworks auth to be shared across a client group, with `updateAuth` upstream message instead of in the push body: - Add a new `updateAuth` sync message so auth can be refreshed on an active connection instead of forcing reconnects. - Update zero-client auth flow to send `updateAuth` on connection.connect({auth}), while still carrying auth in handshake when reconnecting from needs-auth. - Refactor zero-cache auth handling around a client-group `AuthSession` with revision tracking, user binding, and token-type consistency checks. - Re-transform custom queries when auth revision changes. - Route auth consistently through query and mutation paths, clearing auth state on 401/403 failures. Related: https://discord.com/channels/830183651022471199/1354016574486483025/1469271494180737057 --- packages/analyze-query/src/bin-transform.ts | 6 +- packages/analyze-query/src/run-ast.ts | 4 +- packages/zero-cache/src/auth/auth.test.ts | 225 ++++++++++++++ packages/zero-cache/src/auth/auth.ts | 280 ++++++++++++++++++ .../src/auth/read-authorizer.query.test.ts | 8 +- .../src/auth/read-authorizer.test.ts | 14 +- .../zero-cache/src/auth/read-authorizer.ts | 10 +- packages/zero-cache/src/server/syncer.ts | 10 + packages/zero-cache/src/services/analyze.ts | 7 +- .../src/services/mutagen/pusher.test.ts | 100 +++++++ .../zero-cache/src/services/mutagen/pusher.ts | 24 +- packages/zero-cache/src/services/run-ast.ts | 14 +- .../services/view-syncer/inspect-handler.ts | 8 +- .../view-syncer-inspect.pg.test.ts | 46 +-- .../view-syncer-permissions.pg.test.ts | 52 +++- .../view-syncer-pick-token.pg.test.ts | 196 ------------ .../view-syncer/view-syncer-test-util.ts | 5 + .../view-syncer/view-syncer-ttl.pg.test.ts | 2 +- .../view-syncer/view-syncer.pg.test.ts | 260 +++++++++++++++- .../src/services/view-syncer/view-syncer.ts | 190 +++++++----- ...iew-syncer.yield-during-advance.pg.test.ts | 2 +- ...iew-syncer.yield-during-hydrate.pg.test.ts | 2 +- .../workers/syncer-ws-message-handler.test.ts | 258 ++++++++++++---- .../src/workers/syncer-ws-message-handler.ts | 45 +-- .../zero-cache/src/workers/syncer.test.ts | 205 ++++++++++--- packages/zero-cache/src/workers/syncer.ts | 93 +++--- packages/zero-client/src/client/options.ts | 9 +- .../src/client/protocol-version-url.test.ts | 2 +- .../zero-client/src/client/zero.auth.test.ts | 117 ++++++++ packages/zero-client/src/client/zero.test.ts | 3 - packages/zero-client/src/client/zero.ts | 6 +- packages/zero-protocol/src/ast.test.ts | 2 +- packages/zero-protocol/src/mod.ts | 1 + .../src/protocol-version.test.ts | 4 +- .../zero-protocol/src/protocol-version.ts | 3 +- packages/zero-protocol/src/push.ts | 6 +- packages/zero-protocol/src/up.ts | 2 + packages/zero-protocol/src/update-auth.ts | 13 + 38 files changed, 1712 insertions(+), 522 deletions(-) create mode 100644 packages/zero-cache/src/auth/auth.test.ts create mode 100644 packages/zero-cache/src/auth/auth.ts delete mode 100644 packages/zero-cache/src/services/view-syncer/view-syncer-pick-token.pg.test.ts create mode 100644 packages/zero-client/src/client/zero.auth.test.ts create mode 100644 packages/zero-protocol/src/update-auth.ts diff --git a/packages/analyze-query/src/bin-transform.ts b/packages/analyze-query/src/bin-transform.ts index 4a6778f761..8971317b56 100644 --- a/packages/analyze-query/src/bin-transform.ts +++ b/packages/analyze-query/src/bin-transform.ts @@ -47,7 +47,11 @@ const queryAst = transformAndHashQuery( '', rows[0].clientAST, permissions, - {}, + { + type: 'jwt', + raw: '', + decoded: {}, + }, rows[0].internal, ).transformedAst; diff --git a/packages/analyze-query/src/run-ast.ts b/packages/analyze-query/src/run-ast.ts index 0f7f0893c9..157e360b06 100644 --- a/packages/analyze-query/src/run-ast.ts +++ b/packages/analyze-query/src/run-ast.ts @@ -3,6 +3,7 @@ import {astToZQL} from '../../ast-to-zql/src/ast-to-zql.ts'; import {formatOutput} from '../../ast-to-zql/src/format.ts'; import {assert} from '../../shared/src/asserts.ts'; import {must} from '../../shared/src/must.ts'; +import type {JWTAuth} from '../../zero-cache/src/auth/auth.ts'; import {transformAndHashQuery} from '../../zero-cache/src/auth/read-authorizer.ts'; import type {LiteAndZqlSpec} from '../../zero-cache/src/db/specs.ts'; import {hydrate} from '../../zero-cache/src/services/view-syncer/pipeline-driver.ts'; @@ -67,6 +68,7 @@ export async function runAst( 'No auth data provided. Permission rules will compare to `NULL` wherever an auth data field is referenced.', ); } + const auth: JWTAuth = {type: 'jwt', raw: '', decoded: authData}; ast = transformAndHashQuery( lc, 'clientGroupIDForAnalyze', @@ -75,7 +77,7 @@ export async function runAst( permissions, 'Permissions are required when applyPermissions is true', ), - authData, + auth, false, ).transformedAst; result.afterPermissions = await formatOutput(ast.table + astToZQL(ast)); diff --git a/packages/zero-cache/src/auth/auth.test.ts b/packages/zero-cache/src/auth/auth.test.ts new file mode 100644 index 0000000000..be450d4eb7 --- /dev/null +++ b/packages/zero-cache/src/auth/auth.test.ts @@ -0,0 +1,225 @@ +import {assert, describe, expect, test} from 'vitest'; +import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; +import {ErrorKind} from '../../../zero-protocol/src/error-kind.ts'; +import {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts'; +import {ProtocolError} from '../../../zero-protocol/src/error.ts'; +import {AuthSessionImpl, pickToken, type ValidateLegacyJWT} from './auth.ts'; + +describe('pickToken', () => { + const lc = createSilentLogContext(); + + test('previous token is undefined', () => { + expect( + pickToken(lc, undefined, { + type: 'jwt', + decoded: {sub: 'foo', iat: 1}, + raw: '', + }), + ).toEqual({ + decoded: { + sub: 'foo', + iat: 1, + }, + raw: '', + type: 'jwt', + }); + }); + + test('opaque tokens when previous undefined', () => { + expect(pickToken(lc, undefined, {type: 'opaque', raw: 'opaque-1'})).toEqual( + {type: 'opaque', raw: 'opaque-1'}, + ); + }); + + test('opaque tokens allow replacement', () => { + expect( + pickToken( + lc, + {type: 'opaque', raw: 'opaque-1'}, + {type: 'opaque', raw: 'opaque-2'}, + ), + ).toEqual({type: 'opaque', raw: 'opaque-2'}); + }); + + test('opaque token cannot replace jwt token', () => { + expect(() => + pickToken( + lc, + {type: 'jwt', decoded: {sub: 'foo', iat: 1}, raw: ''}, + {type: 'opaque', raw: 'opaque-1'}, + ), + ).toThrowError(ProtocolError); + }); + + test('jwt token cannot replace opaque token', () => { + expect(() => + pickToken( + lc, + {type: 'opaque', raw: 'opaque-1'}, + {type: 'jwt', decoded: {sub: 'foo', iat: 1}, raw: ''}, + ), + ).toThrowError(ProtocolError); + }); + + test('previous token exists, new token is undefined', () => { + expect(() => + pickToken( + lc, + {type: 'jwt', decoded: {sub: 'foo', iat: 1}, raw: ''}, + undefined, + ), + ).toThrowError(ProtocolError); + }); +}); + +describe('AuthSession', () => { + const lc = createSilentLogContext(); + + test('binds first userID and rejects mismatched userID', async () => { + const authSession = new AuthSessionImpl(lc, 'cg1', undefined); + expect(await authSession.update('u1', 't1')).toEqual({ok: true}); + + const mismatch = await authSession.update('u2', 't2'); + assert(!mismatch.ok); + expect(mismatch.error.kind).toBe(ErrorKind.Unauthorized); + }); + + test('same opaque token does not change revision', async () => { + const authSession = new AuthSessionImpl(lc, 'cg1', undefined); + expect(authSession.revision).toBe(0); + expect(await authSession.update('u1', 't1')).toEqual({ok: true}); + expect(authSession.revision).toBe(1); + expect(authSession.auth?.raw).toBe('t1'); + + expect(await authSession.update('u1', 't1')).toEqual({ok: true}); + expect(authSession.revision).toBe(1); + }); + + test('rejects missing auth if client group is authenticated', async () => { + const authSession = new AuthSessionImpl(lc, 'cg1', undefined); + expect(await authSession.update('u1', 't1')).toEqual({ok: true}); + const result = await authSession.update('u1', ''); + assert(!result.ok); + expect(result.error.kind).toBe(ErrorKind.Unauthorized); + expect(result.error.message).toContain('No token provided'); + }); + + test('treats empty token as missing auth when unauthenticated', async () => { + const authSession = new AuthSessionImpl(lc, 'cg1', undefined); + expect(await authSession.update('u1', '')).toEqual({ok: true}); + expect(authSession.auth?.raw).toBe(undefined); + expect(authSession.revision).toBe(0); + }); + + test('opaque updates revise only on material changes', async () => { + const authSession = new AuthSessionImpl(lc, 'cg1', undefined); + + expect(await authSession.update('u1', 't1')).toEqual({ok: true}); + expect(authSession.auth?.raw).toBe('t1'); + expect(authSession.revision).toBe(1); + + expect(await authSession.update('u1', 't1')).toEqual({ok: true}); + expect(authSession.revision).toBe(1); + + expect(await authSession.update('u1', 't2')).toEqual({ok: true}); + expect(authSession.auth?.raw).toBe('t2'); + expect(authSession.revision).toBe(2); + + expect(await authSession.update('u1', '')).toEqual({ + ok: false, + error: { + kind: ErrorKind.Unauthorized, + message: + 'No token provided. An unauthenticated client cannot connect to an authenticated client group.', + origin: ErrorOrigin.ZeroCache, + }, + }); + expect(authSession.auth?.raw).toBe('t2'); + expect(authSession.revision).toBe(2); + + expect(await authSession.update('u1', 't3')).toEqual({ok: true}); + expect(authSession.auth?.raw).toBe('t3'); + expect(authSession.revision).toBe(3); + }); + + test('legacy validator receives bound userID and updates JWT auth', async () => { + const validateLegacyJWT: ValidateLegacyJWT = (token, ctx) => + Promise.resolve({ + type: 'jwt', + raw: token, + decoded: {sub: ctx.userID, iat: 1}, + }); + const authSession = new AuthSessionImpl(lc, 'cg1', validateLegacyJWT); + + expect(await authSession.update('u1', 'jwt-1')).toEqual({ok: true}); + expect(authSession.auth).toEqual({ + type: 'jwt', + raw: 'jwt-1', + decoded: {sub: 'u1', iat: 1}, + }); + }); + + test('legacy validator failure maps to AuthInvalidated', async () => { + const validateLegacyJWT: ValidateLegacyJWT = () => + Promise.reject(new Error('bad token')); + const authSession = new AuthSessionImpl(lc, 'cg1', validateLegacyJWT); + + const result = await authSession.update('u1', 'jwt-1'); + assert(!result.ok); + expect(result.error.kind).toBe(ErrorKind.AuthInvalidated); + expect(result.error.origin).toBe(ErrorOrigin.ZeroCache); + }); + + test('protocol errors from validator are preserved', async () => { + const validateLegacyJWT: ValidateLegacyJWT = () => + Promise.reject( + new ProtocolError({ + kind: ErrorKind.Unauthorized, + message: 'nope', + origin: ErrorOrigin.ZeroCache, + }), + ); + const authSession = new AuthSessionImpl(lc, 'cg1', validateLegacyJWT); + + const result = await authSession.update('u1', 'jwt-1'); + assert(!result.ok); + expect(result.error.kind).toBe(ErrorKind.Unauthorized); + expect(result.error.message).toBe('nope'); + }); + + test('failed first validation does not bind userID', async () => { + const validateLegacyJWT: ValidateLegacyJWT = (token, ctx) => { + if (token === 'bad-token') { + return Promise.reject(new Error('bad token')); + } + return Promise.resolve({ + type: 'jwt', + raw: token, + decoded: {sub: ctx.userID, iat: 1}, + }); + }; + const authSession = new AuthSessionImpl(lc, 'cg1', validateLegacyJWT); + + const failed = await authSession.update('alice', 'bad-token'); + assert(!failed.ok); + expect(failed.error.kind).toBe(ErrorKind.AuthInvalidated); + + expect(await authSession.update('bob', 'good-token')).toEqual({ok: true}); + expect(authSession.auth).toEqual({ + type: 'jwt', + raw: 'good-token', + decoded: {sub: 'bob', iat: 1}, + }); + }); + + test('clear() resets auth state', async () => { + const authSession = new AuthSessionImpl(lc, 'cg1', undefined); + expect(await authSession.update('u1', 't1')).toEqual({ok: true}); + expect(authSession.auth?.raw).toBe('t1'); + expect(authSession.revision).toBe(1); + + authSession.clear(); + expect(authSession.auth?.raw).toBe(undefined); + expect(authSession.revision).toBe(0); + }); +}); diff --git a/packages/zero-cache/src/auth/auth.ts b/packages/zero-cache/src/auth/auth.ts new file mode 100644 index 0000000000..af21d55434 --- /dev/null +++ b/packages/zero-cache/src/auth/auth.ts @@ -0,0 +1,280 @@ +import type {LogContext} from '@rocicorp/logger'; +import type {JWTPayload} from 'jose'; +import {ErrorKind} from '../../../zero-protocol/src/error-kind.ts'; +import {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts'; +import { + isProtocolError, + ProtocolError, + type ErrorBody, +} from '../../../zero-protocol/src/error.ts'; + +/** @deprecated JWT auth is deprecated */ +export type JWTAuth = { + readonly type: 'jwt'; + readonly raw: string; + readonly decoded: JWTPayload; +}; + +export type OpaqueAuth = { + readonly type: 'opaque'; + readonly raw: string; +}; + +export type Auth = OpaqueAuth | JWTAuth; + +export interface AuthSession { + /** Update the auth session with a new userID and token from the client */ + update( + userID: string, + wireAuth: string | undefined, + ): Promise; + + /** The revision of the auth state */ + get revision(): number; + + /** The auth state for the session */ + get auth(): Auth | undefined; + + /** Clear the auth session, removing any stored auth and allowing a new userID to be bound on the next update. */ + clear(): void; +} + +export type AuthUpdateResult = + | { + readonly ok: true; + } + | { + readonly ok: false; + readonly error: ErrorBody; + }; + +export type ValidateLegacyJWT = ( + token: string, + ctx: {readonly userID: string}, +) => Promise; + +function isProvidedAuth(wireAuth: string | undefined): wireAuth is string { + return wireAuth !== undefined && wireAuth !== ''; +} + +function authEquals(a: Auth | null | undefined, b: Auth | null | undefined) { + if (a === b) { + return true; + } + if (!a || !b) { + return false; + } + return a.type === b.type && a.raw === b.raw; +} + +export class AuthSessionImpl implements AuthSession { + readonly id: string; + readonly #lc: LogContext; + readonly #validateLegacyJWT: ValidateLegacyJWT | undefined; + #auth: Auth | undefined = undefined; + #boundUserID: string | undefined; + #revision = 0; + + constructor( + lc: LogContext, + clientGroupID: string, + validateLegacyJWT: ValidateLegacyJWT | undefined, + ) { + this.id = clientGroupID; + this.#lc = lc; + this.#validateLegacyJWT = validateLegacyJWT; + } + + get auth(): Auth | undefined { + return this.#auth; + } + + get revision(): number { + return this.#revision; + } + + clear(): void { + const lc = this.#lc.withContext( + 'boundUserID', + this.#boundUserID ?? 'unknown', + ); + lc.debug?.(`Clearing auth session`); + this.#auth = undefined; + this.#boundUserID = undefined; + this.#revision = 0; + } + + async update( + userID: string, + wireAuth: string | undefined, + ): Promise { + try { + const lc = this.#lc.withContext('newUserID', userID); + + // check if the auth update is trying to change the bound userID for this client group + if (this.#boundUserID && this.#boundUserID !== userID) { + return { + ok: false, + error: { + kind: ErrorKind.Unauthorized, + message: + 'Client groups are pinned to a single user. Connection userID does not match existing client group userID.', + origin: ErrorOrigin.ZeroCache, + }, + }; + } + + const previousAuth = this.#auth; + const hasProvidedAuth = isProvidedAuth(wireAuth); + let nextAuth = previousAuth; + + if (previousAuth) { + lc.debug?.(`Attempting to update auth from previous value`); + } else { + lc.debug?.(`Attempting to initialize auth`); + } + + if (!hasProvidedAuth && previousAuth) { + return { + ok: false, + error: { + kind: ErrorKind.Unauthorized, + message: + 'No token provided. An unauthenticated client cannot connect to an authenticated client group.', + origin: ErrorOrigin.ZeroCache, + }, + }; + } + + if (!hasProvidedAuth) { + nextAuth = undefined; + lc.debug?.(`Cleared auth`); + } else if (this.#validateLegacyJWT !== undefined) { + const verifiedToken = await this.#validateLegacyJWT(wireAuth, {userID}); + nextAuth = pickToken(this.#lc, this.#auth, verifiedToken); + lc.debug?.(`Updated auth with JWT`); + } else { + if (this.#auth?.type === 'jwt') { + throw new Error( + 'Cannot change auth type from legacy to opaque token', + ); + } + nextAuth = { + type: 'opaque', + raw: wireAuth, + }; + lc.debug?.(`Updated auth with opaque token`); + } + + this.#auth = nextAuth; + this.#boundUserID ??= userID; + + if (!authEquals(previousAuth, nextAuth)) { + this.#revision++; + } + } catch (e) { + if (isProtocolError(e)) { + return { + ok: false, + error: e.errorBody, + }; + } + return { + ok: false, + error: { + kind: ErrorKind.AuthInvalidated, + message: `Failed to decode auth token: ${String(e)}`, + origin: ErrorOrigin.ZeroCache, + }, + }; + } + + return {ok: true}; + } +} + +/** @deprecated used only in old JWT validation/rotation auth */ +export function pickToken( + lc: LogContext, + previousToken: Auth | undefined, + newToken: Auth | undefined | null, +) { + if (newToken === null) { + return undefined; + } + + if ( + previousToken?.type && + newToken?.type && + previousToken?.type !== newToken?.type + ) { + throw new ProtocolError({ + kind: ErrorKind.Unauthorized, + message: + 'Token type cannot change. Client groups are pinned to a single token type.', + origin: ErrorOrigin.ZeroCache, + }); + } + + if (previousToken === undefined) { + lc.debug?.(`No previous token, using new token`); + return newToken; + } + + if (newToken?.type === 'opaque') { + return newToken; + } + + if (previousToken.type === 'opaque') { + throw new ProtocolError({ + kind: ErrorKind.Unauthorized, + message: + 'Token type cannot change from opaque to JWT. Client groups are pinned to a single token type.', + origin: ErrorOrigin.ZeroCache, + }); + } + + if (newToken) { + if (previousToken.decoded.sub !== newToken.decoded.sub) { + throw new ProtocolError({ + kind: ErrorKind.Unauthorized, + message: + 'The user id in the new token does not match the previous token. Client groups are pinned to a single user.', + origin: ErrorOrigin.ZeroCache, + }); + } + + if (previousToken.decoded.iat === undefined) { + lc.debug?.(`No issued at time for the existing token, using new token`); + // No issued at time for the existing token? We take the most recently received token. + return newToken; + } + + if (newToken.decoded.iat === undefined) { + throw new ProtocolError({ + kind: ErrorKind.Unauthorized, + message: + 'The new token does not have an issued at time but the prior token does. Tokens for a client group must either all have issued at times or all not have issued at times', + origin: ErrorOrigin.ZeroCache, + }); + } + + // The new token is newer, so we take it. + if (previousToken.decoded.iat < newToken.decoded.iat) { + lc.debug?.(`New token is newer, using it`); + return newToken; + } + + // if the new token is older or the same, we keep the existing token. + lc.debug?.(`New token is older or the same, using existing token`); + return previousToken; + } + + // previousToken !== undefined but newToken is undefined + throw new ProtocolError({ + kind: ErrorKind.Unauthorized, + message: + 'No token provided. An unauthenticated client cannot connect to an authenticated client group.', + origin: ErrorOrigin.ZeroCache, + }); +} diff --git a/packages/zero-cache/src/auth/read-authorizer.query.test.ts b/packages/zero-cache/src/auth/read-authorizer.query.test.ts index b0a7961400..a6071a3e07 100644 --- a/packages/zero-cache/src/auth/read-authorizer.query.test.ts +++ b/packages/zero-cache/src/auth/read-authorizer.query.test.ts @@ -30,8 +30,8 @@ import { buildPipeline, } from '../../../zql/src/builder/builder.ts'; import {Catch, type CaughtNode} from '../../../zql/src/ivm/catch.ts'; -import {consume} from '../../../zql/src/ivm/stream.ts'; import type {Source} from '../../../zql/src/ivm/source.ts'; +import {consume} from '../../../zql/src/ivm/stream.ts'; import type {ExpressionBuilder} from '../../../zql/src/query/expression.ts'; import {QueryDelegateBase} from '../../../zql/src/query/query-delegate-base.ts'; import type {QueryDelegate} from '../../../zql/src/query/query-delegate.ts'; @@ -940,7 +940,11 @@ function runReadQueryWithPermissions( new LogContext('debug'), asQueryInternals(query).ast, permissions, - authData, + { + type: 'jwt', + raw: '', + decoded: authData, + }, ), { authData, diff --git a/packages/zero-cache/src/auth/read-authorizer.test.ts b/packages/zero-cache/src/auth/read-authorizer.test.ts index 28d7fa21a7..4182c1e3f8 100644 --- a/packages/zero-cache/src/auth/read-authorizer.test.ts +++ b/packages/zero-cache/src/auth/read-authorizer.test.ts @@ -13,6 +13,7 @@ import type {ExpressionBuilder} from '../../../zql/src/query/expression.ts'; import {asQueryInternals} from '../../../zql/src/query/query-internals.ts'; import type {Query} from '../../../zql/src/query/query.ts'; import {newStaticQuery} from '../../../zql/src/query/static-query.ts'; +import type {Auth} from './auth.ts'; import {transformQuery} from './read-authorizer.ts'; const lc = createSilentLogContext(); @@ -128,10 +129,15 @@ type AuthData = { role: string; }; -const authData: AuthData = { - sub: '001', - role: 'user', -}; +const authData = { + type: 'jwt', + raw: '', + decoded: { + sub: '001', + role: 'user', + }, +} as const satisfies Auth; + const permissionRules = must( await definePermissions(schema, () => ({ readable: { diff --git a/packages/zero-cache/src/auth/read-authorizer.ts b/packages/zero-cache/src/auth/read-authorizer.ts index 07e23edd65..8c3553ad6a 100644 --- a/packages/zero-cache/src/auth/read-authorizer.ts +++ b/packages/zero-cache/src/auth/read-authorizer.ts @@ -1,11 +1,11 @@ import type {LogContext} from '@rocicorp/logger'; -import type {JWTPayload} from 'jose'; import type {JSONValue} from '../../../shared/src/json.ts'; import type {AST, Condition} from '../../../zero-protocol/src/ast.ts'; import {hashOfAST} from '../../../zero-protocol/src/query-hash.ts'; import type {PermissionsConfig} from '../../../zero-schema/src/compiled-permissions.ts'; import {bindStaticParameters} from '../../../zql/src/builder/builder.ts'; import {simplifyCondition} from '../../../zql/src/query/expression.ts'; +import type {JWTAuth} from './auth.ts'; export type TransformedAndHashed = { id: string; @@ -26,12 +26,12 @@ export function transformAndHashQuery( id: string, query: AST, permissionRules: PermissionsConfig, - authData: JWTPayload | undefined, + auth: JWTAuth | undefined, internalQuery: boolean | null | undefined, ): TransformedAndHashed { const transformed = internalQuery ? query // application permissions do not apply to internal queries - : transformQuery(lc, query, permissionRules, authData); + : transformQuery(lc, query, permissionRules, auth); return { id, transformedAst: transformed, @@ -46,7 +46,7 @@ export function transformQuery( lc: LogContext, query: AST, permissionRules: PermissionsConfig, - authData: JWTPayload | undefined, + auth: JWTAuth | undefined, ): AST { const queryWithPermissions = transformQueryInternal( lc, @@ -54,7 +54,7 @@ export function transformQuery( permissionRules, ); return bindStaticParameters(queryWithPermissions, { - authData: authData as Record, + authData: auth ? (auth.decoded as Record) : {}, }); } diff --git a/packages/zero-cache/src/server/syncer.ts b/packages/zero-cache/src/server/syncer.ts index caf95434a2..8b7d4b8478 100644 --- a/packages/zero-cache/src/server/syncer.ts +++ b/packages/zero-cache/src/server/syncer.ts @@ -7,6 +7,7 @@ import {must} from '../../../shared/src/must.ts'; import {randInt} from '../../../shared/src/rand.ts'; import * as v from '../../../shared/src/valita.ts'; import {DatabaseStorage} from '../../../zqlite/src/database-storage.ts'; +import {AuthSessionImpl, type ValidateLegacyJWT} from '../auth/auth.ts'; import type {NormalizedZeroConfig} from '../config/normalize.ts'; import {getNormalizedZeroConfig} from '../config/zero-config.ts'; import {CustomQueryTransformer} from '../custom-queries/transform-query.ts'; @@ -107,6 +108,7 @@ export default function runWorker( id: string, sub: Subscription, drainCoordinator: DrainCoordinator, + validateLegacyJWT: ValidateLegacyJWT | undefined, ) => { const logger = lc .withContext('component', 'view-syncer') @@ -129,6 +131,13 @@ export default function runWorker( 2, ); const normalYieldThresholdMs = Math.max(config.yieldThresholdMs, 2); + + const authSession = new AuthSessionImpl( + logger.withContext('component', 'auth-session'), + id, + validateLegacyJWT, + ); + return new ViewSyncerService( config, logger, @@ -157,6 +166,7 @@ export default function runWorker( inspectorDelegate, customQueryTransformer, runPriorityOp, + authSession, ); }; diff --git a/packages/zero-cache/src/services/analyze.ts b/packages/zero-cache/src/services/analyze.ts index 739d9e44a6..d4860de63c 100644 --- a/packages/zero-cache/src/services/analyze.ts +++ b/packages/zero-cache/src/services/analyze.ts @@ -13,11 +13,12 @@ import {Database} from '../../../zqlite/src/db.ts'; import {explainQueries} from '../../../zqlite/src/explain-queries.ts'; import {createSQLiteCostModel} from '../../../zqlite/src/sqlite-cost-model.ts'; import {TableSource} from '../../../zqlite/src/table-source.ts'; +import type {JWTAuth} from '../auth/auth.ts'; import type {NormalizedZeroConfig} from '../config/normalize.ts'; import {computeZqlSpecs, mustGetTableSpec} from '../db/lite-tables.ts'; import type {LiteAndZqlSpec, LiteTableSpec} from '../db/specs.ts'; import {runAst} from './run-ast.ts'; -import {TimeSliceTimer, type TokenData} from './view-syncer/view-syncer.ts'; +import {TimeSliceTimer} from './view-syncer/view-syncer.ts'; const TIME_SLICE_LAP_THRESHOLD_MS = 200; @@ -29,7 +30,7 @@ export async function analyzeQuery( syncedRows = true, vendedRows = false, permissions?: PermissionsConfig, - authData?: TokenData, + auth?: JWTAuth, joinPlans = false, ): Promise { using db = new Database(lc, config.replica.file); @@ -61,7 +62,7 @@ export async function analyzeQuery( applyPermissions: permissions !== undefined, syncedRows, vendedRows, - authData, + auth, db, tableSpecs, permissions, diff --git a/packages/zero-cache/src/services/mutagen/pusher.test.ts b/packages/zero-cache/src/services/mutagen/pusher.test.ts index fad2da42ae..cf440db66b 100644 --- a/packages/zero-cache/src/services/mutagen/pusher.test.ts +++ b/packages/zero-cache/src/services/mutagen/pusher.test.ts @@ -999,6 +999,106 @@ describe('pusher errors', () => { ); }); + test('invokes auth failure handler on 401 push failure', async () => { + const fetch = (global.fetch = vi.fn()); + fetch.mockResolvedValue({ + ok: true, + json: () => + Promise.resolve({ + kind: ErrorKind.PushFailed, + origin: ErrorOrigin.ZeroCache, + reason: ErrorReason.HTTP, + status: 401, + bodyPreview: 'Unauthorized access', + message: 'Fetch from API server returned non-OK status 401', + mutationIDs: [{clientID, id: 1}], + } satisfies PushResponse), + }); + + const pusher = new PusherService( + config, + { + url: ['http://example.com'], + apiKey: 'api-key', + forwardCookies: false, + }, + lc, + 'cgid', + ); + void pusher.run(); + const onAuthFailure = vi.fn(); + const stream = pusher.initConnection( + clientID, + wsID, + undefined, + undefined, + onAuthFailure, + ); + + pusher.enqueuePush( + clientID, + makePush(1, clientID), + 'jwt', + undefined, + undefined, + ); + + await expect(stream[Symbol.asyncIterator]().next()).rejects.toBeInstanceOf( + ProtocolErrorWithLevel, + ); + expect(onAuthFailure).toHaveBeenCalledTimes(1); + }); + + test('does not invoke auth failure handler on non-auth push failure', async () => { + const fetch = (global.fetch = vi.fn()); + fetch.mockResolvedValue({ + ok: true, + json: () => + Promise.resolve({ + kind: ErrorKind.PushFailed, + origin: ErrorOrigin.ZeroCache, + reason: ErrorReason.HTTP, + status: 500, + bodyPreview: 'Internal Server Error', + message: 'Fetch from API server returned non-OK status 500', + mutationIDs: [{clientID, id: 1}], + } satisfies PushResponse), + }); + + const pusher = new PusherService( + config, + { + url: ['http://example.com'], + apiKey: 'api-key', + forwardCookies: false, + }, + lc, + 'cgid', + ); + void pusher.run(); + const onAuthFailure = vi.fn(); + const stream = pusher.initConnection( + clientID, + wsID, + undefined, + undefined, + onAuthFailure, + ); + + pusher.enqueuePush( + clientID, + makePush(1, clientID), + 'jwt', + undefined, + undefined, + ); + + await expect(stream[Symbol.asyncIterator]().next()).rejects.toBeInstanceOf( + ProtocolErrorWithLevel, + ); + expect(onAuthFailure).not.toHaveBeenCalled(); + }); + test('emits error message with legacy http error format', async () => { await expectPushErrorResponse( { diff --git a/packages/zero-cache/src/services/mutagen/pusher.ts b/packages/zero-cache/src/services/mutagen/pusher.ts index 0ebb79362c..2f4f1d70bb 100644 --- a/packages/zero-cache/src/services/mutagen/pusher.ts +++ b/packages/zero-cache/src/services/mutagen/pusher.ts @@ -24,11 +24,11 @@ import {type ZeroConfig} from '../../config/zero-config.ts'; import {compileUrlPattern, fetchFromAPIServer} from '../../custom/fetch.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import {recordMutation} from '../../server/anonymous-otel-start.ts'; +import {ProtocolErrorWithLevel} from '../../types/error-with-level.ts'; import type {Source} from '../../types/streams.ts'; import {Subscription} from '../../types/subscription.ts'; import type {HandlerResult, StreamResult} from '../../workers/connection.ts'; import type {RefCountedService, Service} from '../service.ts'; -import {ProtocolErrorWithLevel} from '../../types/error-with-level.ts'; export interface Pusher extends RefCountedService { readonly pushURL: string | undefined; @@ -38,6 +38,7 @@ export interface Pusher extends RefCountedService { wsID: string, userPushURL: string | undefined, userPushHeaders: Record | undefined, + onAuthFailure?: (() => void) | undefined, ): Source; enqueuePush( clientID: string, @@ -108,12 +109,14 @@ export class PusherService implements Service, Pusher { wsID: string, userPushURL: string | undefined, userPushHeaders: Record | undefined, + onAuthFailure?: (() => void) | undefined, ) { return this.#pusher.initConnection( clientID, wsID, userPushURL, userPushHeaders, + onAuthFailure, ); } @@ -292,6 +295,7 @@ class PushWorker { { wsID: string; downstream: Subscription; + onAuthFailure: (() => void) | undefined; } >; #userPushURL?: string | undefined; @@ -339,6 +343,7 @@ class PushWorker { wsID: string, userPushURL: string | undefined, userPushHeaders: Record | undefined, + onAuthFailure?: (() => void) | undefined, ) { const existing = this.#clients.get(clientID); if (existing && existing.wsID === wsID) { @@ -375,7 +380,7 @@ class PushWorker { this.#clients.delete(clientID); }, }); - this.#clients.set(clientID, {wsID, downstream}); + this.#clients.set(clientID, {wsID, downstream, onAuthFailure}); return downstream; } @@ -457,8 +462,16 @@ class PushWorker { }; this.#failDownstream(client.downstream, pushFailedBody); + if (isPushAuthFailure(pushFailedBody)) { + this.#lc.debug?.('Auth failure detected in push response'); + client.onAuthFailure?.(); + } } else if ('kind' in response) { this.#failDownstream(client.downstream, response); + if (isPushAuthFailure(response)) { + this.#lc.debug?.('Auth failure detected in push response'); + client.onAuthFailure?.(); + } } else { unreachable(response); } @@ -595,6 +608,13 @@ class PushWorker { } } +function isPushAuthFailure(errorBody: PushFailedBody): boolean { + return ( + errorBody.reason === ErrorReason.HTTP && + (errorBody.status === 401 || errorBody.status === 403) + ); +} + /** * Pushes for different clientIDs could theoretically be interleaved. * diff --git a/packages/zero-cache/src/services/run-ast.ts b/packages/zero-cache/src/services/run-ast.ts index 69a2a7c361..b9f0b63fc6 100644 --- a/packages/zero-cache/src/services/run-ast.ts +++ b/packages/zero-cache/src/services/run-ast.ts @@ -9,6 +9,7 @@ import {sleep} from '../../../shared/src/sleep.ts'; import type {AnalyzeQueryResult} from '../../../zero-protocol/src/analyze-query-result.ts'; import type {AST} from '../../../zero-protocol/src/ast.ts'; import {mapAST} from '../../../zero-protocol/src/ast.ts'; +import type {ClientSchema} from '../../../zero-protocol/src/client-schema.ts'; import type {Row} from '../../../zero-protocol/src/data.ts'; import {hashOfAST} from '../../../zero-protocol/src/query-hash.ts'; import type {PermissionsConfig} from '../../../zero-schema/src/compiled-permissions.ts'; @@ -17,18 +18,17 @@ import { buildPipeline, type BuilderDelegate, } from '../../../zql/src/builder/builder.ts'; -import type {PlanDebugger} from '../../../zql/src/planner/planner-debug.ts'; import type {ConnectionCostModel} from '../../../zql/src/planner/planner-connection.ts'; +import type {PlanDebugger} from '../../../zql/src/planner/planner-debug.ts'; import type {Database} from '../../../zqlite/src/db.ts'; +import type {JWTAuth} from '../auth/auth.ts'; import {transformAndHashQuery} from '../auth/read-authorizer.ts'; import type {LiteAndZqlSpec} from '../db/specs.ts'; import {hydrate} from './view-syncer/pipeline-driver.ts'; -import type {TokenData} from './view-syncer/view-syncer.ts'; -import type {ClientSchema} from '../../../zero-protocol/src/client-schema.ts'; export type RunAstOptions = { applyPermissions?: boolean | undefined; - authData?: TokenData | undefined; + auth?: JWTAuth | undefined; clientToServerMapper?: NameMapper | undefined; costModel?: ConnectionCostModel | undefined; db: Database; @@ -67,8 +67,8 @@ export async function runAst( ast = mapAST(ast, must(clientToServerMapper)); } if (options.applyPermissions) { - const authData = options.authData?.decoded; - if (!authData) { + const auth = options.auth; + if (!auth) { result.warnings.push( 'No auth data provided. Permission rules will compare to `NULL` wherever an auth data field is referenced.', ); @@ -78,7 +78,7 @@ export async function runAst( 'clientGroupIDForAnalyze', ast, must(permissions), - authData, + auth, false, ).transformedAst; result.afterPermissions = await formatOutput(ast.table + astToZQL(ast)); diff --git a/packages/zero-cache/src/services/view-syncer/inspect-handler.ts b/packages/zero-cache/src/services/view-syncer/inspect-handler.ts index 0f8ef8bd37..b342a41b39 100644 --- a/packages/zero-cache/src/services/view-syncer/inspect-handler.ts +++ b/packages/zero-cache/src/services/view-syncer/inspect-handler.ts @@ -1,7 +1,9 @@ import type {LogContext} from '@rocicorp/logger'; import {unreachable} from '../../../../shared/src/asserts.ts'; +import {must} from '../../../../shared/src/must.ts'; import type {InspectUpBody} from '../../../../zero-protocol/src/inspect-up.ts'; import {Database} from '../../../../zqlite/src/db.ts'; +import type {JWTAuth} from '../../auth/auth.ts'; import {loadPermissions} from '../../auth/load-permissions.ts'; import type {NormalizedZeroConfig} from '../../config/normalize.ts'; import { @@ -15,8 +17,6 @@ import {analyzeQuery} from '../analyze.ts'; import type {ClientHandler} from './client-handler.ts'; import type {CVRStore} from './cvr-store.ts'; import type {CVRSnapshot} from './cvr.ts'; -import type {TokenData} from './view-syncer.ts'; -import {must} from '../../../../shared/src/must.ts'; export async function handleInspect( lc: LogContext, @@ -29,7 +29,7 @@ export async function handleInspect( config: NormalizedZeroConfig, headerOptions: HeaderOptions, userQueryURL: string | undefined, - authData: TokenData | undefined, + auth: JWTAuth | undefined, ): Promise { // Check if the client is already authenticated. We only authenticate the clientGroup // once per "worker". @@ -150,7 +150,7 @@ export async function handleInspect( body.options?.syncedRows, body.options?.vendedRows, permissions, - authData, + auth, body.options?.joinPlans, ); client.sendInspectResponse(lc, { diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer-inspect.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer-inspect.pg.test.ts index 1ce6349bb1..a454f8529a 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer-inspect.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer-inspect.pg.test.ts @@ -10,6 +10,7 @@ import type { } from '../../../../zero-protocol/src/inspect-down.ts'; import {PROTOCOL_VERSION} from '../../../../zero-protocol/src/protocol-version.ts'; import type {UpQueriesPatch} from '../../../../zero-protocol/src/queries-patch.ts'; +import type {AuthSession, ValidateLegacyJWT} from '../../auth/auth.ts'; import type {CustomQueryTransformer} from '../../custom-queries/transform-query.ts'; import type {InspectorDelegate} from '../../server/inspector-delegate.ts'; import {type PgTest, test} from '../../test/db.ts'; @@ -58,9 +59,9 @@ describe('view-syncer/service', () => { wsID: 'ws1', baseCookie: null, protocolVersion: PROTOCOL_VERSION, - tokenData: undefined, httpCookie: undefined, origin: undefined, + userID: 'user-123', }; let delegate: InspectorDelegate; @@ -633,6 +634,7 @@ describe('view-syncer/service', () => { let restrictiveUpstreamDb: PostgresDB; let restrictiveStateChanges: Subscription; let restrictiveVs: ViewSyncerService; + let restrictiveAuthSession: AuthSession; let restrictiveViewSyncerDone: Promise; let restrictiveConnectWithQueueAndSource: ( ctx: SyncContext, @@ -646,12 +648,28 @@ describe('view-syncer/service', () => { let restrictiveDelegate: InspectorDelegate; beforeEach(async ({testDBs}) => { + const validateLegacyJWT: ValidateLegacyJWT = token => { + if (token === 'jwt-admin-token') { + return Promise.resolve({ + type: 'jwt', + raw: token, + decoded: { + sub: 'user-123', + role: 'admin', + iat: Date.now(), + }, + }); + } + return Promise.reject(new Error(`Unexpected test token: ${token}`)); + }; + ({ replicaDbFile: restrictiveReplicaDbFile, cvrDB: restrictiveCvrDB, upstreamDb: restrictiveUpstreamDb, stateChanges: restrictiveStateChanges, vs: restrictiveVs, + authSession: restrictiveAuthSession, viewSyncerDone: restrictiveViewSyncerDone, connectWithQueueAndSource: restrictiveConnectWithQueueAndSource, inspectorDelegate: restrictiveDelegate, @@ -659,6 +677,7 @@ describe('view-syncer/service', () => { testDBs, 'view_syncer_restrictive_permissions_test', permissions, + validateLegacyJWT, )); restrictiveDelegate.setAuthenticated(serviceID); @@ -730,25 +749,14 @@ describe('view-syncer/service', () => { }); test('permission filter with auth data substitutes actual values', async () => { - // Create a sync context with tokenData that includes role='admin' - const ADMIN_SYNC_CONTEXT: SyncContext = { - ...SYNC_CONTEXT, - tokenData: { - raw: JSON.stringify({ - sub: 'user-123', - role: 'admin', - iat: Date.now(), - }), - decoded: { - sub: 'user-123', - role: 'admin', - iat: Date.now(), - }, - }, - }; + expect( + await restrictiveAuthSession.update('admin', 'jwt-admin-token'), + ).toEqual({ + ok: true, + }); const {queue: client} = restrictiveConnectWithQueueAndSource( - ADMIN_SYNC_CONTEXT, + SYNC_CONTEXT, [], ); @@ -759,7 +767,7 @@ describe('view-syncer/service', () => { const inspectId = 'test-restrictive-permissions-with-auth'; - await restrictiveVs.inspect(ADMIN_SYNC_CONTEXT, [ + await restrictiveVs.inspect(SYNC_CONTEXT, [ 'inspect', { op: 'analyze-query', diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer-permissions.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer-permissions.pg.test.ts index cc3341f382..5cdc68cf2d 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer-permissions.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer-permissions.pg.test.ts @@ -5,6 +5,7 @@ import type {Downstream} from '../../../../zero-protocol/src/down.ts'; import {PROTOCOL_VERSION} from '../../../../zero-protocol/src/protocol-version.ts'; import type {UpQueriesPatch} from '../../../../zero-protocol/src/queries-patch.ts'; import type {PermissionsConfig} from '../../../../zero-schema/src/compiled-permissions.ts'; +import type {AuthSession, ValidateLegacyJWT} from '../../auth/auth.ts'; import {type PgTest, test} from '../../test/db.ts'; import type {DbFile} from '../../test/lite.ts'; import type {PostgresDB} from '../../types/pg.ts'; @@ -32,6 +33,7 @@ describe('permissions', () => { let cvrDB: PostgresDB; let upstreamDb: PostgresDB; let vs: ViewSyncerService; + let authSession: AuthSession; let viewSyncerDone: Promise; let replicator: FakeReplicator; @@ -41,25 +43,47 @@ describe('permissions', () => { wsID: 'ws1', baseCookie: null, protocolVersion: PROTOCOL_VERSION, - tokenData: { - raw: '', - decoded: {sub: 'foo', role: 'user', iat: 0}, - }, httpCookie: undefined, origin: undefined, + userID: 'bar', }; beforeEach(async ({testDBs}) => { + const validateLegacyJWT: ValidateLegacyJWT = token => { + switch (token) { + case 'user-token': + return Promise.resolve({ + type: 'jwt', + raw: token, + decoded: {sub: 'bar', role: 'user', iat: 0}, + }); + case 'admin-token': + return Promise.resolve({ + type: 'jwt', + raw: token, + decoded: {sub: 'bar', role: 'admin', iat: 1}, + }); + default: + return Promise.reject(new Error(`Unexpected test token: ${token}`)); + } + }; + ({ stateChanges, connect, vs, + authSession, viewSyncerDone, cvrDB, upstreamDb, replicaDbFile, replicator, - } = await setup(testDBs, 'view_syncer_permissions_test', permissions)); + } = await setup( + testDBs, + 'view_syncer_permissions_test', + permissions, + validateLegacyJWT, + )); return async () => { // Restores fake date if used. @@ -72,6 +96,8 @@ describe('permissions', () => { }); test('client with user role followed by client with admin role', async () => { + expect(await authSession.update('foo', 'user-token')).toEqual({ok: true}); + const client = connect(SYNC_CONTEXT, [ {op: 'put', hash: 'query-hash1', ast: ISSUES_QUERY}, ]); @@ -114,14 +140,14 @@ describe('permissions', () => { // New client connects with same everything (client group, user id) but brings a new role. // This should transform their existing queries to return the data they can now see. + expect(await authSession.update('foo', 'admin-token')).toEqual({ + ok: true, + }); + const client2 = connect( { ...SYNC_CONTEXT, clientID: 'bar', - tokenData: { - raw: '', - decoded: {sub: 'foo', role: 'admin', iat: 1}, - }, }, [{op: 'put', hash: 'query-hash1', ast: ISSUES_QUERY}], ); @@ -417,13 +443,13 @@ describe('permissions', () => { }); test('query for comments does not return issue rows as those are gotten by the permission system', async () => { + expect(await authSession.update('foo', 'admin-token')).toEqual({ + ok: true, + }); + const client = connect( { ...SYNC_CONTEXT, - tokenData: { - raw: '', - decoded: {sub: 'foo', role: 'admin', iat: 1}, - }, }, [{op: 'put', hash: 'query-hash2', ast: COMMENTS_QUERY}], ); diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer-pick-token.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer-pick-token.pg.test.ts deleted file mode 100644 index 702d684d8b..0000000000 --- a/packages/zero-cache/src/services/view-syncer/view-syncer-pick-token.pg.test.ts +++ /dev/null @@ -1,196 +0,0 @@ -import {describe, expect, test} from 'vitest'; -import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; -import {pickToken} from './view-syncer.ts'; -import {ProtocolError} from '../../../../zero-protocol/src/error.ts'; - -describe('pickToken', () => { - const lc = createSilentLogContext(); - - test('previous token is undefined', () => { - expect( - pickToken(lc, undefined, {decoded: {sub: 'foo', iat: 1}, raw: ''}), - ).toEqual({ - decoded: { - sub: 'foo', - iat: 1, - }, - raw: '', - }); - }); - - test('previous token exists, new token is undefined', () => { - expect(() => - pickToken(lc, {decoded: {sub: 'foo', iat: 1}, raw: ''}, undefined), - ).toThrowError(ProtocolError); - }); - - test('previous token has a subject, new token does not', () => { - expect(() => - pickToken(lc, {decoded: {sub: 'foo'}, raw: ''}, {decoded: {}, raw: ''}), - ).toThrowError(ProtocolError); - }); - - test('previous token has a subject, new token has a different subject', () => { - expect(() => - pickToken( - lc, - {decoded: {sub: 'foo', iat: 1}, raw: ''}, - {decoded: {sub: 'bar', iat: 1}, raw: ''}, - ), - ).toThrowError(ProtocolError); - }); - - test('previous token has a subject, new token has the same subject', () => { - expect( - pickToken( - lc, - {decoded: {sub: 'foo', iat: 1}, raw: ''}, - {decoded: {sub: 'foo', iat: 2}, raw: ''}, - ), - ).toEqual({ - decoded: { - sub: 'foo', - iat: 2, - }, - raw: '', - }); - - expect( - pickToken( - lc, - {decoded: {sub: 'foo', iat: 2}, raw: ''}, - {decoded: {sub: 'foo', iat: 1}, raw: ''}, - ), - ).toEqual({ - decoded: { - sub: 'foo', - iat: 2, - }, - raw: '', - }); - }); - - test('previous token has no subject, new token has a subject', () => { - expect(() => - pickToken( - lc, - {decoded: {sub: 'foo', iat: 123}, raw: ''}, - {decoded: {iat: 123}, raw: ''}, - ), - ).toThrowError(ProtocolError); - }); - - test('previous token has no subject, new token has no subject', () => { - expect( - pickToken(lc, {decoded: {iat: 1}, raw: ''}, {decoded: {iat: 2}, raw: ''}), - ).toEqual({ - decoded: { - iat: 2, - }, - raw: '', - }); - expect( - pickToken(lc, {decoded: {iat: 2}, raw: ''}, {decoded: {iat: 1}, raw: ''}), - ).toEqual({ - decoded: { - iat: 2, - }, - raw: '', - }); - }); - - test('previous token has an issued at time, new token does not', () => { - expect(() => - pickToken( - lc, - {decoded: {sub: 'foo', iat: 1}, raw: ''}, - {decoded: {sub: 'foo'}, raw: ''}, - ), - ).toThrowError(ProtocolError); - }); - - test('previous token has an issued at time, new token has a greater issued at time', () => { - expect( - pickToken( - lc, - {decoded: {sub: 'foo', iat: 1}, raw: ''}, - {decoded: {sub: 'foo', iat: 2}, raw: ''}, - ), - ).toEqual({ - decoded: { - sub: 'foo', - iat: 2, - }, - raw: '', - }); - }); - - test('previous token has an issued at time, new token has a lesser issued at time', () => { - expect( - pickToken( - lc, - {decoded: {sub: 'foo', iat: 2}, raw: ''}, - {decoded: {sub: 'foo', iat: 1}, raw: ''}, - ), - ).toEqual({ - decoded: { - sub: 'foo', - iat: 2, - }, - raw: '', - }); - }); - - test('previous token has an issued at time, new token has the same issued at time', () => { - expect( - pickToken( - lc, - { - decoded: {sub: 'foo', iat: 2}, - raw: '', - }, - { - decoded: {sub: 'foo', iat: 2}, - raw: '', - }, - ), - ).toEqual({ - decoded: { - sub: 'foo', - iat: 2, - }, - raw: '', - }); - }); - - test('previous token has no issued at time, new token has an issued at time', () => { - expect( - pickToken( - lc, - {decoded: {sub: 'foo'}, raw: 'no-iat'}, - {decoded: {sub: 'foo', iat: 2}, raw: 'iat'}, - ), - ).toEqual({ - decoded: { - sub: 'foo', - iat: 2, - }, - raw: 'iat', - }); - }); - - test('previous token has no issued at time, new token has no issued at time', () => { - expect( - pickToken( - lc, - {decoded: {sub: 'foo'}, raw: ''}, - {decoded: {sub: 'foo'}, raw: ''}, - ), - ).toEqual({ - decoded: { - sub: 'foo', - }, - raw: '', - }); - }); -}); diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer-test-util.ts b/packages/zero-cache/src/services/view-syncer/view-syncer-test-util.ts index 61e6f936f7..574f7d653a 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer-test-util.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer-test-util.ts @@ -30,6 +30,7 @@ import { DatabaseStorage, } from '../../../../zqlite/src/database-storage.ts'; import {Database} from '../../../../zqlite/src/db.ts'; +import {AuthSessionImpl, type ValidateLegacyJWT} from '../../auth/auth.ts'; import type {NormalizedZeroConfig} from '../../config/normalize.ts'; import type {ZeroConfig} from '../../config/zero-config.ts'; import {CustomQueryTransformer} from '../../custom-queries/transform-query.ts'; @@ -579,6 +580,7 @@ export async function setup( testDBs: TestDBs, testName: string, permissions: PermissionsConfig | undefined, + validateLegacyJWT: ValidateLegacyJWT | undefined = undefined, ) { const lc = createSilentLogContext(); const storageDB = new Database(lc, ':memory:'); @@ -716,6 +718,7 @@ export async function setup( ); const inspectorDelegate = new InspectorDelegate(customQueryTransformer); + const authSession = new AuthSessionImpl(lc, serviceID, validateLegacyJWT); const vs = new ViewSyncerService( config, lc, @@ -739,6 +742,7 @@ export async function setup( inspectorDelegate, customQueryTransformer, (_lc, _description, op) => op(), + authSession, undefined, setTimeoutFn, ); @@ -798,6 +802,7 @@ export async function setup( drainCoordinator, operatorStorage, vs, + authSession, viewSyncerDone, replicator, connect, diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer-ttl.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer-ttl.pg.test.ts index fa7320679e..28bc368d74 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer-ttl.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer-ttl.pg.test.ts @@ -82,9 +82,9 @@ const SYNC_CONTEXT: SyncContext = { wsID: 'ws1', baseCookie: null, protocolVersion: PROTOCOL_VERSION, - tokenData: undefined, httpCookie: undefined, origin: undefined, + userID: 'bar', }; beforeEach(async ({testDBs}) => { diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts index b0046e57fa..201def5ef6 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.pg.test.ts @@ -1,3 +1,4 @@ +import {resolver} from '@rocicorp/resolver'; import { afterEach, beforeEach, @@ -7,7 +8,6 @@ import { type MockedFunction, vi, } from 'vitest'; -import {resolver} from '@rocicorp/resolver'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import type {Queue} from '../../../../shared/src/queue.ts'; import {sleep} from '../../../../shared/src/sleep.ts'; @@ -32,6 +32,7 @@ import type {UpQueriesPatch} from '../../../../zero-protocol/src/queries-patch.t import {DEFAULT_TTL_MS} from '../../../../zql/src/query/ttl.ts'; import {type ClientGroupStorage} from '../../../../zqlite/src/database-storage.ts'; import type {Database} from '../../../../zqlite/src/db.ts'; +import type {AuthSession, OpaqueAuth} from '../../auth/auth.ts'; import type {CustomQueryTransformer} from '../../custom-queries/transform-query.ts'; import {StatementRunner} from '../../db/statements.ts'; import {type PgTest, test} from '../../test/db.ts'; @@ -43,9 +44,11 @@ import type {Subscription} from '../../types/subscription.ts'; import type {ReplicaState} from '../replicator/replicator.ts'; import {updateReplicationWatermark} from '../replicator/schema/replication-state.ts'; import {type FakeReplicator} from '../replicator/test-utils.ts'; +import {ClientHandler} from './client-handler.ts'; import {CVRStore} from './cvr-store.ts'; import {CVRQueryDrivenUpdater, CVRUpdater} from './cvr.ts'; import type {DrainCoordinator} from './drain-coordinator.ts'; +import {PipelineDriver} from './pipeline-driver.ts'; import {ttlClockFromNumber} from './ttl-clock.ts'; import { app2Messages, @@ -72,8 +75,6 @@ import { USERS_QUERY, } from './view-syncer-test-util.ts'; import type {ViewSyncerService} from './view-syncer.ts'; -import {ClientHandler} from './client-handler.ts'; -import {PipelineDriver} from './pipeline-driver.ts'; import {type SyncContext} from './view-syncer.ts'; describe('view-syncer/service', () => { @@ -92,6 +93,7 @@ describe('view-syncer/service', () => { let operatorStorage: ClientGroupStorage; let vs: ViewSyncerService; + let authSession: AuthSession; let viewSyncerDone: Promise; let replicator: FakeReplicator; let connect: ( @@ -126,9 +128,9 @@ describe('view-syncer/service', () => { wsID: 'ws1', baseCookie: null, protocolVersion: PROTOCOL_VERSION, - tokenData: undefined, httpCookie: undefined, origin: undefined, + userID: 'user-1', }; beforeEach(async ({testDBs}) => { @@ -142,6 +144,7 @@ describe('view-syncer/service', () => { drainCoordinator, operatorStorage, vs, + authSession, viewSyncerDone, replicator, connect, @@ -557,12 +560,31 @@ describe('view-syncer/service', () => { return queryResponses(); } return Promise.resolve( - new Response( - JSON.stringify([ - 'transformed', - queryResponses, - ] satisfies TransformResponseMessage), - ), + Response.json([ + 'transformed', + queryResponses, + ] satisfies TransformResponseMessage), + ); + } + return Promise.reject(new Error('Unexpected fetch call ' + url)); + }); + } + + function mockFetchImplWithHeaders( + queryResponses: TransformResponseBody, + expectedHeaders: Record, + ) { + mockFetch.mockImplementation((url, init) => { + if ( + url === + 'http://my-pull-endpoint.dev/api/zero/pull?schema=this_app_2&appID=this_app' + ) { + expect(init?.headers).toMatchObject(expectedHeaders); + return Promise.resolve( + Response.json([ + 'transformed', + queryResponses, + ] satisfies TransformResponseMessage), ); } return Promise.reject(new Error('Unexpected fetch call ' + url)); @@ -771,6 +793,38 @@ describe('view-syncer/service', () => { `); }); + test('custom query transform forwards opaque auth to fetch', async () => { + const token = 'opaque-token'; + await authSession.update('user-1', token); + mockFetchImplWithHeaders( + [ + { + ast: ISSUES_QUERY, + id: 'custom-opaque', + name: 'named-query-opaque', + }, + ], + { + Authorization: `Bearer ${token}`, + }, + ); + + const client = connect(SYNC_CONTEXT, [ + { + op: 'put', + hash: 'custom-opaque', + name: 'named-query-opaque', + args: ['thing'], + }, + ]); + + await nextPoke(client); + stateChanges.push({state: 'version-ready'}); + await nextPoke(client); + + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + test('removing one of two queries with shared transformation hash does not remove pipeline', async () => { mockFetchImpl([ { @@ -2412,6 +2466,190 @@ describe('view-syncer/service', () => { `); }); + test('retransforms custom queries when opaque auth refreshes', async () => { + using transformSpy = vi + .spyOn(customQueryTransformer!, 'transform') + .mockResolvedValueOnce([ + { + id: 'custom-1', + transformedAst: ISSUES_QUERY, + transformationHash: 'hash-1', + }, + ]) + .mockResolvedValueOnce([ + { + id: 'custom-1', + transformedAst: ISSUES_QUERY, + transformationHash: 'hash-2', + }, + ]); + + const token1: OpaqueAuth = { + type: 'opaque', + raw: 'token-1', + }; + const token2: OpaqueAuth = { + type: 'opaque', + raw: 'token-2', + }; + + await authSession.update('user-1', token1.raw); + const client = connect(SYNC_CONTEXT, [ + {op: 'put', hash: 'custom-1', name: 'named-query-1', args: ['thing']}, + ]); + + await nextPoke(client); + stateChanges.push({state: 'version-ready'}); + await nextPoke(client); + + expect(transformSpy).toHaveBeenCalledTimes(1); + expect(transformSpy.mock.calls[0][0].token).toBe('token-1'); + + await vs.updateAuth(SYNC_CONTEXT, ['updateAuth', {auth: token2.raw}]); + + expect(transformSpy).toHaveBeenCalledTimes(2); + expect(transformSpy.mock.calls[1][0].token).toBe('token-2'); + }); + + test('does not retransform custom queries when opaque auth is unchanged after revision is synced', async () => { + using transformSpy = vi + .spyOn(customQueryTransformer!, 'transform') + .mockResolvedValue([ + { + id: 'custom-1', + transformedAst: ISSUES_QUERY, + transformationHash: 'hash-1', + }, + ]); + + await authSession.update('user-1', 'token-1'); + const client = connect(SYNC_CONTEXT, [ + {op: 'put', hash: 'custom-1', name: 'named-query-1', args: ['thing']}, + ]); + + await nextPoke(client); + stateChanges.push({state: 'version-ready'}); + await nextPoke(client); + + expect(transformSpy).toHaveBeenCalledTimes(1); + + // update existing auth session state + await vs.updateAuth(SYNC_CONTEXT, ['updateAuth', {auth: 'token-1'}]); + expect(transformSpy).toHaveBeenCalledTimes(2); + + // subsequent auth updates should be no-op + await vs.updateAuth(SYNC_CONTEXT, ['updateAuth', {auth: 'token-1'}]); + + expect(transformSpy).toHaveBeenCalledTimes(2); + }); + + test('failed updateAuth keeps existing auth and does not retransform queries', async () => { + using transformSpy = vi + .spyOn(customQueryTransformer!, 'transform') + .mockResolvedValueOnce([ + { + id: 'custom-1', + transformedAst: ISSUES_QUERY, + transformationHash: 'hash-1', + }, + ]) + .mockResolvedValueOnce([ + { + id: 'custom-1', + transformedAst: ISSUES_QUERY, + transformationHash: 'hash-2', + }, + ]); + + await authSession.update('user-1', 'token-1'); + const client = connect(SYNC_CONTEXT, [ + {op: 'put', hash: 'custom-1', name: 'named-query-1', args: ['thing']}, + ]); + + await nextPoke(client); + stateChanges.push({state: 'version-ready'}); + await nextPoke(client); + + expect(transformSpy).toHaveBeenCalledTimes(1); + + await vs.updateAuth(SYNC_CONTEXT, ['updateAuth', {auth: ''}]); + + expect(authSession.auth?.raw).toBe('token-1'); + expect(transformSpy).toHaveBeenCalledTimes(1); + + await expect(client.dequeue()).rejects.toThrow('No token provided'); + }); + + test('transform 401 during updateAuth clears auth session', async () => { + using transformSpy = vi + .spyOn(customQueryTransformer!, 'transform') + .mockResolvedValueOnce([ + { + id: 'custom-1', + transformedAst: ISSUES_QUERY, + transformationHash: 'hash-1', + }, + ]) + .mockResolvedValueOnce({ + kind: ErrorKind.TransformFailed, + message: 'Fetch from API server returned non-OK status 401', + origin: ErrorOrigin.ZeroCache, + queryIDs: ['custom-1'], + reason: ErrorReason.HTTP, + status: 401, + bodyPreview: '{ "error": "Unauthorized" }', + }); + + await authSession.update('user-1', 'token-1'); + const client = connect(SYNC_CONTEXT, [ + {op: 'put', hash: 'custom-1', name: 'named-query-1', args: ['thing']}, + ]); + + await nextPoke(client); + stateChanges.push({state: 'version-ready'}); + await nextPoke(client); + + expect(transformSpy).toHaveBeenCalledTimes(1); + expect(authSession.auth?.raw).toBe('token-1'); + + await vs.updateAuth(SYNC_CONTEXT, ['updateAuth', {auth: 'token-2'}]); + + expect(authSession.auth).toBeUndefined(); + expect(transformSpy).toHaveBeenCalledTimes(2); + + await expect(nextPoke(client)).rejects.toThrow( + 'Fetch from API server returned non-OK status 401', + ); + }); + + test('transform 401 clears auth session to prevent DoS', async () => { + using transformSpy = vi + .spyOn(customQueryTransformer!, 'transform') + .mockResolvedValueOnce({ + kind: ErrorKind.TransformFailed, + message: 'Fetch from API server returned non-OK status 401', + origin: ErrorOrigin.ZeroCache, + queryIDs: ['custom-1'], + reason: ErrorReason.HTTP, + status: 401, + bodyPreview: '{ "error": "Unauthorized" }', + }); + + await authSession.update('user-bad', 'token-bad'); + + const badContext = {...SYNC_CONTEXT, userID: 'user-bad'}; + const badClient = connect(badContext, [ + {op: 'put', hash: 'custom-1', name: 'named-query-1', args: ['thing']}, + ]); + + await nextPoke(badClient); + stateChanges.push({state: 'version-ready'}); + await vi.waitFor(() => expect(transformSpy).toHaveBeenCalledTimes(1)); + + // 401 during transform clears session so the client group is not stuck. + expect(authSession.auth).toBeUndefined(); + }); + // test cases where custom query transforms fail test('http transform call fails', async () => { mockFetchImpl(() => @@ -4183,9 +4421,9 @@ describe('view-syncer/service', () => { wsID: '9382', baseCookie: preAdvancement.cookie, protocolVersion: PROTOCOL_VERSION, - tokenData: undefined, httpCookie: undefined, origin: undefined, + userID: 'user-1', }, [{op: 'put', hash: 'query-hash1', ast: ISSUES_QUERY}], ); diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.ts index 381b6def77..786842b050 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.ts @@ -2,7 +2,6 @@ import {trace} from '@opentelemetry/api'; import {Lock} from '@rocicorp/lock'; import type {LogContext} from '@rocicorp/logger'; import {resolver} from '@rocicorp/resolver'; -import type {JWTPayload} from 'jose'; import type {Row} from 'postgres'; import { manualSpan, @@ -26,7 +25,9 @@ import type {DeleteClientsMessage} from '../../../../zero-protocol/src/delete-cl import type {Downstream} from '../../../../zero-protocol/src/down.ts'; import {ErrorKind} from '../../../../zero-protocol/src/error-kind.ts'; import {ErrorOrigin} from '../../../../zero-protocol/src/error-origin.ts'; +import {ErrorReason} from '../../../../zero-protocol/src/error-reason.ts'; import { + isProtocolError, ProtocolError, type TransformFailedBody, } from '../../../../zero-protocol/src/error.ts'; @@ -34,7 +35,9 @@ import type { InspectUpBody, InspectUpMessage, } from '../../../../zero-protocol/src/inspect-up.ts'; +import type {UpdateAuthMessage} from '../../../../zero-protocol/src/update-auth.ts'; import {clampTTL, MAX_TTL_MS} from '../../../../zql/src/query/ttl.ts'; +import type {Auth, AuthSession, AuthUpdateResult} from '../../auth/auth.ts'; import { transformAndHashQuery, type TransformedAndHashed, @@ -102,21 +105,15 @@ import { type TTLClock, } from './ttl-clock.ts'; -export type TokenData = { - readonly raw: string; - /** @deprecated */ - readonly decoded: JWTPayload; -}; - export type SyncContext = { readonly clientID: string; readonly wsID: string; readonly profileID: string | null; readonly baseCookie: string | null; readonly protocolVersion: number; - readonly tokenData: TokenData | undefined; readonly httpCookie: string | undefined; readonly origin: string | undefined; + readonly userID: string; }; const tracer = trace.getTracer('view-syncer', version); @@ -135,7 +132,16 @@ export interface ViewSyncer { ): Promise; deleteClients(ctx: SyncContext, msg: DeleteClientsMessage): Promise; + inspect(context: SyncContext, msg: InspectUpMessage): Promise; + + readonly auth: Auth | undefined; + initAuthSession( + userID: string, + wireAuth: string | undefined, + ): Promise; + updateAuth(ctx: SyncContext, msg: UpdateAuthMessage): Promise; + clearAuth(): void; } const DEFAULT_KEEPALIVE_MS = 5_000; @@ -176,6 +182,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { readonly #keepaliveMs: number; readonly #slowHydrateThreshold: number; readonly #queryConfig: ZeroConfig['query']; + readonly #authSession: AuthSession; userQueryURL?: string | undefined; userQueryHeaders?: Record | undefined; @@ -226,13 +233,12 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { #cvr: CVRSnapshot | undefined; #pipelinesSynced = false; - // DEPRECATED: remove `authData` in favor of forwarding - // auth and cookie headers directly - #authData: TokenData | undefined; #httpCookie: string | undefined; #origin: string | undefined; + #lastAuthRevision: number = 0; + #expiredQueriesTimer: ReturnType | 0 = 0; readonly #setTimeout: SetTimeout; readonly #customQueryTransformer: CustomQueryTransformer | undefined; @@ -317,6 +323,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { description: string, op: () => Promise, ) => Promise, + authSession: AuthSession, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn: SetTimeout = setTimeout.bind(globalThis), ) { @@ -333,6 +340,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { this.#slowHydrateThreshold = slowHydrateThreshold; this.#inspectorDelegate = inspectorDelegate; this.#customQueryTransformer = customQueryTransformer; + this.#authSession = authSession; this.#cvrStore = new CVRStore( lc, cvrDb, @@ -349,12 +357,28 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { this.keepalive(); } + get auth(): Auth | undefined { + return this.#authSession.auth; + } + + clearAuth(): void { + this.#authSession.clear(); + this.#lastAuthRevision = 0; + } + + initAuthSession( + userID: string, + wireAuth: string | undefined, + ): Promise { + return this.#authSession.update(userID, wireAuth); + } + #getHeaderOptions(forwardCookie: boolean): HeaderOptions { return { apiKey: this.#queryConfig.apiKey, customHeaders: this.userQueryHeaders, allowedClientHeaders: this.#queryConfig.allowedClientHeaders, - token: this.#authData?.raw, + token: this.#authSession.auth?.raw, cookie: forwardCookie ? this.#httpCookie : undefined, origin: this.#origin, }; @@ -634,13 +658,10 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { profileID, wsID, baseCookie, - tokenData, httpCookie, origin, protocolVersion, } = ctx; - this.#authData = pickToken(this.#lc, this.#authData, tokenData); - this.#lc.debug?.(`Picked auth token for clientGroupID`); this.#httpCookie = httpCookie; this.#origin = origin; @@ -755,11 +776,68 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { await this.#runInLockForClient( ctx, msg, - (lc, clientID, msg: Partial, cvr) => - this.#handleConfigUpdate(lc, clientID, msg, cvr, 'missing'), + async (lc, clientID, msg: Partial, cvr) => { + let customQueryTransformMode: CustomQueryTransformMode = 'missing'; + const currentAuthRevision = this.#authSession.revision; + if (this.#lastAuthRevision < currentAuthRevision) { + customQueryTransformMode = 'all'; + lc.debug?.( + 'Auth revision changed, setting customQueryTransformMode to all', + ); + } + + const result = await this.#handleConfigUpdate( + lc, + clientID, + msg, + cvr, + customQueryTransformMode, + ); + + // commit the new revision after the config update is successful + if (customQueryTransformMode === 'all') { + this.#lastAuthRevision = currentAuthRevision; + } + + return result; + }, ); } + async updateAuth(ctx: SyncContext, msg: UpdateAuthMessage): Promise { + await this.#runInLockForClient(ctx, msg, async (lc, clientID, _, cvr) => { + // update auth and check if the revision has changed + // if it has, we need to re-transform all queries since the auth data may be used in the transformation + const authResult = await this.#authSession.update( + ctx.userID, + msg[1].auth, + ); + if (!authResult.ok) { + throw new ProtocolErrorWithLevel(authResult.error, 'warn'); + } + const currentAuthRevision = this.#authSession.revision; + if (this.#lastAuthRevision >= currentAuthRevision) { + lc.debug?.('Auth revision unchanged, skipping query re-transformation'); + return; + } else { + lc.debug?.('Auth revision changed, re-transforming queries'); + } + + const result = await this.#handleConfigUpdate( + lc, + clientID, + {}, // no config updates, but we want to trigger re-transformation of custom queries if auth changed + cvr, + 'all', + ); + + // commit the new revision after the config update is successful + this.#lastAuthRevision = currentAuthRevision; + + return result; + }); + } + async deleteClients( ctx: SyncContext, msg: DeleteClientsMessage, @@ -942,6 +1020,10 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { .withContext('wsID', wsID) .withContext('cmd', cmd); lc[getLogLevel(e)]?.(`closing connection with error`, e); + if (isTransformAuthFailure(e)) { + lc.debug?.('Auth failure detected in transform response'); + this.clearAuth(); + } if (client) { // Ideally, propagate the exception to the client's downstream subscription ... client.fail(e); @@ -1000,7 +1082,9 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { } // Apply requested patches. - lc.debug?.(`applying ${desiredQueriesPatch?.length} query patches`); + lc.debug?.( + `applying ${desiredQueriesPatch?.length ?? 0} query patches`, + ); if (desiredQueriesPatch?.length) { for (const patch of desiredQueriesPatch) { switch (patch.op) { @@ -1211,6 +1295,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { } for (const q of otherQueries) { + const auth = this.#authSession.auth; const transformed = transformAndHashQuery( lc, q.id, @@ -1218,7 +1303,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { must(this.#pipelines.currentPermissions()).permissions ?? { tables: {}, }, - this.#authData?.decoded, + auth?.type === 'jwt' ? auth : undefined, q.type === 'internal', ); if (transformed.transformationHash === q.transformationHash) { @@ -1405,6 +1490,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { for (const {id, query: origQuery} of otherQueries) { // This should always match, no? assert(id === origQuery.id, 'query id mismatch'); + const auth = this.#authSession.auth; const transformed = transformAndHashQuery( lc, origQuery.id, @@ -1412,7 +1498,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { must(this.#pipelines.currentPermissions()).permissions ?? { tables: {}, }, - this.#authData?.decoded, + auth?.type === 'jwt' ? auth : undefined, origQuery.type === 'internal', ); transformedQueries.push({ @@ -1995,6 +2081,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { cvr: CVRSnapshot, ): Promise => { const client = must(this.#clients.get(clientID)); + const auth = this.#authSession.auth; return handleInspect( lc, body, @@ -2006,7 +2093,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { this.#config, this.#getHeaderOptions(this.#queryConfig.forwardCookies ?? false), this.userQueryURL, - this.#authData, + auth?.type === 'jwt' ? auth : undefined, ); }; @@ -2018,6 +2105,8 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { } async #cleanup(err?: unknown) { + this.clearAuth(); + this.#stopTTLClockInterval(); this.#stopExpireTimer(); @@ -2098,59 +2187,16 @@ function checkClientAndCVRVersions( } } -export function pickToken( - lc: LogContext, - previousToken: TokenData | undefined, - newToken: TokenData | undefined, -) { - if (previousToken === undefined) { - lc.debug?.(`No previous token, using new token`); - return newToken; - } - - if (newToken) { - if (previousToken.decoded.sub !== newToken.decoded.sub) { - throw new ProtocolError({ - kind: ErrorKind.Unauthorized, - message: - 'The user id in the new token does not match the previous token. Client groups are pinned to a single user.', - origin: ErrorOrigin.ZeroCache, - }); - } - - if (previousToken.decoded.iat === undefined) { - lc.debug?.(`No issued at time for the existing token, using new token`); - // No issued at time for the existing token? We take the most recently received token. - return newToken; - } - - if (newToken.decoded.iat === undefined) { - throw new ProtocolError({ - kind: ErrorKind.Unauthorized, - message: - 'The new token does not have an issued at time but the prior token does. Tokens for a client group must either all have issued at times or all not have issued at times', - origin: ErrorOrigin.ZeroCache, - }); - } - - // The new token is newer, so we take it. - if (previousToken.decoded.iat < newToken.decoded.iat) { - lc.debug?.(`New token is newer, using it`); - return newToken; - } - - // if the new token is older or the same, we keep the existing token. - lc.debug?.(`New token is older or the same, using existing token`); - return previousToken; +function isTransformAuthFailure(error: unknown): boolean { + if (!isProtocolError(error)) { + return false; } - // previousToken !== undefined but newToken is undefined - throw new ProtocolError({ - kind: ErrorKind.Unauthorized, - message: - 'No token provided. An unauthenticated client cannot connect to an authenticated client group.', - origin: ErrorOrigin.ZeroCache, - }); + return ( + error.errorBody.kind === ErrorKind.TransformFailed && + error.errorBody.reason === ErrorReason.HTTP && + (error.errorBody.status === 401 || error.errorBody.status === 403) + ); } /** diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.yield-during-advance.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.yield-during-advance.pg.test.ts index bb5b72a6f8..066dd36e1c 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.yield-during-advance.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.yield-during-advance.pg.test.ts @@ -52,9 +52,9 @@ describe('view-syncer/yield-during-advance', () => { wsID: 'ws1', baseCookie: null, protocolVersion: PROTOCOL_VERSION, - tokenData: undefined, httpCookie: undefined, origin: undefined, + userID: 'bar', }; afterEach(() => { diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.yield-during-hydrate.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.yield-during-hydrate.pg.test.ts index d4772159e6..71436eaaf1 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.yield-during-hydrate.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.yield-during-hydrate.pg.test.ts @@ -59,9 +59,9 @@ describe('view-syncer/yield-during-hydrate', () => { wsID: 'ws1', baseCookie: null, protocolVersion: PROTOCOL_VERSION, - tokenData: undefined, httpCookie: undefined, origin: undefined, + userID: 'bar', }; afterEach(() => { diff --git a/packages/zero-cache/src/workers/syncer-ws-message-handler.test.ts b/packages/zero-cache/src/workers/syncer-ws-message-handler.test.ts index b4e06ed0a1..09a5502e3c 100644 --- a/packages/zero-cache/src/workers/syncer-ws-message-handler.test.ts +++ b/packages/zero-cache/src/workers/syncer-ws-message-handler.test.ts @@ -1,5 +1,8 @@ -import {beforeEach, describe, expect, test, vi} from 'vitest'; +import {describe, expect, test, vi} from 'vitest'; import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; +import * as MutationType from '../../../zero-protocol/src/mutation-type-enum.ts'; +import {CRUD_MUTATION_NAME} from '../../../zero-protocol/src/push.ts'; +import type {Auth} from '../auth/auth.ts'; import type {Mutagen} from '../services/mutagen/mutagen.ts'; import type {Pusher} from '../services/mutagen/pusher.ts'; import type {ViewSyncer} from '../services/view-syncer/view-syncer.ts'; @@ -21,8 +24,43 @@ function createMockMutagen() { } as unknown as Mutagen; } -function createMockViewSyncer() { - return {} as unknown as ViewSyncer; +type MockViewSyncer = ViewSyncer & { + clearAuth: ReturnType; + updateAuth: ReturnType; +}; + +function createMockViewSyncer(initialAuth: Auth | undefined): MockViewSyncer { + let auth = initialAuth; + + return { + get auth() { + return auth; + }, + clearAuth: vi.fn(() => { + auth = undefined; + }), + updateAuth: vi.fn((...args: Parameters) => { + const [, msg] = args; + if (!msg[1].auth) { + if (auth) { + throw new Error( + 'No token provided. An unauthenticated client cannot connect to an authenticated client group.', + ); + } + auth = undefined; + return; + } + + auth = { + type: 'opaque', + raw: msg[1].auth, + }; + }), + changeDesiredQueries: vi.fn().mockResolvedValue(undefined), + deleteClients: vi.fn().mockResolvedValue([]), + initConnection: vi.fn(), + inspect: vi.fn().mockResolvedValue(undefined), + } as unknown as MockViewSyncer; } function createConnectParams( @@ -34,7 +72,7 @@ function createConnectParams( profileID: 'test-profile', wsID: 'test-ws', baseCookie: null, - protocolVersion: 30, + protocolVersion: 48, timestamp: Date.now(), lmID: 0, debugPerf: false, @@ -47,29 +85,29 @@ function createConnectParams( }; } -describe('SyncerWsMessageHandler push auth handling', () => { - let pusher: ReturnType; - let mutagen: ReturnType; - let viewSyncer: ReturnType; - - beforeEach(() => { - pusher = createMockPusher(); - mutagen = createMockMutagen(); - viewSyncer = createMockViewSyncer(); - }); +function createHandler( + viewSyncer: ViewSyncer, + mutagen: Mutagen, + pusher: Pusher, +) { + return new SyncerWsMessageHandler( + lc, + createConnectParams(), + viewSyncer, + mutagen, + pusher, + ); +} +describe('SyncerWsMessageHandler auth handling', () => { test('uses auth from push message when provided', async () => { - const connectionToken = 'old-connection-token'; - const freshPushToken = 'fresh-push-token'; - - const handler = new SyncerWsMessageHandler( - lc, - createConnectParams(), - {raw: connectionToken, decoded: {sub: 'user-1'}}, - viewSyncer, - mutagen, - pusher, - ); + const pusher = createMockPusher(); + const mutagen = createMockMutagen(); + const viewSyncer = createMockViewSyncer({ + type: 'opaque', + raw: 'old-token', + }); + const handler = createHandler(viewSyncer, mutagen, pusher); await handler.handleMessage([ 'push', @@ -89,31 +127,28 @@ describe('SyncerWsMessageHandler push auth handling', () => { schemaVersion: 1, timestamp: Date.now(), requestID: 'req-1', - auth: freshPushToken, // fresh auth sent with push + auth: 'fresh-token', }, ]); - // should use the fresh token from push, not the stale connection token + expect(viewSyncer.updateAuth).toHaveBeenCalledTimes(1); expect(pusher.enqueuePush).toHaveBeenCalledWith( 'test-client', expect.any(Object), - freshPushToken, // this is the key assertion + 'fresh-token', undefined, undefined, ); }); - test('falls back to connection token when push auth is not provided', async () => { - const connectionToken = 'connection-token'; - - const handler = new SyncerWsMessageHandler( - lc, - createConnectParams(), - {raw: connectionToken, decoded: {sub: 'user-1'}}, - viewSyncer, - mutagen, - pusher, - ); + test('falls back to existing auth when push auth is missing', async () => { + const pusher = createMockPusher(); + const mutagen = createMockMutagen(); + const viewSyncer = createMockViewSyncer({ + type: 'opaque', + raw: 'connection-token', + }); + const handler = createHandler(viewSyncer, mutagen, pusher); await handler.handleMessage([ 'push', @@ -133,30 +168,35 @@ describe('SyncerWsMessageHandler push auth handling', () => { schemaVersion: 1, timestamp: Date.now(), requestID: 'req-1', - // no auth field - should fall back to connection token }, ]); expect(pusher.enqueuePush).toHaveBeenCalledWith( 'test-client', expect.any(Object), - connectionToken, // falls back to connection token + 'connection-token', undefined, undefined, ); }); - test('handles undefined connection token with push auth', async () => { - const freshPushToken = 'fresh-push-token'; + test('updateAuth updates auth used by later push', async () => { + const pusher = createMockPusher(); + const mutagen = createMockMutagen(); + const viewSyncer = createMockViewSyncer({ + type: 'opaque', + raw: 'old-token', + }); + const handler = createHandler(viewSyncer, mutagen, pusher); - const handler = new SyncerWsMessageHandler( - lc, - createConnectParams(), - undefined, // no token data at connection time - viewSyncer, - mutagen, - pusher, - ); + await handler.handleMessage([ + 'updateAuth', + { + auth: 'new-token', + }, + ]); + + expect(viewSyncer.updateAuth).toHaveBeenCalledTimes(1); await handler.handleMessage([ 'push', @@ -176,29 +216,89 @@ describe('SyncerWsMessageHandler push auth handling', () => { schemaVersion: 1, timestamp: Date.now(), requestID: 'req-1', - auth: freshPushToken, }, ]); + expect(viewSyncer.auth?.raw).toBe('new-token'); expect(pusher.enqueuePush).toHaveBeenCalledWith( 'test-client', expect.any(Object), - freshPushToken, + 'new-token', undefined, undefined, ); }); - test('handles both undefined - no auth forwarded', async () => { - const handler = new SyncerWsMessageHandler( - lc, - createConnectParams(), - undefined, // no token data - viewSyncer, - mutagen, - pusher, + test('updateAuth with empty auth is rejected for authenticated client group', async () => { + const pusher = createMockPusher(); + const mutagen = createMockMutagen(); + const viewSyncer = createMockViewSyncer({ + type: 'opaque', + raw: 'old-token', + }); + const handler = createHandler(viewSyncer, mutagen, pusher); + + await expect( + handler.handleMessage([ + 'updateAuth', + { + auth: '', + }, + ]), + ).rejects.toThrow( + 'No token provided. An unauthenticated client cannot connect to an authenticated client group.', ); + expect(viewSyncer.auth?.raw).toBe('old-token'); + }); + + test('invalid push auth stops processing before enqueueing or mutating', async () => { + const pusher = createMockPusher(); + const mutagen = createMockMutagen(); + const viewSyncer = createMockViewSyncer(undefined); + const updateAuthSpy = vi + .spyOn(viewSyncer, 'updateAuth') + .mockRejectedValue(new Error('bad token')); + const handler = createHandler(viewSyncer, mutagen, pusher); + + await expect( + handler.handleMessage([ + 'push', + { + clientGroupID: 'test-client-group', + mutations: [ + { + type: 'custom', + id: 1, + clientID: 'test-client', + name: 'testMutation', + args: [], + timestamp: Date.now(), + }, + ], + pushVersion: 1, + schemaVersion: 1, + timestamp: Date.now(), + requestID: 'req-1', + auth: 'bad-token', + }, + ]), + ).rejects.toThrow('bad token'); + + expect(updateAuthSpy).toHaveBeenCalledTimes(1); + expect(pusher.enqueuePush).not.toHaveBeenCalled(); + expect(mutagen.processMutation).not.toHaveBeenCalled(); + }); + + test('push auth null does not clear auth used by pusher', async () => { + const pusher = createMockPusher(); + const mutagen = createMockMutagen(); + const viewSyncer = createMockViewSyncer({ + type: 'opaque', + raw: 'existing-token', + }); + const handler = createHandler(viewSyncer, mutagen, pusher); + await handler.handleMessage([ 'push', { @@ -217,16 +317,48 @@ describe('SyncerWsMessageHandler push auth handling', () => { schemaVersion: 1, timestamp: Date.now(), requestID: 'req-1', - // no auth field either }, ]); expect(pusher.enqueuePush).toHaveBeenCalledWith( 'test-client', expect.any(Object), - undefined, // both undefined = undefined + 'existing-token', undefined, undefined, ); }); + + test('rejects CRUD mutations when auth is opaque', async () => { + const pusher = createMockPusher(); + const mutagen = createMockMutagen(); + const viewSyncer = createMockViewSyncer({ + type: 'opaque', + raw: 'opaque-token', + }); + const handler = createHandler(viewSyncer, mutagen, pusher); + + await expect( + handler.handleMessage([ + 'push', + { + clientGroupID: 'test-client-group', + mutations: [ + { + type: MutationType.CRUD, + id: 1, + clientID: 'test-client', + name: CRUD_MUTATION_NAME, + args: [{ops: []}], + timestamp: Date.now(), + }, + ], + pushVersion: 1, + schemaVersion: 1, + timestamp: Date.now(), + requestID: 'req-1', + }, + ]), + ).rejects.toThrow('Only JWT auth is supported for CRUD mutations'); + }); }); diff --git a/packages/zero-cache/src/workers/syncer-ws-message-handler.ts b/packages/zero-cache/src/workers/syncer-ws-message-handler.ts index 5bfe0f25df..0191388f5d 100644 --- a/packages/zero-cache/src/workers/syncer-ws-message-handler.ts +++ b/packages/zero-cache/src/workers/syncer-ws-message-handler.ts @@ -1,7 +1,6 @@ import {trace} from '@opentelemetry/api'; import {Lock} from '@rocicorp/lock'; import type {LogContext} from '@rocicorp/logger'; -import type {JWTPayload} from 'jose'; import {startAsyncSpan, startSpan} from '../../../otel/src/span.ts'; import {version} from '../../../otel/src/version.ts'; import {assert, unreachable} from '../../../shared/src/asserts.ts'; @@ -11,10 +10,9 @@ import type {ErrorBody} from '../../../zero-protocol/src/error.ts'; import type {Upstream} from '../../../zero-protocol/src/up.ts'; import type {Mutagen} from '../services/mutagen/mutagen.ts'; import type {Pusher} from '../services/mutagen/pusher.ts'; -import type { - SyncContext, - TokenData, - ViewSyncer, +import { + type SyncContext, + type ViewSyncer, } from '../services/view-syncer/view-syncer.ts'; import type {ConnectParams} from './connect-params.ts'; import type {HandlerResult, MessageHandler} from './connection.ts'; @@ -26,17 +24,13 @@ export class SyncerWsMessageHandler implements MessageHandler { readonly #mutagen: Mutagen; readonly #mutationLock: Lock; readonly #lc: LogContext; - readonly #authData: JWTPayload | undefined; readonly #clientGroupID: string; readonly #syncContext: SyncContext; readonly #pusher: Pusher | undefined; - // Fallback token from connection time - prefer auth from push message - readonly #token: string | undefined; constructor( lc: LogContext, connectParams: ConnectParams, - tokenData: TokenData | undefined, viewSyncer: ViewSyncer, mutagen: Mutagen, pusher: Pusher | undefined, @@ -50,6 +44,7 @@ export class SyncerWsMessageHandler implements MessageHandler { protocolVersion, httpCookie, origin, + userID, } = connectParams; this.#viewSyncer = viewSyncer; this.#mutagen = mutagen; @@ -59,8 +54,6 @@ export class SyncerWsMessageHandler implements MessageHandler { .withContext('clientID', clientID) .withContext('clientGroupID', clientGroupID) .withContext('wsID', wsID); - this.#authData = tokenData?.decoded; - this.#token = tokenData?.raw; this.#clientGroupID = clientGroupID; this.#pusher = pusher; this.#syncContext = { @@ -69,9 +62,9 @@ export class SyncerWsMessageHandler implements MessageHandler { wsID, baseCookie, protocolVersion, - tokenData, httpCookie, origin, + userID, }; } @@ -91,7 +84,7 @@ export class SyncerWsMessageHandler implements MessageHandler { tracer, 'connection.push', async () => { - const {clientGroupID, mutations} = msg[1]; + const {clientGroupID, mutations, auth: pushAuth} = msg[1]; if (clientGroupID !== this.#clientGroupID) { return [ { @@ -107,6 +100,14 @@ export class SyncerWsMessageHandler implements MessageHandler { ]; } + // for backwards compatibility, if the push contains auth, we update it + if (pushAuth) { + await viewSyncer.updateAuth(this.#syncContext, [ + 'updateAuth', + {auth: pushAuth}, + ]); + } + if (mutations.length === 0) { return [ { @@ -123,19 +124,23 @@ export class SyncerWsMessageHandler implements MessageHandler { this.#pusher, 'A ZERO_MUTATE_URL must be set in order to process custom mutations.', ); - // prefer fresh auth from push message over cached connection token - const authToken = msg[1].auth ?? this.#token; return [ this.#pusher.enqueuePush( this.#syncContext.clientID, msg[1], - authToken, + viewSyncer.auth?.raw, this.#syncContext.httpCookie, this.#syncContext.origin, ), ]; } + const auth = viewSyncer.auth; + assert( + auth?.type !== 'opaque', + 'Only JWT auth is supported for CRUD mutations', + ); + // Hold a connection-level lock while processing mutations so that: // 1. Mutations are processed in the order in which they are received and // 2. A single view syncer connection cannot hog multiple upstream connections. @@ -144,7 +149,7 @@ export class SyncerWsMessageHandler implements MessageHandler { for (const mutation of mutations) { const maybeError = await this.#mutagen.processMutation( mutation, - this.#authData, + auth?.decoded, this.#pusher !== undefined, ); if (maybeError !== undefined) { @@ -169,6 +174,11 @@ export class SyncerWsMessageHandler implements MessageHandler { viewSyncer.changeDesiredQueries(this.#syncContext, msg), ); break; + case 'updateAuth': + await startAsyncSpan(tracer, 'connection.updateAuth', async () => { + await viewSyncer.updateAuth(this.#syncContext, msg); + }); + break; case 'deleteClients': { const deletedClientIDs = await startAsyncSpan( tracer, @@ -204,6 +214,7 @@ export class SyncerWsMessageHandler implements MessageHandler { this.#syncContext.wsID, msg[1].userPushURL, msg[1].userPushHeaders, + () => viewSyncer.clearAuth(), ), }); } diff --git a/packages/zero-cache/src/workers/syncer.test.ts b/packages/zero-cache/src/workers/syncer.test.ts index 245a314825..36ca62ed06 100644 --- a/packages/zero-cache/src/workers/syncer.test.ts +++ b/packages/zero-cache/src/workers/syncer.test.ts @@ -26,6 +26,7 @@ vi.mock('../server/anonymous-otel-start.ts', () => ({ })); import {LogContext} from '@rocicorp/logger'; +import {resolver} from '@rocicorp/resolver'; import fs from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; @@ -39,6 +40,7 @@ import { DatabaseStorage, } from '../../../zqlite/src/database-storage.ts'; import {Database} from '../../../zqlite/src/db.ts'; +import {AuthSessionImpl, type ValidateLegacyJWT} from '../auth/auth.ts'; import * as jwt from '../auth/jwt.ts'; import type {ZeroConfig} from '../config/zero-config.ts'; import { @@ -83,17 +85,40 @@ function makeFactories( const writeAuthzStorage = new DatabaseStorage(storageDb); return { - viewSyncerFactory: (id: string) => - ({ - id, - keepalive: () => true, - stop() { - return Promise.resolve(); - }, - run() { - return Promise.resolve(); - }, - }) as ViewSyncer & ActivityBasedService, + viewSyncerFactory: ( + id: string, + _sub: unknown, + _drainCoordinator: unknown, + validateLegacyJWT: ValidateLegacyJWT | undefined, + ) => + (() => { + const stopped = resolver(); + const authSession = new AuthSessionImpl(lc, id, validateLegacyJWT); + return { + id, + get auth() { + return authSession.auth; + }, + clearAuth: vi.fn(() => authSession.clear()), + initAuthSession: vi.fn( + (userID: string, wireAuth: string | undefined) => + authSession.update(userID, wireAuth), + ), + initConnection: vi.fn(), + changeDesiredQueries: vi.fn(), + deleteClients: vi.fn(), + inspect: vi.fn(), + updateAuth: vi.fn(), + keepalive: () => true, + stop() { + stopped.resolve(); + return stopped.promise; + }, + run() { + return stopped.promise; + }, + } as ViewSyncer & ActivityBasedService; + })(), mutagenFactory: (id: string) => { const ret = new MutagenService( lc, @@ -156,9 +181,9 @@ function makeParams(clientID: number, params: any = {}) { }; } -function openConnection(clientID: number, params: any = {}) { +async function openConnection(clientID: number, params: any = {}) { const ws = new MockWebSocket() as unknown as WebSocket; - receiver(ws, makeParams(clientID, params), {} as any); + await receiver(ws, makeParams(clientID, params), {} as any); return ws; } @@ -167,7 +192,11 @@ describe('cleanup', () => { let mutagens: MutagenService[]; let pushers: PusherService[]; beforeEach(() => { - const env = setupSyncer(lc, {} as ZeroConfig); + const env = setupSyncer(lc, { + auth: { + secret: 'test-secret', + }, + } as ZeroConfig); syncer = env.syncer; mutagens = env.mutagens; pushers = env.pushers; @@ -179,7 +208,7 @@ describe('cleanup', () => { const newConnection = (clientID: number) => openConnection(clientID); - test('bumps ref count when getting same service over and over', () => { + test('bumps ref count when getting same service over and over', async () => { const connections: WebSocket[] = []; function check() { expect(mutagens.length).toBe(1); @@ -189,7 +218,7 @@ describe('cleanup', () => { } for (let i = 0; i < 10; i++) { - connections.push(newConnection(i)); + connections.push(await newConnection(i)); check(); } @@ -203,7 +232,7 @@ describe('cleanup', () => { expect(pushers.length).toBe(1); }); - test('decrements ref count on connection close, returns new instance on next connection if ref count is 0', () => { + test('decrements ref count on connection close, returns new instance on next connection if ref count is 0', async () => { function check(iteration: number) { expect(mutagens.length).toBe(iteration + 1); expect(pushers.length).toBe(iteration + 1); @@ -213,13 +242,13 @@ describe('cleanup', () => { } for (let i = 0; i < 10; i++) { - const ws = newConnection(i); + const ws = await newConnection(i); ws.close(); check(i); } }); - test('handles same client coming back on different connections', () => { + test('handles same client coming back on different connections', async () => { function check(iteration: number) { expect(mutagens.length).toBe(iteration + 1); expect(pushers.length).toBe(iteration + 1); @@ -236,7 +265,7 @@ describe('cleanup', () => { } for (let i = 0; i < 10; i++) { - newConnection(1); + await newConnection(1); check(i); } }); @@ -247,7 +276,11 @@ describe('connection telemetry', () => { beforeEach(() => { vi.clearAllMocks(); - const env = setupSyncer(lc, {} as ZeroConfig); + const env = setupSyncer(lc, { + auth: { + secret: 'test-secret', + }, + } as ZeroConfig); syncer = env.syncer; }); @@ -258,30 +291,30 @@ describe('connection telemetry', () => { const newConnection = (clientID: number, params: any = {}) => openConnection(clientID, params); - test('should record connection success for valid protocol version', () => { + test('should record connection success for valid protocol version', async () => { // Create a connection with valid protocol version - newConnection(1); + await newConnection(1); // Should record connection success expect(vi.mocked(recordConnectionSuccess)).toHaveBeenCalledTimes(1); }); - test('should record multiple successful connections', () => { + test('should record multiple successful connections', async () => { // Create multiple connections with valid protocol version - newConnection(1); - newConnection(2); - newConnection(3); + await newConnection(1); + await newConnection(2); + await newConnection(3); // Should record multiple connection successes expect(vi.mocked(recordConnectionSuccess)).toHaveBeenCalledTimes(3); }); - test('should record connection attempted for each connection', () => { + test('should record connection attempted for each connection', async () => { // Create connections - both should record attempts // supported protocol version - newConnection(1); + await newConnection(1); // unsupported protocol version - newConnection(2, {protocolVersion: 21}); + await newConnection(2, {protocolVersion: 21}); // Should record connection attempts expect(vi.mocked(recordConnectionAttempted)).toHaveBeenCalledTimes(2); @@ -367,11 +400,20 @@ describe('jwt auth without options', () => { await syncer.stop(); }); - const newConnection = (clientID: number, params: any = {}) => - openConnection(clientID, params); - - test('succeeds when using mutations & queries and skips verification', () => { - const ws = newConnection(1, {auth: 'dummy-token'}); + test('succeeds when using mutations & queries and skips verification', async () => { + const ws = new MockWebSocket() as unknown as WebSocket; + await receiver( + ws, + { + clientGroupID: '1', + clientID: '1', + userID: 'anon', + wsID: '1', + protocolVersion: 30, + auth: 'dummy-token', + }, + {} as any, + ); expect(vi.mocked(recordConnectionAttempted)).toHaveBeenCalledTimes(1); expect(vi.mocked(recordConnectionSuccess)).toHaveBeenCalledTimes(1); @@ -410,6 +452,19 @@ describe('jwt auth missing options and missing endpoints', () => { await syncer.stop(); }); + test('succeeds when no auth token is provided', async () => { + const ws = await openConnection(1); + + expect(vi.mocked(recordConnectionAttempted)).toHaveBeenCalledTimes(1); + expect(vi.mocked(recordConnectionSuccess)).toHaveBeenCalledTimes(1); + + expect((ws as unknown as MockWebSocket).readyState).toBe( + MockWebSocket.OPEN, + ); + expect(mutagens.length).toBe(1); + expect(pushers.length).toBe(1); + }); + test('fails when no JWT options and no custom endpoints are set', async () => { const ws = new MockWebSocket() as unknown as WebSocket; await expect( @@ -441,6 +496,7 @@ describe('connection hijacking prevention', () => { beforeEach(() => { vi.clearAllMocks(); verifySpy = vi.spyOn(jwt, 'verifyToken'); + verifySpy.mockReset(); const env = setupSyncer(lc, { auth: { secret: 'test-secret', @@ -454,7 +510,7 @@ describe('connection hijacking prevention', () => { }); test('invalid auth does not close existing connection', async () => { - // First, establish a legitimate connection (no auth required for initial connection) + // First, establish a legitimate unauthenticated connection const existingWs = new MockWebSocket() as unknown as WebSocket; await receiver( existingWs, @@ -464,7 +520,7 @@ describe('connection hijacking prevention', () => { userID: 'legit-user', wsID: 'ws-1', protocolVersion: 30, - // No auth token - simulates an existing open connection + // No auth token - existing unauthenticated connection }, {} as any, ); @@ -543,6 +599,81 @@ describe('connection hijacking prevention', () => { MockWebSocket.OPEN, ); }); + + test('rejects missing auth on reconnect for authenticated client group', async () => { + verifySpy.mockResolvedValueOnce({sub: 'user-1'}); + const firstWs = new MockWebSocket() as unknown as WebSocket; + await receiver( + firstWs, + { + clientGroupID: '1', + clientID: 'client-1', + userID: 'user-1', + wsID: 'ws-1', + protocolVersion: 30, + auth: 'valid-token', + }, + {} as any, + ); + expect((firstWs as unknown as MockWebSocket).readyState).toBe( + MockWebSocket.OPEN, + ); + + const reconnectWs = new MockWebSocket() as unknown as WebSocket; + await receiver( + reconnectWs, + { + clientGroupID: '1', + clientID: 'client-2', + userID: 'user-1', + wsID: 'ws-2', + protocolVersion: 30, + }, + {} as any, + ); + + expect((reconnectWs as unknown as MockWebSocket).readyState).toBe( + MockWebSocket.CLOSED, + ); + expect((firstWs as unknown as MockWebSocket).readyState).toBe( + MockWebSocket.OPEN, + ); + }); + + test('retains user binding until view syncer expires', async () => { + verifySpy.mockResolvedValueOnce({sub: 'user-1'}); + const firstWs = new MockWebSocket() as unknown as WebSocket; + await receiver( + firstWs, + { + clientGroupID: '1', + clientID: 'client-1', + userID: 'user-1', + wsID: 'ws-1', + protocolVersion: 30, + auth: 'valid-token', + }, + {} as any, + ); + firstWs.close(); + + const reconnectWs = new MockWebSocket() as unknown as WebSocket; + await receiver( + reconnectWs, + { + clientGroupID: '1', + clientID: 'client-2', + userID: 'user-2', + wsID: 'ws-2', + protocolVersion: 30, + }, + {} as any, + ); + + expect((reconnectWs as unknown as MockWebSocket).readyState).toBe( + MockWebSocket.CLOSED, + ); + }); }); afterAll(async () => { diff --git a/packages/zero-cache/src/workers/syncer.ts b/packages/zero-cache/src/workers/syncer.ts index 9508694a65..20b248c840 100644 --- a/packages/zero-cache/src/workers/syncer.ts +++ b/packages/zero-cache/src/workers/syncer.ts @@ -1,12 +1,10 @@ import type {LogContext} from '@rocicorp/logger'; import {resolver} from '@rocicorp/resolver'; -import {type JWTPayload} from 'jose'; import {pid} from 'node:process'; import type {MessagePort} from 'node:worker_threads'; import {WebSocketServer, type ServerOptions, type WebSocket} from 'ws'; import {promiseVoid} from '../../../shared/src/resolved-promises.ts'; -import {ErrorKind} from '../../../zero-protocol/src/error-kind.ts'; -import {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts'; +import {type ValidateLegacyJWT} from '../auth/auth.ts'; import {tokenConfigOptions, verifyToken} from '../auth/jwt.ts'; import {type ZeroConfig} from '../config/zero-config.ts'; import { @@ -90,6 +88,7 @@ export class Syncer implements SingletonService { id: string, sub: Subscription, drainCoordinator: DrainCoordinator, + validateLegacyJWT: ValidateLegacyJWT | undefined, ) => ViewSyncer & ActivityBasedService, mutagenFactory: (id: string) => Mutagen & Service, pusherFactory: ((id: string) => Pusher & Service) | undefined, @@ -104,7 +103,13 @@ export class Syncer implements SingletonService { this.#lc = lc; this.#viewSyncers = new ServiceRunner( lc, - id => viewSyncerFactory(id, notifier.subscribe(), this.#drainCoordinator), + id => + viewSyncerFactory( + id, + notifier.subscribe(), + this.#drainCoordinator, + this.#validateLegacyJWT(), + ), v => v.keepalive(), ); this.#mutagens = new ServiceRunner(lc, mutagenFactory, m => m.hasRefs()); @@ -132,12 +137,10 @@ export class Syncer implements SingletonService { ); recordConnectionAttempted(); const {clientID, clientGroupID, auth, userID} = params; + const hasProvidedAuth = auth !== undefined && auth !== ''; - // Verify JWT BEFORE touching existing connections - prevents unauthenticated - // attackers from force-disconnecting legitimate users via DoS - let decodedToken: JWTPayload | undefined; - if (auth) { - const tokenOptions = tokenConfigOptions(this.#config.auth); + if (hasProvidedAuth) { + const tokenOptions = tokenConfigOptions(this.#config.auth ?? {}); const hasPushOrMutate = this.#config?.push?.url !== undefined || @@ -156,38 +159,17 @@ export class Syncer implements SingletonService { '. You may also set both ZERO_MUTATE_URL and ZERO_QUERY_URL to enable custom mutations and queries without passing token verification options.', ); } + } - if (tokenOptions.length > 0) { - try { - decodedToken = await verifyToken(this.#config.auth, auth, { - subject: userID, - ...(this.#config.auth.issuer && { - issuer: this.#config.auth.issuer, - }), - ...(this.#config.auth.audience && { - audience: this.#config.auth.audience, - }), - }); - this.#lc.debug?.( - `Received auth token [redacted...${auth.slice(-8)}] for clientID ${clientID}`, - ); - } catch (e) { - sendError( - this.#lc, - ws, - { - kind: ErrorKind.AuthInvalidated, - message: `Failed to decode auth token: ${String(e)}`, - origin: ErrorOrigin.ZeroCache, - }, - e, - ); - ws.close(3000, 'Failed to decode JWT'); - return; - } - } - } else { - this.#lc.debug?.(`No auth token received for clientID ${clientID}`); + const viewSyncer = this.#viewSyncers.getService(clientGroupID); + + // Verify JWT BEFORE touching existing connections - prevents unauthenticated + // attackers from force-disconnecting legitimate users via DoS + const authResult = await viewSyncer.initAuthSession(userID, auth); + if (!authResult.ok) { + sendError(this.#lc, ws, authResult.error); + ws.close(3000, authResult.error.message); + return; } // Only check for and close existing connections AFTER auth is validated @@ -214,13 +196,7 @@ export class Syncer implements SingletonService { new SyncerWsMessageHandler( this.#lc, params, - auth - ? { - raw: auth, - decoded: decodedToken ?? {}, - } - : undefined, - this.#viewSyncers.getService(clientGroupID), + viewSyncer, mutagen, pusher, ), @@ -292,4 +268,27 @@ export class Syncer implements SingletonService { this.#stopped.resolve(); return promiseVoid; } + + /** @deprecated used in JWT validation */ + #validateLegacyJWT(): ValidateLegacyJWT | undefined { + const tokenOptions = tokenConfigOptions(this.#config.auth ?? {}); + if (tokenOptions.length !== 1) { + return undefined; + } + + return async (token, {userID}) => { + const decoded = await verifyToken(this.#config.auth, token, { + subject: userID, + ...(this.#config.auth?.issuer && {issuer: this.#config.auth.issuer}), + ...(this.#config.auth?.audience && { + audience: this.#config.auth.audience, + }), + }); + return { + type: 'jwt', + raw: token, + decoded, + }; + }; + } } diff --git a/packages/zero-client/src/client/options.ts b/packages/zero-client/src/client/options.ts index adec8ace1f..82079f3a4f 100644 --- a/packages/zero-client/src/client/options.ts +++ b/packages/zero-client/src/client/options.ts @@ -41,12 +41,15 @@ export interface ZeroOptions< * * Set `auth` to `null` or `undefined` if there is no logged in user. * + * The call to `connect` is handled automatically by the ZeroProvider component + * for React and SolidJS when the `auth` prop changes. + * + * When `auth` changes while connected, Zero refreshes server-side auth context + * and re-transforms queries without reconnecting. + * * When a 401 or 403 HTTP status code is received from your server, Zero will * transition to the `needs-auth` connection state. The app should call * `zero.connection.connect({auth: newToken})` with a new token to reconnect. - * - * The call to `connect` is handled automatically by the ZeroProvider component - * for React and SolidJS when the `auth` prop changes. */ auth?: string | null | undefined; diff --git a/packages/zero-client/src/client/protocol-version-url.test.ts b/packages/zero-client/src/client/protocol-version-url.test.ts index 71c05924e2..9413126ed5 100644 --- a/packages/zero-client/src/client/protocol-version-url.test.ts +++ b/packages/zero-client/src/client/protocol-version-url.test.ts @@ -34,5 +34,5 @@ test('When the URL changes we need to update the protocol version', async () => // might not understand it. You may need to bump the PROTOCOL_VERSION and // update the expected values. expect(hash).toBe('10r2tfvet9a3s'); - expect(PROTOCOL_VERSION).toBe(47); + expect(PROTOCOL_VERSION).toBe(48); }); diff --git a/packages/zero-client/src/client/zero.auth.test.ts b/packages/zero-client/src/client/zero.auth.test.ts new file mode 100644 index 0000000000..677f3d5f33 --- /dev/null +++ b/packages/zero-client/src/client/zero.auth.test.ts @@ -0,0 +1,117 @@ +import {afterEach, beforeEach, expect, test, vi} from 'vitest'; +import * as valita from '../../../shared/src/valita.ts'; +import {decodeSecProtocols} from '../../../zero-protocol/src/connect.ts'; +import {ErrorKind} from '../../../zero-protocol/src/error-kind.ts'; +import {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts'; +import {updateAuthMessageSchema} from '../../../zero-protocol/src/update-auth.ts'; +import {ConnectionStatus} from './connection-status.ts'; +import {MockSocket, zeroForTest} from './test-utils.ts'; + +beforeEach(() => { + vi.stubGlobal('WebSocket', MockSocket as unknown as typeof WebSocket); +}); + +afterEach(() => { + vi.restoreAllMocks(); +}); + +test('connect({auth: null}) does not send auth', async () => { + const z = zeroForTest(); + await z.triggerConnected(); + + const socket = await z.socket; + socket.messages.length = 0; + + await z.connection.connect({auth: null}); + + expect(socket.messages).toHaveLength(0); +}); + +test('connect({auth}) sends updateAuth set', async () => { + const z = zeroForTest(); + await z.triggerConnected(); + + const socket = await z.socket; + socket.messages.length = 0; + + await z.connection.connect({auth: 'next-token'}); + + expect(socket.messages).toHaveLength(1); + const msg = valita.parse( + JSON.parse(socket.messages[0]), + updateAuthMessageSchema, + ); + expect(msg).toEqual(['updateAuth', {auth: 'next-token'}]); +}); + +test('sends updateAuth even when auth changes', async () => { + const z = zeroForTest({auth: 'test-auth'}); + await z.triggerConnected(); + + const socket = await z.socket; + socket.messages.length = 0; + + await z.connection.connect({auth: 'test-auth'}); + + expect(socket.messages).toHaveLength(1); + const msg = valita.parse( + JSON.parse(socket.messages[0]), + updateAuthMessageSchema, + ); + expect(msg).toEqual(['updateAuth', {auth: 'test-auth'}]); +}); + +test('auth set while needs-auth is carried in next handshake', async () => { + const z = zeroForTest({auth: 'initial-token'}); + await z.triggerConnected(); + + await z.triggerError({ + kind: ErrorKind.Unauthorized, + message: 'auth error', + origin: ErrorOrigin.ZeroCache, + }); + await z.waitForConnectionStatus(ConnectionStatus.NeedsAuth); + + await z.connection.connect({auth: 'next-token'}); + const socket = await z.socket; + expect(decodeSecProtocols(socket.protocol).authToken).toBe('next-token'); +}); + +test('updated auth is sent once and reused for later reconnect handshakes', async () => { + const z = zeroForTest({auth: 'initial-token'}); + await z.triggerConnected(); + + await z.triggerError({ + kind: ErrorKind.Unauthorized, + message: 'auth error', + origin: ErrorOrigin.ZeroCache, + }); + await z.waitForConnectionStatus(ConnectionStatus.NeedsAuth); + + await z.connection.connect({auth: 'token-1'}); + let socket = await z.socket; + expect(decodeSecProtocols(socket.protocol).authToken).toBe('token-1'); + + await z.triggerConnected(); + socket.messages.length = 0; + + await z.connection.connect({auth: 'token-2'}); + + expect(socket.messages).toHaveLength(1); + const msg = valita.parse( + JSON.parse(socket.messages[0]), + updateAuthMessageSchema, + ); + expect(msg).toEqual(['updateAuth', {auth: 'token-2'}]); + + await z.triggerError({ + kind: ErrorKind.Unauthorized, + message: 'auth error again', + origin: ErrorOrigin.ZeroCache, + }); + await z.waitForConnectionStatus(ConnectionStatus.NeedsAuth); + + await z.connection.connect(); + socket = await z.socket; + expect(decodeSecProtocols(socket.protocol).authToken).toBe('token-2'); +}); diff --git a/packages/zero-client/src/client/zero.test.ts b/packages/zero-client/src/client/zero.test.ts index 237eab817e..b5ea08af4b 100644 --- a/packages/zero-client/src/client/zero.test.ts +++ b/packages/zero-client/src/client/zero.test.ts @@ -4175,7 +4175,6 @@ test('custom mutations get pushed', async () => { [ 'push', { - auth: 'test-auth', timestamp: 1678829450000, clientGroupID: await z.clientGroupID, mutations: [ @@ -4194,7 +4193,6 @@ test('custom mutations get pushed', async () => { [ 'push', { - auth: 'test-auth', timestamp: 1678829450000, clientGroupID: await z.clientGroupID, mutations: [ @@ -4213,7 +4211,6 @@ test('custom mutations get pushed', async () => { [ 'push', { - auth: 'test-auth', timestamp: 1678829450000, clientGroupID: await z.clientGroupID, mutations: [ diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index 938e167cf1..fd5883bcd5 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -1857,8 +1857,6 @@ export class Zero< mutations: [zeroM], pushVersion: req.pushVersion, requestID, - // include fresh auth with each push to avoid stale token issues - auth: fromReplicacheAuthToken(this.#rep.auth), }, ]; send(socket, msg); @@ -2235,6 +2233,10 @@ export class Zero< */ #setAuth(auth: string | undefined | null): void { this.#rep.auth = toReplicacheAuthToken(auth); + + if (auth) { + this.#send(['updateAuth', {auth}]); + } } /** diff --git a/packages/zero-protocol/src/ast.test.ts b/packages/zero-protocol/src/ast.test.ts index bc07c233c5..6352530d01 100644 --- a/packages/zero-protocol/src/ast.test.ts +++ b/packages/zero-protocol/src/ast.test.ts @@ -607,5 +607,5 @@ test('protocol version', () => { // old code will not understand the new schema, bump the // PROTOCOL_VERSION and update the expected values. expect(hash).toEqual('1b4tkghe24u7q'); - expect(PROTOCOL_VERSION).toBe(47); + expect(PROTOCOL_VERSION).toBe(48); }); diff --git a/packages/zero-protocol/src/mod.ts b/packages/zero-protocol/src/mod.ts index 9d6c0e6e65..426d4abe69 100644 --- a/packages/zero-protocol/src/mod.ts +++ b/packages/zero-protocol/src/mod.ts @@ -11,4 +11,5 @@ export * from './push.ts'; export * from './queries-patch.ts'; export * from './row-patch.ts'; export * from './up.ts'; +export * from './update-auth.ts'; export * from './version.ts'; diff --git a/packages/zero-protocol/src/protocol-version.test.ts b/packages/zero-protocol/src/protocol-version.test.ts index 3a9f89335a..563454a3b4 100644 --- a/packages/zero-protocol/src/protocol-version.test.ts +++ b/packages/zero-protocol/src/protocol-version.test.ts @@ -11,6 +11,6 @@ test('protocol version', () => { // If this test fails upstream or downstream schema has changed such that // old code will not understand the new schema, bump the // PROTOCOL_VERSION and update the expected values. - expect(hash).toEqual('7uu5tlrbke7p'); - expect(PROTOCOL_VERSION).toBe(47); + expect(hash).toEqual('2vvhsgs7kt1fg'); + expect(PROTOCOL_VERSION).toBe(48); }); diff --git a/packages/zero-protocol/src/protocol-version.ts b/packages/zero-protocol/src/protocol-version.ts index 3c1b47f2cc..675e0f1f2a 100644 --- a/packages/zero-protocol/src/protocol-version.ts +++ b/packages/zero-protocol/src/protocol-version.ts @@ -53,7 +53,8 @@ import {assert} from '../../shared/src/asserts.ts'; // -- version 45 adds userPushHeaders and userQueryHeaders to initConnection (0.25) // -- version 46 adds scalarSubquery condition type to AST // -- version 47 adds optional auth token to push body -export const PROTOCOL_VERSION = 47; +// -- version 48 adds updateAuth +export const PROTOCOL_VERSION = 48; /** * The minimum server-supported sync protocol version (i.e. the version diff --git a/packages/zero-protocol/src/push.ts b/packages/zero-protocol/src/push.ts index 0b39266623..c570584e22 100644 --- a/packages/zero-protocol/src/push.ts +++ b/packages/zero-protocol/src/push.ts @@ -125,8 +125,10 @@ export const pushBodySchema = v.object({ schemaVersion: v.number().optional(), timestamp: v.number(), requestID: v.string(), - // Fresh auth token sent with each push - used instead of cached connection token - // to avoid expired token issues when pushing to upstream API + /** + * @deprecated auth is managed at client-group scope via connect/updateAuth + * and should not be included in push messages. + */ auth: v.string().optional(), }); diff --git a/packages/zero-protocol/src/up.ts b/packages/zero-protocol/src/up.ts index cdab42c34f..6216415321 100644 --- a/packages/zero-protocol/src/up.ts +++ b/packages/zero-protocol/src/up.ts @@ -7,6 +7,7 @@ import {inspectUpMessageSchema} from './inspect-up.ts'; import {pingMessageSchema} from './ping.ts'; import {pullRequestMessageSchema} from './pull.ts'; import {ackMutationResponsesMessageSchema, pushMessageSchema} from './push.ts'; +import {updateAuthMessageSchema} from './update-auth.ts'; export const upstreamSchema = v.union( initConnectionMessageSchema, @@ -14,6 +15,7 @@ export const upstreamSchema = v.union( deleteClientsMessageSchema, changeDesiredQueriesMessageSchema, pullRequestMessageSchema, + updateAuthMessageSchema, pushMessageSchema, closeConnectionMessageSchema, inspectUpMessageSchema, diff --git a/packages/zero-protocol/src/update-auth.ts b/packages/zero-protocol/src/update-auth.ts new file mode 100644 index 0000000000..ed89427f59 --- /dev/null +++ b/packages/zero-protocol/src/update-auth.ts @@ -0,0 +1,13 @@ +import * as v from '../../shared/src/valita.ts'; + +const updateAuthBodySchema = v.object({ + auth: v.string(), +}); + +export const updateAuthMessageSchema = v.tuple([ + v.literal('updateAuth'), + updateAuthBodySchema, +]); + +export type UpdateAuthBody = v.Infer; +export type UpdateAuthMessage = v.Infer; From 7eaefdfc68005474756c28d7d3463e01f96fb989 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 12 Feb 2026 11:50:03 -0800 Subject: [PATCH 050/495] chore(zero-cache): resurrect integration tests (#5546) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refresh and resurrect zero-cache integration tests when run locally. They are still disabled in the CI because of a hard-to-track-down unhandled rejection when the test pg databases are shutdown. But until that's tracked down, the tests are still valuable to run locally. Otherwise they rot and diverge from what will actually pass. ``` ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ PostgresError: terminating connection due to administrator command ❯ ErrorResponse node_modules/postgres/src/connection.js:794:26 ❯ handle node_modules/postgres/src/connection.js:480:6 ❯ Socket.data node_modules/postgres/src/connection.js:315:9 ❯ Socket.emit node:events:508:28 ❯ addChunk node:internal/streams/readable:559:12 ❯ readableAddChunkPushByteMode node:internal/streams/readable:510:3 ❯ Socket.Readable.push node:internal/streams/readable:390:5 ❯ TCP.onStreamRead node:internal/stream_base_commons:189:23 ``` --- .../src/integration/integration.pg.test.ts | 136 +++++++----------- 1 file changed, 48 insertions(+), 88 deletions(-) diff --git a/packages/zero-cache/src/integration/integration.pg.test.ts b/packages/zero-cache/src/integration/integration.pg.test.ts index 7e38745c50..279429cbb8 100644 --- a/packages/zero-cache/src/integration/integration.pg.test.ts +++ b/packages/zero-cache/src/integration/integration.pg.test.ts @@ -12,7 +12,6 @@ import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts' import {Queue} from '../../../shared/src/queue.ts'; import {randInt} from '../../../shared/src/rand.ts'; import type {AST} from '../../../zero-protocol/src/ast.ts'; -import type {ChangeDesiredQueriesMessage} from '../../../zero-protocol/src/change-desired-queries.ts'; import type {InitConnectionMessage} from '../../../zero-protocol/src/connect.ts'; import type {PokeStartMessage} from '../../../zero-protocol/src/poke.ts'; import {PROTOCOL_VERSION} from '../../../zero-protocol/src/protocol-version.ts'; @@ -468,6 +467,7 @@ describe('integration', {timeout: 30000}, () => { ['ZERO_CHANGE_DB']: getConnectionURI(changeDB), ['ZERO_REPLICA_FILE']: replicaDbFile.path, ['ZERO_NUM_SYNC_WORKERS']: '1', + ['ZERO_ADMIN_PASSWORD']: '2p49fqnaivnepr', }; return async () => { @@ -500,11 +500,6 @@ describe('integration', {timeout: 30000}, () => { ], }; - const NOPK_QUERY: AST = { - table: 'nopk', - orderBy: [['id', 'asc']], - }; - // One or two zero-caches (i.e. multi-node) type Envs = [NodeJS.ProcessEnv] | [NodeJS.ProcessEnv, NodeJS.ProcessEnv]; @@ -550,7 +545,7 @@ describe('integration', {timeout: 30000}, () => { const WATERMARK_REGEX = /[0-9a-z]{4,}/; - test.skip.each([ + test.for([ ['single-node', 'pg', () => [env], undefined], ['replica identity full', 'pg', () => [env], 'FULL'], [ @@ -587,6 +582,7 @@ describe('integration', {timeout: 30000}, () => { ...env, ['ZERO_PORT']: `${port2}`, ['ZERO_NUM_SYNC_WORKERS']: '0', + ['ZERO_CHANGE_STREAMER_STARTUP_DELAY_MS']: '0', }, // startZero() will then copy to replicaDbFile2 for the view-syncer { @@ -626,6 +622,7 @@ describe('integration', {timeout: 30000}, () => { ...env, ['ZERO_PORT']: `${port2}`, ['ZERO_NUM_SYNC_WORKERS']: '0', + ['ZERO_CHANGE_STREAMER_STARTUP_DELAY_MS']: '0', }, // startZero() will then copy to replicaDbFile2 for the view-syncer { @@ -651,7 +648,25 @@ describe('integration', {timeout: 30000}, () => { ], ] satisfies [string, 'pg' | 'custom', () => Envs, 'FULL' | undefined][])( '%s (%s)', - async (_name, backend, makeEnvs, replicaIdentity) => { + async ([_name, backend, makeEnvs, replicaIdentity], {skip}) => { + if (process.env.CI) { + // TODO: Track down this unhandled rejection that regularly happens + // when the test pg instances are shut down, particularly when + // running the test with concurrently pg versions. + // Then re-enable the test in the CI. + // + // ----⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + // PostgresError: terminating connection due to administrator command + // ❯ ErrorResponse node_modules/postgres/src/connection.js:794:26 + // ❯ handle node_modules/postgres/src/connection.js:480:6 + // ❯ Socket.data node_modules/postgres/src/connection.js:315:9 + // ❯ Socket.emit node:events:508:28 + // ❯ addChunk node:internal/streams/readable:559:12 + // ❯ readableAddChunkPushByteMode node:internal/streams/readable:510:3 + // ❯ Socket.Readable.push node:internal/streams/readable:390:5 + // ❯ TCP.onStreamRead node:internal/stream_base_commons:189:23 + skip(); + } if (backend === 'pg') { await upDB.unsafe(initialPGSetup(replicaIdentity)); } @@ -674,6 +689,18 @@ describe('integration', {timeout: 30000}, () => { desiredQueriesPatch: [ {op: 'put', hash: 'query-hash1', ast: FOO_QUERY}, ], + clientSchema: { + tables: { + foo: { + primaryKey: ['id'], + columns: {id: {type: 'string'}}, + }, + ['boo.far']: { + primaryKey: ['id'], + columns: {id: {type: 'string'}}, + }, + }, + }, }, ] satisfies InitConnectionMessage), ), @@ -683,14 +710,6 @@ describe('integration', {timeout: 30000}, () => { 'connected', {wsid: '123'}, ]); - expect(await downstream.dequeue()).toMatchObject([ - 'pokeStart', - {pokeID: '00'}, - ]); - expect(await downstream.dequeue()).toMatchObject([ - 'pokeEnd', - {pokeID: '00'}, - ]); expect(await downstream.dequeue()).toMatchObject([ 'pokeStart', {pokeID: '00:01'}, @@ -817,6 +836,19 @@ describe('integration', {timeout: 30000}, () => { { pokeID: WATERMARK_REGEX, rowsPatch: [ + { + op: 'put', + tableName: 'foo', + value: { + id: 'voo', + ['far_id']: 'doo', + b: null, + j1: 'foo', + j2: false, + ['j.3']: 456.789, + j4: {bar: 'baz'}, + }, + }, { op: 'put', tableName: 'foo', @@ -838,19 +870,6 @@ describe('integration', {timeout: 30000}, () => { op: 'del', tableName: 'boo.far', }, - { - op: 'put', - tableName: 'foo', - value: { - id: 'voo', - ['far_id']: 'doo', - b: null, - j1: 'foo', - j2: false, - ['j.3']: 456.789, - j4: {bar: 'baz'}, - }, - }, ], }, ]); @@ -961,65 +980,6 @@ describe('integration', {timeout: 30000}, () => { // "changeDesiredQueries" to succeed). await expectNoPokes(downstream); - // Now that nopk has a unique index, add a query to retrieve the data. - ws.send( - JSON.stringify([ - 'changeDesiredQueries', - { - desiredQueriesPatch: [ - {op: 'put', hash: 'query-hash2', ast: NOPK_QUERY}, - ], - }, - ] satisfies ChangeDesiredQueriesMessage), - ); - - // poke confirming the query registration. - expect(await downstream.dequeue()).toMatchObject([ - 'pokeStart', - {pokeID: WATERMARK_REGEX}, - ]); - expect(await downstream.dequeue()).toMatchObject([ - 'pokePart', - { - pokeID: WATERMARK_REGEX, - desiredQueriesPatches: { - def: [{op: 'put', hash: 'query-hash2'}], - }, - }, - ]); - expect(await downstream.dequeue()).toMatchObject([ - 'pokeEnd', - {pokeID: WATERMARK_REGEX}, - ]); - - // poke containing the row data. - expect(await downstream.dequeue()).toMatchObject([ - 'pokeStart', - {pokeID: WATERMARK_REGEX}, - ]); - expect(await downstream.dequeue()).toMatchObject([ - 'pokePart', - { - pokeID: WATERMARK_REGEX, - rowsPatch: [ - { - op: 'put', - tableName: 'nopk', - value: {id: 'bar', val: 'baz'}, - }, - { - op: 'put', - tableName: 'nopk', - value: {id: 'foo', val: 'bar'}, - }, - ], - }, - ]); - expect(await downstream.dequeue()).toMatchObject([ - 'pokeEnd', - {pokeID: WATERMARK_REGEX}, - ]); - await testInvalidRequestHandling(); }, ); From a40a69b26abf4a0e99c4dc80a5cea50b31e7eb27 Mon Sep 17 00:00:00 2001 From: Alp Karavil Date: Thu, 12 Feb 2026 15:25:11 -0500 Subject: [PATCH 051/495] feat(zql): make applyChange immutable for React.memo optimization (#5462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Immutable `applyChange` with O(N + K) Batching Makes `applyChange` return new objects instead of mutating in place. Unchanged rows keep their object reference, changed rows get new references. This lets React.memo and Solid reactivity actually work. Right now Zero deep clones every snapshot because `applyChange` mutates in place. Every row gets a new reference on every sync, even if nothing changed. ``` Current behavior (mutable + deepClone): DB: UPDATE row A Consumer receives snapshot ┌──────────────┐ ┌──────────────────────────┐ │ A = "new" │ │ A' ← new ref (changed) │ │ B = "same" │ ────► │ B' ← new ref (unchanged) │ ← React.memo fails │ C = "same" │ │ C' ← new ref (unchanged) │ ← everything re-renders └──────────────┘ └──────────────────────────┘ ``` With immutable `applyChange`, unchanged rows keep their reference: ``` New behavior (immutable): DB: UPDATE row A Consumer receives snapshot ┌──────────────┐ ┌──────────────────────────┐ │ A = "new" │ │ A' ← new ref (changed) │ ← re-render │ B = "same" │ ────► │ B ← same ref │ ← memo skips │ C = "same" │ │ C ← same ref │ ← memo skips └──────────────┘ └──────────────────────────┘ ``` ## Performance Started with a naive immutable implementation. @tantaman pointed out it was O(K × N) for K changes to an N-item array: ``` Naive immutable (O(K × N)): push(change₁) ──► [...array] ─┐ push(change₂) ──► [...array] │ K rebuilds push(change₃) ──► [...array] │ of N items ... │ push(changeₖ) ──► [...array] ─┘ ``` Ran benchmarks, it was ~4x slower at scale. Still under 0.1ms but felt like we could do better. Tried batching but hit a blocker: tests expected `.data` to reflect changes immediately after `push()`. Solution: auto-flush in the `.data` getter. ``` Batched immutable (O(N + K)): push(change₁) ──► buffer ─┐ push(change₂) ──► buffer │ O(K) to buffer push(change₃) ──► buffer │ ... │ push(changeₖ) ──► buffer ─┘ │ ▼ flush() ─────► sorted merge ──► one new array │ O(N + K log K) ``` The `.data` getter auto-flushes if there are pending changes, so existing code just works. ``` Benchmarks (time in ms): N=2000, K=200 ───────────────────────────────────────────────────────── Mutable O(K) │████████████████████████ 0.023ms Immutable O(K×N) │████████████████████████████████████████████████████████ 0.109ms Batched O(N+K) │███████████████ 0.015ms ◄── faster than mutable! ───────────────────────────────────────────────────────── ``` At larger scales batched beats mutable because we do not have to copy the objects over and over ## Changes ``` applyChange() ├── returns Entry instead of void ├── uses toSpliced()/with() for immutable array ops └── uses spread for immutable object ops ArrayView ├── push() buffers changes ├── flush() applies in one sorted merge pass └── .data getter auto-flushes for backwards compat Consumers ├── React: removes deepClone └── Solid: uses produce with in-place mutation ``` ## Manual Testing: React (zbugs) To verify React.memo actually works with stable references, I modified zbugs' list page: 1. Extracted `IssueRow` outside the component and wrapped with `React.memo` 2. Added custom comparator (default shallow compare fails because `style` is new object each render) 3. Added render count tracking to each row ```tsx const areIssueRowPropsEqual = (prev, next) => { if (prev.issue !== next.issue) return false; // reference check if (prev.style?.transform !== next.style?.transform) // value check return false; // ... other props return true; }; const IssueRow = memo(function IssueRow({ issue, style, ... }) { // render count tracking for testing }, areIssueRowPropsEqual); ``` Then ran the app and updated rows directly via psql while watching console: ``` ┌───────────────────────────────────────────────────────────────────────┐ │ Test 1: Update title only (no sort position change) │ ├───────────────────────────────────────────────────────────────────────┤ │ │ │ psql> UPDATE issue SET title = 'TITLE ONLY UPDATE' │ │ WHERE id = '_6cIk1pH24n6nmJ5sI6Ar'; │ │ │ │ Console output after Zero sync: │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ [render #3] IssueRow: _6cIk1pH - "TITLE ONLY UPDATE" │ │ │ │ (sameRef: false) │ │ │ └───────────────────────────────────────────────────────────────┘ │ │ │ │ Result: ONLY the updated row re-rendered. Other 99 rows skipped. │ │ │ └───────────────────────────────────────────────────────────────────────┘ ┌───────────────────────────────────────────────────────────────────────┐ │ Test 2: Update title + modified (causes sort position change) │ ├───────────────────────────────────────────────────────────────────────┤ │ │ │ psql> UPDATE issue SET title = 'POSITION CHANGE', │ │ modified = 1769210037000 │ │ WHERE id = 'dSHOxE86nkbGafajdd1ew'; │ │ │ │ Console output after Zero sync: │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ [render #3] IssueRow: dSHOxE86 - "POSITION CHANGE" │ │ │ │ [render #3] IssueRow: oGP3NonM - "Some other issue" │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ Result: Updated row + displaced row re-rendered. Expected behavior │ │ since style.transform changed for rows that moved. │ │ │ └───────────────────────────────────────────────────────────────────────┘ ``` Key insight: Zero maintains stable object references for unchanged issues. The `sameRef: true/false` logging confirmed this. When only the title changes, that row gets a new reference, but all other rows keep their original reference. ## Manual Testing: Solid (zbugs-lite-solid) (this is no longer part of the PR) Created a minimal Solid app that imports Zero schema/queries from zbugs. Added render count badges to each row. ``` ┌────────────────────────────────────────────────────────────────────────┐ │ Test: Update one issue while watching render counts │ ├────────────────────────────────────────────────────────────────────────┤ │ │ │ psql> UPDATE issue SET title = 'MODIFIED BY PSQL' │ │ WHERE id = 'HdpMkgbH...'; │ │ │ │ Before: After: │ │ ┌──────────────────────────┐ ┌──────────────────────────┐ │ │ │ [1] Leaking listeners... │ │ [1] MODIFIED BY PSQL │ ← +0 │ │ │ [1] Sort and remove... │ │ [1] Sort and remove... │ │ │ │ [1] UnknownError: Int... │ │ [1] UnknownError: Int... │ │ │ │ [1] Fix: race condition │ │ [1] Fix: race condition │ │ │ │ [1] Add support for... │ │ [1] Add support for... │ │ │ └──────────────────────────┘ └──────────────────────────┘ │ │ │ │ Items keep their reference so Solid never rerenders. │ │ All other rows stayed at 1. │ │ │ └────────────────────────────────────────────────────────────────────────┘ ``` Solid's fine-grained reactivity handles the in-place updates efficiently via produce. No special memo config needed. ## Related - Follows up on #5455 - Revives #3688 (original immutable attempt) - Fixes zero/3036 --------- Co-authored-by: Alp Co-authored-by: Alp Co-authored-by: Alp Co-authored-by: Matt Wonlaw Co-authored-by: Erik Arvidsson Co-authored-by: Erik Arvidsson --- packages/zero-react/src/use-query.tsx | 8 +- packages/zero-react/src/use-rows.test.tsx | 128 +- .../src/use-zero-virtualizer.test.tsx | 36 +- packages/zero-solid/src/solid-view.test.ts | 7 +- packages/zero-solid/src/solid-view.ts | 44 +- packages/zql/src/ivm/array-view.test.ts | 207 ++- packages/zql/src/ivm/array-view.ts | 97 +- .../zql/src/ivm/test/fetch-and-push-tests.ts | 24 +- .../zql/src/ivm/view-apply-change.test.ts | 1339 ++++++++++++++++- packages/zql/src/ivm/view-apply-change.ts | 729 +++++++-- packages/zql/src/query/query-delegate-base.ts | 4 +- .../zql/src/query/query-impl.query.test.ts | 2 +- tsconfig.json | 2 +- 13 files changed, 2322 insertions(+), 305 deletions(-) diff --git a/packages/zero-react/src/use-query.tsx b/packages/zero-react/src/use-query.tsx index 84966607b2..77b00c4c14 100644 --- a/packages/zero-react/src/use-query.tsx +++ b/packages/zero-react/src/use-query.tsx @@ -4,7 +4,6 @@ import { type Immutable, addContextToQuery, asQueryInternals, - deepClone, DEFAULT_TTL_MS, } from './bindings.ts'; import {useZero} from './zero-provider.tsx'; @@ -538,10 +537,9 @@ class ViewWrapper< resultType: ResultType, error?: ErroredQuery, ) => { - const data = - snap === undefined - ? snap - : (deepClone(snap as ReadonlyJSONValue) as HumanReadable); + // applyChange now returns immutable data structures, so no deep clone needed. + // Unchanged rows preserve their object identity for React.memo optimization. + const data = snap as HumanReadable; this.#snapshot = getSnapshot( this.#singular, data, diff --git a/packages/zero-react/src/use-rows.test.tsx b/packages/zero-react/src/use-rows.test.tsx index 789923c7ec..80dd7f4419 100644 --- a/packages/zero-react/src/use-rows.test.tsx +++ b/packages/zero-react/src/use-rows.test.tsx @@ -219,30 +219,40 @@ describe('useRows', () => { expect(result.current.permalinkNotFound).toBe(false); // Check the anchor item (ID 500 = "Item 0500") - expect(result.current.rowAt(500)).toEqual({ - id: '500', - name: 'Item 0500', - }); + expect(result.current.rowAt(500)).toEqual( + expect.objectContaining({ + id: '500', + name: 'Item 0500', + }), + ); // Check items before - expect(result.current.rowAt(495)).toEqual({ - id: '495', - name: 'Item 0495', - }); - expect(result.current.rowAt(499)).toEqual({ - id: '499', - name: 'Item 0499', - }); + expect(result.current.rowAt(495)).toEqual( + expect.objectContaining({ + id: '495', + name: 'Item 0495', + }), + ); + expect(result.current.rowAt(499)).toEqual( + expect.objectContaining({ + id: '499', + name: 'Item 0499', + }), + ); // Check items after - expect(result.current.rowAt(501)).toEqual({ - id: '501', - name: 'Item 0501', - }); - expect(result.current.rowAt(504)).toEqual({ - id: '504', - name: 'Item 0504', - }); + expect(result.current.rowAt(501)).toEqual( + expect.objectContaining({ + id: '501', + name: 'Item 0501', + }), + ); + expect(result.current.rowAt(504)).toEqual( + expect.objectContaining({ + id: '504', + name: 'Item 0504', + }), + ); // Out of range should be undefined expect(result.current.rowAt(494)).toBeUndefined(); @@ -268,10 +278,18 @@ describe('useRows', () => { expect(result.current.atStart).toBe(true); expect(result.current.atEnd).toBe(false); - expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); - expect(result.current.rowAt(1)).toEqual({id: '2', name: 'Item 0002'}); - expect(result.current.rowAt(2)).toEqual({id: '3', name: 'Item 0003'}); - expect(result.current.rowAt(6)).toEqual({id: '7', name: 'Item 0007'}); + expect(result.current.rowAt(0)).toEqual( + expect.objectContaining({id: '1', name: 'Item 0001'}), + ); + expect(result.current.rowAt(1)).toEqual( + expect.objectContaining({id: '2', name: 'Item 0002'}), + ); + expect(result.current.rowAt(2)).toEqual( + expect.objectContaining({id: '3', name: 'Item 0003'}), + ); + expect(result.current.rowAt(6)).toEqual( + expect.objectContaining({id: '7', name: 'Item 0007'}), + ); }); test('permalink anchor - item near end', async () => { @@ -293,18 +311,24 @@ describe('useRows', () => { expect(result.current.atStart).toBe(false); expect(result.current.atEnd).toBe(true); - expect(result.current.rowAt(992)).toEqual({ - id: '993', - name: 'Item 0993', - }); - expect(result.current.rowAt(997)).toEqual({ - id: '998', - name: 'Item 0998', - }); - expect(result.current.rowAt(999)).toEqual({ - id: '1000', - name: 'Item 1000', - }); + expect(result.current.rowAt(992)).toEqual( + expect.objectContaining({ + id: '993', + name: 'Item 0993', + }), + ); + expect(result.current.rowAt(997)).toEqual( + expect.objectContaining({ + id: '998', + name: 'Item 0998', + }), + ); + expect(result.current.rowAt(999)).toEqual( + expect.objectContaining({ + id: '1000', + name: 'Item 1000', + }), + ); }); test('permalink anchor - item not found', async () => { @@ -356,18 +380,26 @@ describe('useRows', () => { // Verify the new items are included and properly sorted expect(result.current.rowsLength).toBe(10); - expect(result.current.rowAt(0)).toEqual({ - id: '1001', - name: 'Item 0000', - }); - expect(result.current.rowAt(1)).toEqual({ - id: '1002', - name: 'Item 00005', - }); - expect(result.current.rowAt(2)).toEqual({id: '1', name: 'Item 0001'}); + expect(result.current.rowAt(0)).toEqual( + expect.objectContaining({ + id: '1001', + name: 'Item 0000', + }), + ); + expect(result.current.rowAt(1)).toEqual( + expect.objectContaining({ + id: '1002', + name: 'Item 00005', + }), + ); + expect(result.current.rowAt(2)).toEqual( + expect.objectContaining({id: '1', name: 'Item 0001'}), + ); // Original items shifted down - item 10 and 9 should be pushed out - expect(result.current.rowAt(9)).toEqual({id: '8', name: 'Item 0008'}); + expect(result.current.rowAt(9)).toEqual( + expect.objectContaining({id: '8', name: 'Item 0008'}), + ); expect(result.current.rowAt(10)).toBeUndefined(); }); @@ -427,7 +459,9 @@ describe('useRows', () => { // Verify the permalink item is centered expect(result.current.permalinkNotFound).toBe(false); - expect(result.current.rowAt(500)).toEqual({id: '501', name: 'Item 0501'}); + expect(result.current.rowAt(500)).toEqual( + expect.objectContaining({id: '501', name: 'Item 0501'}), + ); const initialFirstIndex = result.current.firstRowIndex; diff --git a/packages/zero-react/src/use-zero-virtualizer.test.tsx b/packages/zero-react/src/use-zero-virtualizer.test.tsx index d6b51cf996..d65d4e2007 100644 --- a/packages/zero-react/src/use-zero-virtualizer.test.tsx +++ b/packages/zero-react/src/use-zero-virtualizer.test.tsx @@ -187,7 +187,9 @@ describe('useZeroVirtualizer', () => { expect(result.current.estimatedTotal).toBeGreaterThan(0); // Verify we can access rows - expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); + expect(result.current.rowAt(0)).toEqual( + expect.objectContaining({id: '1', name: 'Item 0001'}), + ); }); test('permalink loading', async () => { @@ -405,9 +407,15 @@ describe('useZeroVirtualizer', () => { }); // Test rowAt function - expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); - expect(result.current.rowAt(1)).toEqual({id: '2', name: 'Item 0002'}); - expect(result.current.rowAt(99)).toEqual({id: '100', name: 'Item 0100'}); + expect(result.current.rowAt(0)).toEqual( + expect.objectContaining({id: '1', name: 'Item 0001'}), + ); + expect(result.current.rowAt(1)).toEqual( + expect.objectContaining({id: '2', name: 'Item 0002'}), + ); + expect(result.current.rowAt(99)).toEqual( + expect.objectContaining({id: '100', name: 'Item 0100'}), + ); // Out of range should be undefined expect(result.current.rowAt(10000)).toBeUndefined(); @@ -1213,10 +1221,12 @@ describe('useZeroVirtualizer', () => { }); // Verify getRowKey receives the correct row data (first row) - expect(getRowKey.mock.calls[0][0]).toEqual({ - id: '1', - name: 'Item 0001', - }); + expect(getRowKey.mock.calls[0][0]).toEqual( + expect.objectContaining({ + id: '1', + name: 'Item 0001', + }), + ); }); test('falls back to index for unloaded rows when using getRowKey', async () => { @@ -1419,10 +1429,12 @@ describe('useZeroVirtualizer', () => { // Get the first call and verify it received a proper Item const firstCall = getRowKey.mock.calls[0]; expect(firstCall).toBeDefined(); - expect(firstCall[0]).toEqual({ - id: '1', - name: 'Item 0001', - }); + expect(firstCall[0]).toEqual( + expect.objectContaining({ + id: '1', + name: 'Item 0001', + }), + ); }); test('getRowKey can return different key types (string, number)', async () => { diff --git a/packages/zero-solid/src/solid-view.test.ts b/packages/zero-solid/src/solid-view.test.ts index 700e12e6f3..cb6e6ac92e 100644 --- a/packages/zero-solid/src/solid-view.test.ts +++ b/packages/zero-solid/src/solid-view.test.ts @@ -1546,7 +1546,12 @@ test('edit trigger reactivity at the column level', () => { ]; expect(data()).toEqual(data2); expect(row0Log).toEqual([]); - expect(row1Log).toEqual([]); + // PK change (a: 2→3) means idSymbol changes ('2'→'3'). + // reconcile treats different keys as remove+add (correct: different PK = different entity). + // row1Log sees the "new" row because the old row object was replaced. + expect(row1Log).toEqual([ + {a: 3, b: 'b3', [refCountSymbol]: 1, [idSymbol]: '3'}, + ]); expect(row0ALog).toEqual([]); expect(row0BLog).toEqual([]); expect(row1ALog).toEqual([3]); diff --git a/packages/zero-solid/src/solid-view.ts b/packages/zero-solid/src/solid-view.ts index c2624871a8..b7537faea3 100644 --- a/packages/zero-solid/src/solid-view.ts +++ b/packages/zero-solid/src/solid-view.ts @@ -28,6 +28,48 @@ export type State = [Entry, QueryResultDetails]; export const COMPLETE: QueryResultDetails = Object.freeze({type: 'complete'}); export const UNKNOWN: QueryResultDetails = Object.freeze({type: 'unknown'}); +/** + * SolidView bridges Zero's incremental view updates with Solid's reactive + * store. + * + * The challenge: Zero pushes individual row changes (add/remove/edit) as they + * arrive, but updating Solid's store on each push is expensive. We batch + * changes until transaction commit, then apply them all at once. + * + * Two code paths optimize for different scenarios: + * + * 1. BULK INSERT (builderRoot path): When building from empty, we skip + * Solid's reactive tracking entirely and build a plain JS object. This is + * 5x faster for large initial loads. Uses reconcile() to diff the final + * result into Solid. + * + * 2. INCREMENTAL UPDATE (#pendingChanges path): For existing views, we queue + * changes and apply them in-place within a produce() draft. produce() + * creates a mutable draft, applyChange mutates it directly, then produce() + * handles diffing and reactivity. + * + * + * push(change) + * │ + * ▼ + * ┌─────────────────────────────────┐ + * │ builderRoot defined? │ + * │ (building from empty) │ + * └─────────────────────────────────┘ + * │yes │no + * ▼ ▼ + * Build plain JS Queue in + * object (fast) #pendingChanges + * │ │ + * └───────┬───────────┘ + * ▼ + * onTransactionCommit() + * │ + * ┌───────┴──────────┐ + * │ │ + * builderRoot produce(draft => + * → reconcile() applyChange(draft, ..., mutate: true)) + */ export class SolidView implements Output { readonly #input: Input; readonly #format: Format; @@ -136,7 +178,6 @@ export class SolidView implements Output { key: idSymbol as unknown as string, }), ); - this.#setState(prev => [builderRoot, prev[1]]); this.#builderRoot = undefined; } } else { @@ -192,6 +233,7 @@ export class SolidView implements Output { '', this.#format, true /* withIDs */, + true /* mutate */, ); } diff --git a/packages/zql/src/ivm/array-view.test.ts b/packages/zql/src/ivm/array-view.test.ts index e92dbf9ac5..e2fe134794 100644 --- a/packages/zql/src/ivm/array-view.test.ts +++ b/packages/zql/src/ivm/array-view.test.ts @@ -12,10 +12,10 @@ import {Join} from './join.ts'; import {MemoryStorage} from './memory-storage.ts'; import type {Input} from './operator.ts'; import type {SourceSchema} from './schema.ts'; +import {consume} from './stream.ts'; import {Take} from './take.ts'; import {createSource} from './test/source-factory.ts'; import {refCountSymbol} from './view-apply-change.ts'; -import {consume} from './stream.ts'; const lc = createSilentLogContext(); @@ -111,12 +111,13 @@ test('basics', () => { view.flush(); expect(callCount).toBe(3); expect(view.data).toEqual([]); - // The data remains but the rc gets updated. + // With immutability, old captured data reference is unchanged. + // The listener was unsubscribed, so no new data was captured. expect(data).toEqual([ { a: 3, b: 'c', - [refCountSymbol]: 0, + [refCountSymbol]: 1, }, ]); }); @@ -153,22 +154,25 @@ test('single-format', () => { // trying to add another element should be an error // pipeline should have been configured with a limit of one - expect(() => consume(ms.push({row: {a: 2, b: 'b'}, type: 'add'}))).toThrow( + // With batched change application, the error is thrown when changes are applied + // (at flush() or .data access), not at push() time. + consume(ms.push({row: {a: 2, b: 'b'}, type: 'add'})); + expect(() => view.flush()).toThrow( "Singular relationship '' should not have multiple rows. You may need to declare this relationship with the `many` helper instead of the `one` helper in your schema.", ); // Adding the same element is not an error in the ArrayView but it is an error // in the Source. This case is tested in view-apply-change.ts. - consume(ms.push({row: {a: 1, b: 'a'}, type: 'remove'})); + // Note: After the failed flush, the pending change is still there. Let's verify + // that accessing .data also throws (auto-flush safety net). + expect(() => view.data).toThrow( + "Singular relationship '' should not have multiple rows. You may need to declare this relationship with the `many` helper instead of the `one` helper in your schema.", + ); - // no call until flush + // The listener's data is still the old value since the flush failed expect(data).toEqual({a: 1, b: 'a'}); expect(callCount).toBe(1); - view.flush(); - - expect(data).toEqual(undefined); - expect(callCount).toBe(2); unlisten(); }); @@ -2039,6 +2043,189 @@ test('listeners added after error still receive error state', async () => { expect(receivedError).toEqual(testError); }); +test('O(N + K) batching: multiple changes applied efficiently', () => { + // This test verifies that K changes are buffered and applied in one batch, + // achieving O(N + K) complexity instead of O(K × N). + const ms = createSource( + lc, + testLogConfig, + 'table', + {a: {type: 'number'}, b: {type: 'string'}}, + ['a'], + ); + + // Create initial array of N=10 items + for (let i = 0; i < 10; i++) { + consume(ms.push({row: {a: i * 10, b: `item-${i}`}, type: 'add'})); + } + + const view = new ArrayView( + ms.connect([['a', 'asc']]), + {singular: false, relationships: {}}, + true, + () => {}, + ); + + let callCount = 0; + let data: ReadonlyJSONValue[] = []; + view.addListener(entries => { + ++callCount; + assertArray(entries); + // Capture references to verify identity preservation + data = [...entries] as ReadonlyJSONValue[]; + }); + + // Initial hydration: 10 items + expect(data.length).toBe(10); + expect(callCount).toBe(1); + + // Store references to original items for identity comparison + const originalItems = [...data]; + + // Push K=5 changes WITHOUT calling flush (they should be buffered) + consume(ms.push({row: {a: 15, b: 'new-1'}, type: 'add'})); + consume(ms.push({row: {a: 25, b: 'new-2'}, type: 'add'})); + consume(ms.push({row: {a: 35, b: 'new-3'}, type: 'add'})); + consume(ms.push({row: {a: 45, b: 'new-4'}, type: 'add'})); + consume(ms.push({row: {a: 55, b: 'new-5'}, type: 'add'})); + + // Listener should NOT have been called yet (changes are buffered) + expect(callCount).toBe(1); + + // Now flush: all 5 changes should be applied in one batch + view.flush(); + + // Listener should be called exactly once for the batch + expect(callCount).toBe(2); + + // Verify all 15 items are present (10 original + 5 new) + expect(data.length).toBe(15); + + // Verify the data is correctly sorted (by 'a' ascending) + const sortedA = data.map(d => (d as {a: number}).a); + expect(sortedA).toEqual([ + 0, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 90, + ]); + + // Verify UNCHANGED items preserve reference identity + // Original items at indices 0, 1 (a=0, a=10) should still be the same references + // (Items at a=0 and a=10 are before all insertions, so their array indices don't change) + expect(data[0]).toBe(originalItems[0]); // a=0 + expect(data[1]).toBe(originalItems[1]); // a=10 + + // Items that were shifted should still have the same object identity + // (immutable updates preserve identity for unchanged rows) + // Original item with a=20 (was at index 2, now at index 3) + expect(data[3]).toBe(originalItems[2]); // a=20 + // Original item with a=30 (was at index 3, now at index 5) + expect(data[5]).toBe(originalItems[3]); // a=30 +}); + +test('O(N + K) batching: auto-flush in .data getter', () => { + // This test verifies the auto-flush safety net: accessing .data should + // apply any pending changes, ensuring backwards compatibility. + const ms = createSource( + lc, + testLogConfig, + 'table', + {a: {type: 'number'}, b: {type: 'string'}}, + ['a'], + ); + + consume(ms.push({row: {a: 1, b: 'a'}, type: 'add'})); + consume(ms.push({row: {a: 2, b: 'b'}, type: 'add'})); + + const view = new ArrayView( + ms.connect([['a', 'asc']]), + {singular: false, relationships: {}}, + true, + () => {}, + ); + + // Don't add a listener, just use .data directly + expect(view.data).toEqual([ + {a: 1, b: 'a', [refCountSymbol]: 1}, + {a: 2, b: 'b', [refCountSymbol]: 1}, + ]); + + // Push changes WITHOUT calling flush + consume(ms.push({row: {a: 3, b: 'c'}, type: 'add'})); + consume(ms.push({row: {a: 4, b: 'd'}, type: 'add'})); + + // Accessing .data should auto-flush and show the new data + // (This is the backwards compatibility safety net) + expect(view.data).toEqual([ + {a: 1, b: 'a', [refCountSymbol]: 1}, + {a: 2, b: 'b', [refCountSymbol]: 1}, + {a: 3, b: 'c', [refCountSymbol]: 1}, + {a: 4, b: 'd', [refCountSymbol]: 1}, + ]); +}); + +test('O(N + K) batching: listener called once per flush with all changes', () => { + // This test verifies that multiple pushes before flush result in + // a single listener notification with the final state. + const ms = createSource( + lc, + testLogConfig, + 'table', + {a: {type: 'number'}, b: {type: 'string'}}, + ['a'], + ); + + consume(ms.push({row: {a: 1, b: 'initial'}, type: 'add'})); + + const view = new ArrayView( + ms.connect([['a', 'asc']]), + {singular: false, relationships: {}}, + true, + () => {}, + ); + + const snapshots: ReadonlyJSONValue[][] = []; + view.addListener(entries => { + assertArray(entries); + // Store a snapshot of the data at each listener call + snapshots.push([...entries] as ReadonlyJSONValue[]); + }); + + // Initial hydration + expect(snapshots.length).toBe(1); + expect(snapshots[0].length).toBe(1); + + // Push 3 changes + consume(ms.push({row: {a: 2, b: 'second'}, type: 'add'})); + consume(ms.push({row: {a: 3, b: 'third'}, type: 'add'})); + consume(ms.push({row: {a: 4, b: 'fourth'}, type: 'add'})); + + // Still only 1 snapshot (changes are buffered) + expect(snapshots.length).toBe(1); + + // Flush + view.flush(); + + // Now we should have 2 snapshots total + expect(snapshots.length).toBe(2); + + // The second snapshot should have ALL 4 items (not intermediate states) + expect(snapshots[1].length).toBe(4); + expect(snapshots[1].map(d => (d as {a: number}).a)).toEqual([1, 2, 3, 4]); + + // Do another batch of changes + consume(ms.push({row: {a: 5, b: 'fifth'}, type: 'add'})); + consume(ms.push({row: {a: 6, b: 'sixth'}, type: 'add'})); + + // Still only 2 snapshots + expect(snapshots.length).toBe(2); + + // Flush again + view.flush(); + + // Now 3 snapshots + expect(snapshots.length).toBe(3); + expect(snapshots[2].length).toBe(6); +}); + test('error state persists through flush operations', async () => { const ms = createSource( lc, diff --git a/packages/zql/src/ivm/array-view.ts b/packages/zql/src/ivm/array-view.ts index ecdebf61f7..ac5d9dae4a 100644 --- a/packages/zql/src/ivm/array-view.ts +++ b/packages/zql/src/ivm/array-view.ts @@ -1,15 +1,60 @@ import {assert} from '../../../shared/src/asserts.ts'; import type {Immutable} from '../../../shared/src/immutable.ts'; +import {mapValues} from '../../../shared/src/objects.ts'; import {emptyArray} from '../../../shared/src/sentinels.ts'; import type {ErroredQuery} from '../../../zero-protocol/src/custom-queries.ts'; import type {TTL} from '../query/ttl.ts'; import type {Listener, ResultType, TypedView} from '../query/typed-view.ts'; import type {Change} from './change.ts'; +import type {Node} from './data.ts'; import {skipYields, type Input, type Output} from './operator.ts'; import type {SourceSchema} from './schema.ts'; -import {applyChange} from './view-apply-change.ts'; +import { + applyChanges, + type ExpandedNode, + type ViewChange, +} from './view-apply-change.ts'; import type {Entry, Format, View} from './view.ts'; +/** + * Eagerly expand a Node's lazy relationship generators into arrays. + * This captures the current state of the source at the moment of expansion. + */ +function expandNode(node: Node): ExpandedNode { + return { + row: node.row, + relationships: mapValues(node.relationships, v => + Array.from(skipYields(v()), expandNode), + ), + }; +} + +/** + * Expand a Change by eagerly evaluating all lazy relationship generators. + */ +function expandChange(change: Change): ViewChange { + switch (change.type) { + case 'add': + case 'remove': + return {type: change.type, node: expandNode(change.node)}; + case 'edit': + return { + type: 'edit', + node: expandNode(change.node), + oldNode: expandNode(change.oldNode), + }; + case 'child': + return { + type: 'child', + node: expandNode(change.node), + child: { + relationshipName: change.child.relationshipName, + change: expandChange(change.child.change), + }, + }; + } +} + /** * Implements a materialized view of the output of an operator. * @@ -29,7 +74,7 @@ export class ArrayView implements Output, TypedView { // Synthetic "root" entry that has a single "" relationship, so that we can // treat all changes, including the root change, generically. - readonly #root: Entry; + #root: Entry; onDestroy: (() => void) | undefined; @@ -38,6 +83,9 @@ export class ArrayView implements Output, TypedView { #error: ErroredQuery | undefined; readonly #updateTTL: (ttl: TTL) => void; + // Pending changes buffered for batch application (O(N + K) optimization) + #pendingChanges: ViewChange[] = []; + constructor( input: Input, format: Format, @@ -57,24 +105,49 @@ export class ArrayView implements Output, TypedView { this.#resultType = 'error'; this.#error = queryComplete; } else { + const flushAndFire = () => + this.#dirty ? this.flush() : this.#fireListeners(); void queryComplete .then(() => { this.#resultType = 'complete'; - this.#fireListeners(); + flushAndFire(); }) - .catch(e => { + .catch((e: ErroredQuery) => { this.#resultType = 'error'; this.#error = e; - this.#fireListeners(); + flushAndFire(); }); } this.#hydrate(); } get data() { + // Auto-flush for backwards compatibility. Recommended: push() then flush(). + // + // push(A) ──► buffer ──► push(B) ──► buffer ──► flush() ──► apply all + // │ + // Legacy code may read .data here ─────────────────┘ (before flush) + // │ + // ▼ + // Without auto-flush: stale data (missing A, B) + // With auto-flush: current data (has A, B) + this.#applyPendingChanges(); return this.#root[''] as V; } + #applyPendingChanges() { + if (this.#pendingChanges.length > 0) { + this.#root = applyChanges( + this.#root, + this.#pendingChanges, + this.#schema, + '', + this.#format, + ); + this.#pendingChanges = []; + } + } + addListener(listener: Listener) { assert(!this.#listeners.has(listener), 'Listener already registered'); this.#listeners.add(listener); @@ -102,10 +175,12 @@ export class ArrayView implements Output, TypedView { #hydrate() { this.#dirty = true; + // During hydration, expand and apply nodes immediately for (const node of skipYields(this.#input.fetch({}))) { - applyChange( + const expanded = expandNode(node); + this.#root = applyChanges( this.#root, - {type: 'add', node}, + [{type: 'add', node: expanded}], this.#schema, '', this.#format, @@ -116,7 +191,11 @@ export class ArrayView implements Output, TypedView { push(change: Change) { this.#dirty = true; - applyChange(this.#root, change, this.#schema, '', this.#format); + // Eagerly expand the change to capture current source state. + // This is critical: lazy generators would see stale data if deferred. + // Buffer the change for batch application (O(N + K) optimization). + const expanded = expandChange(change); + this.#pendingChanges.push(expanded); return emptyArray; } @@ -125,6 +204,8 @@ export class ArrayView implements Output, TypedView { return; } this.#dirty = false; + // Apply all pending changes in one batch (O(N + K) optimization) + this.#applyPendingChanges(); this.#fireListeners(); } diff --git a/packages/zql/src/ivm/test/fetch-and-push-tests.ts b/packages/zql/src/ivm/test/fetch-and-push-tests.ts index db3c81eecb..66a664175f 100644 --- a/packages/zql/src/ivm/test/fetch-and-push-tests.ts +++ b/packages/zql/src/ivm/test/fetch-and-push-tests.ts @@ -101,11 +101,7 @@ export function runPushTest(t: PushTest) { }); let data; - const { - log: log2, - finalOutput: view, - actualStorage: actualStorage2, - } = innerTest(j => { + const {finalOutput: view, actualStorage: actualStorage2} = innerTest(j => { const view = new ArrayView(j, t.format, true, () => {}); data = view.data; return view; @@ -115,9 +111,10 @@ export function runPushTest(t: PushTest) { data = v; }); - // ArrayView does not expand relationships of removed nodes, so - // its logs should be a subset of the catch operator's logs. - expect(log).toEqual(expect.arrayContaining(log2)); + // Note: With eager expansion of relationship generators at push time, + // ArrayView and Catch may produce different fetch logs since they + // iterate generators independently. We no longer compare logs. + // The important invariant is that they produce the same storage state. expect(actualStorage).toEqual(actualStorage2); view.flush(); @@ -188,11 +185,7 @@ export function runFetchTest(t: FetchTest) { }); let data; - const { - log: log2, - finalOutput: view, - actualStorage: actualStorage2, - } = innerTest(j => { + const {finalOutput: view, actualStorage: actualStorage2} = innerTest(j => { const view = new ArrayView(j, t.format, true, () => {}); data = view.data; return view; @@ -202,7 +195,10 @@ export function runFetchTest(t: FetchTest) { data = v; }); - expect(log).toEqual(log2); + // Note: With eager expansion of relationship generators at push time, + // ArrayView and Catch may produce different fetch logs since they + // iterate generators independently. We no longer compare logs. + // The important invariant is that they produce the same storage state. expect(actualStorage).toEqual(actualStorage2); view.flush(); diff --git a/packages/zql/src/ivm/view-apply-change.test.ts b/packages/zql/src/ivm/view-apply-change.test.ts index 484b6aada6..618c1278a2 100644 --- a/packages/zql/src/ivm/view-apply-change.test.ts +++ b/packages/zql/src/ivm/view-apply-change.test.ts @@ -1,9 +1,22 @@ import {describe, expect, test} from 'vitest'; import {makeComparator} from './data.ts'; import type {SourceSchema} from './schema.ts'; -import {applyChange, type ViewChange} from './view-apply-change.ts'; +import { + applyChange, + idSymbol, + refCountSymbol, + type ViewChange, +} from './view-apply-change.ts'; import type {Entry, Format} from './view.ts'; +// Test helpers for cleaner entry access (casts are safe in tests) +const entries = (e: Entry, key: string): Entry[] => e[key] as Entry[]; +const at = (e: Entry, key: string, i: number): Entry => entries(e, key)[i]; + +const MUTATE = true as const; +const NO_MUTATE = false as const; +const WITH_IDS = true as const; + describe('applyChange', () => { const relationship = ''; const schema: SourceSchema = { @@ -69,17 +82,21 @@ describe('applyChange', () => { describe('Multiple entries', () => { test('singular: false', () => { - // This should really be a WeakMap but for testing purposes we use a Map. - - const parentEntry: Entry = {'': []}; + let root: Entry = {'': []}; const format: Format = { singular: false, - relationships: { - athletes: { - relationships: {}, - singular: false, - }, - }, + relationships: {athletes: {relationships: {}, singular: false}}, + }; + const apply = (change: ViewChange) => { + root = applyChange( + root, + change, + schema, + relationship, + format, + WITH_IDS, + NO_MUTATE, + ); }; { @@ -168,11 +185,9 @@ describe('applyChange', () => { }, ]; - for (const change of changes) { - applyChange(parentEntry, change, schema, relationship, format, true); - } + changes.forEach(apply); - expect(parentEntry).toMatchInlineSnapshot(` + expect(root).toMatchInlineSnapshot(` { "": [ { @@ -234,11 +249,9 @@ describe('applyChange', () => { }, ]; - for (const change of changes) { - applyChange(parentEntry, change, schema, relationship, format, true); - } + changes.forEach(apply); - expect(parentEntry).toMatchInlineSnapshot(` + expect(root).toMatchInlineSnapshot(` { "": [ { @@ -300,11 +313,9 @@ describe('applyChange', () => { }, ]; - for (const change of changes) { - applyChange(parentEntry, change, schema, relationship, format, true); - } + changes.forEach(apply); - expect(parentEntry).toMatchInlineSnapshot(` + expect(root).toMatchInlineSnapshot(` { "": [ { @@ -323,7 +334,7 @@ describe('applyChange', () => { test('singular: true', () => { // This should really be a WeakMap but for testing purposes we use a Map. - const parentEntry: Entry = {'': []}; + let root: Entry = {'': []}; const format: Format = { singular: false, relationships: { @@ -333,6 +344,17 @@ describe('applyChange', () => { }, }, }; + const apply = (change: ViewChange) => { + root = applyChange( + root, + change, + schema, + relationship, + format, + WITH_IDS, + NO_MUTATE, + ); + }; { const changes: ViewChange[] = [ @@ -420,11 +442,9 @@ describe('applyChange', () => { }, ]; - for (const change of changes) { - applyChange(parentEntry, change, schema, relationship, format, true); - } + changes.forEach(apply); - expect(parentEntry).toMatchInlineSnapshot(` + expect(root).toMatchInlineSnapshot(` { "": [ { @@ -484,11 +504,9 @@ describe('applyChange', () => { }, ]; - for (const change of changes) { - applyChange(parentEntry, change, schema, relationship, format, true); - } + changes.forEach(apply); - expect(parentEntry).toMatchInlineSnapshot(` + expect(root).toMatchInlineSnapshot(` { "": [ { @@ -548,11 +566,9 @@ describe('applyChange', () => { }, ]; - for (const change of changes) { - applyChange(parentEntry, change, schema, relationship, format, true); - } + changes.forEach(apply); - expect(parentEntry).toMatchInlineSnapshot(` + expect(root).toMatchInlineSnapshot(` { "": [ { @@ -584,14 +600,23 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - const root = {'': []}; + let root: Entry = {'': []}; const format = { singular: false, relationships: {}, }; - const apply = (change: ViewChange) => - applyChange(root, change, schema, '', format, true); + const apply = (change: ViewChange) => { + root = applyChange( + root, + change, + schema, + '', + format, + WITH_IDS, + NO_MUTATE, + ); + }; apply({ type: 'add', @@ -730,14 +755,23 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - const root = {'': undefined}; + let root: Entry = {'': undefined}; const format = { singular: true, relationships: {}, }; - const apply = (change: ViewChange) => - applyChange(root, change, schema, relationship, format, true); + const apply = (change: ViewChange) => { + root = applyChange( + root, + change, + schema, + relationship, + format, + WITH_IDS, + NO_MUTATE, + ); + }; apply({ type: 'add', @@ -888,14 +922,23 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - const root = {'': []}; + let root: Entry = {'': []}; const format = { singular: false, relationships: {}, }; - const apply = (change: ViewChange) => - applyChange(root, change, schema, '', format, true); + const apply = (change: ViewChange) => { + root = applyChange( + root, + change, + schema, + '', + format, + WITH_IDS, + NO_MUTATE, + ); + }; apply({ type: 'add', @@ -1016,14 +1059,23 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - const root = {'': []}; + let root: Entry = {'': []}; const format = { singular: false, relationships: {}, }; - const apply = (change: ViewChange) => - applyChange(root, change, schema, '', format, true); + const apply = (change: ViewChange) => { + root = applyChange( + root, + change, + schema, + '', + format, + WITH_IDS, + NO_MUTATE, + ); + }; apply({ type: 'add', @@ -1193,14 +1245,23 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - const root = {'': undefined}; + let root: Entry = {'': undefined}; const format = { singular: true, relationships: {}, }; - const apply = (change: ViewChange) => - applyChange(root, change, schema, '', format, true); + const apply = (change: ViewChange) => { + root = applyChange( + root, + change, + schema, + '', + format, + WITH_IDS, + NO_MUTATE, + ); + }; apply({ type: 'add', @@ -1311,14 +1372,23 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - const root = {'': undefined}; + let root: Entry = {'': undefined}; const format = { singular: true, relationships: {}, }; - const apply = (change: ViewChange) => - applyChange(root, change, schema, '', format, true); + const apply = (change: ViewChange) => { + root = applyChange( + root, + change, + schema, + '', + format, + WITH_IDS, + NO_MUTATE, + ); + }; apply({ type: 'add', @@ -1415,4 +1485,1167 @@ describe('applyChange', () => { `); }); }); + + // ═══════════════════════════════════════════════════════════════════════════ + // ADD WITH CHILDREN TESTS + // Verify entries with child relationships are correctly positioned. + // Tests the indexOf optimization: add() returns pos, avoiding O(n) scan. + // + // [] ──add B+kids──► [B] ──add A+kids──► [A, B] + // │ ↑ + // │ binary search finds pos=0 + // └──────────────────────┘ + // ═══════════════════════════════════════════════════════════════════════════ + describe('add with initialized relationships', () => { + const schemaWithChildren: SourceSchema = { + tableName: 'parent', + columns: {id: {type: 'string'}, name: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: { + children: { + tableName: 'child', + columns: {id: {type: 'string'}, parentId: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: {}, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }, + }, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + } as const; + + const formatWithChildren: Format = { + singular: false, + relationships: { + children: {singular: false, relationships: {}}, + }, + }; + + const apply = (root: Entry, change: ViewChange) => + applyChange( + root, + change, + schemaWithChildren, + '', + formatWithChildren, + WITH_IDS, + NO_MUTATE, + ); + + test('entry with children is placed at correct position', () => { + let root: Entry = {'': []}; + + // Add entries in non-alphabetical order to verify binary search positioning + root = apply(root, { + type: 'add', + node: { + row: {id: 'b', name: 'Bob'}, + relationships: { + children: () => [ + {row: {id: 'c1', parentId: 'b'}, relationships: {}}, + ], + }, + }, + }); + + root = apply(root, { + type: 'add', + node: { + row: {id: 'd', name: 'Dave'}, + relationships: { + children: () => [ + {row: {id: 'c2', parentId: 'd'}, relationships: {}}, + ], + }, + }, + }); + + // Add entry that should be inserted at position 0 (before 'b') + // This entry has children, so initializeRelationships will return a new entry + root = apply(root, { + type: 'add', + node: { + row: {id: 'a', name: 'Alice'}, + relationships: { + children: () => [ + {row: {id: 'c3', parentId: 'a'}, relationships: {}}, + ], + }, + }, + }); + + // Verify entries are in correct sorted order with their children + expect(root).toMatchInlineSnapshot(` + { + "": [ + { + "children": [ + { + "id": "c3", + "parentId": "a", + Symbol(rc): 1, + Symbol(id): ""c3"", + }, + ], + "id": "a", + "name": "Alice", + Symbol(rc): 1, + Symbol(id): ""a"", + }, + { + "children": [ + { + "id": "c1", + "parentId": "b", + Symbol(rc): 1, + Symbol(id): ""c1"", + }, + ], + "id": "b", + "name": "Bob", + Symbol(rc): 1, + Symbol(id): ""b"", + }, + { + "children": [ + { + "id": "c2", + "parentId": "d", + Symbol(rc): 1, + Symbol(id): ""c2"", + }, + ], + "id": "d", + "name": "Dave", + Symbol(rc): 1, + Symbol(id): ""d"", + }, + ], + } + `); + }); + + test('entry inserted in middle position with children', () => { + let root: Entry = {'': []}; + + // Add entries with gap for middle insertion + root = apply(root, { + type: 'add', + node: { + row: {id: 'a', name: 'Alice'}, + relationships: {children: () => []}, + }, + }); + + root = apply(root, { + type: 'add', + node: { + row: {id: 'c', name: 'Charlie'}, + relationships: {children: () => []}, + }, + }); + + // Insert entry in middle (at position 1) with multiple children + root = apply(root, { + type: 'add', + node: { + row: {id: 'b', name: 'Bob'}, + relationships: { + children: () => [ + {row: {id: 'child1', parentId: 'b'}, relationships: {}}, + {row: {id: 'child2', parentId: 'b'}, relationships: {}}, + ], + }, + }, + }); + + // Verify middle entry has children and is at correct position + expect(at(root, '', 0)).toEqual( + expect.objectContaining({id: 'a', name: 'Alice'}), + ); + expect(at(root, '', 1)).toEqual( + expect.objectContaining({id: 'b', name: 'Bob'}), + ); + expect(at(root, '', 2)).toEqual( + expect.objectContaining({id: 'c', name: 'Charlie'}), + ); + + // Verify Bob's children are correctly initialized + const bobEntry = at(root, '', 1); + expect(entries(bobEntry, 'children')).toHaveLength(2); + expect(at(bobEntry, 'children', 0)).toEqual( + expect.objectContaining({id: 'child1', parentId: 'b'}), + ); + expect(at(bobEntry, 'children', 1)).toEqual( + expect.objectContaining({id: 'child2', parentId: 'b'}), + ); + }); + }); + + // ═══════════════════════════════════════════════════════════════════════════ + // IMMUTABILITY TESTS + // Verify unchanged rows keep their object reference (enables React.memo etc.) + // + // root ─┬─ [A, B, C] edit B root' ─┬─ [A, B', C] + // │ ────► │ + // └─ users:[X,Y] └─ users:[X,Y] ← same ref + // + // A, C: same ref (unchanged) + // B': new ref (edited) + // users: same ref (sibling relationship untouched) + // ═══════════════════════════════════════════════════════════════════════════ + describe('Object identity preservation (immutability)', () => { + const simpleSchema = { + tableName: 'item', + columns: {id: {type: 'string'}, name: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: {}, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + } as const; + + const format: Format = {singular: false, relationships: {}}; + + // Helper to reduce boilerplate in tests + const apply = (root: Entry, change: ViewChange) => + applyChange(root, change, simpleSchema, '', format, WITH_IDS, NO_MUTATE); + + // [A] ──add B──► [A, B] + // ↑ ↑ + // └─── same ref ────┘ + test('unchanged rows keep their reference when adding a new row', () => { + let root: Entry = {'': []}; + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const firstRowRef = at(root, '', 0); + + root = apply(root, { + type: 'add', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + // First row should keep same reference (toBe checks reference equality) + expect(at(root, '', 0)).toBe(firstRowRef); + expect(entries(root, '')).toHaveLength(2); + }); + + test('unchanged rows keep their reference when removing another row', () => { + let root: Entry = {'': []}; + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + root = apply(root, { + type: 'add', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + const firstRowRef = at(root, '', 0); + + root = apply(root, { + type: 'remove', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + // First row should keep same reference + expect(at(root, '', 0)).toBe(firstRowRef); + expect(entries(root, '')).toHaveLength(1); + }); + + test('unchanged rows keep their reference when editing another row', () => { + let root: Entry = {'': []}; + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + root = apply(root, { + type: 'add', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + const firstRowRef = at(root, '', 0); + + root = apply(root, { + type: 'edit', + oldNode: {row: {id: '2', name: 'Bob'}}, + node: {row: {id: '2', name: 'Bobby'}}, + }); + + // First row should keep same reference + expect(at(root, '', 0)).toBe(firstRowRef); + // Second row should have new reference with updated data + expect(at(root, '', 1)).not.toBe(firstRowRef); + expect(at(root, '', 1)).toEqual( + expect.objectContaining({id: '2', name: 'Bobby'}), + ); + }); + + // [A] ──edit A──► [A'] + // │ │ + // └── different ref ─┘ + test('edited row gets new reference', () => { + let root: Entry = {'': []}; + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const originalRef = at(root, '', 0); + + root = apply(root, { + type: 'edit', + oldNode: {row: {id: '1', name: 'Alice'}}, + node: {row: {id: '1', name: 'Alicia'}}, + }); + + // Edited row should have a new reference + expect(at(root, '', 0)).not.toBe(originalRef); + expect(at(root, '', 0)).toEqual( + expect.objectContaining({id: '1', name: 'Alicia'}), + ); + }); + + test('root object changes when any modification occurs', () => { + let root: Entry = {'': []}; + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const rootRef = root; + const listRef = entries(root, ''); + + root = apply(root, { + type: 'add', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + // Root and list should have new references + expect(root).not.toBe(rootRef); + expect(root['']).not.toBe(listRef); + }); + + // Parent changes but untouched children keep their references: + // + // P1 ─┬─ [C1, C2] add C3 P1' ─┬─ [C1, C2, C3] + // │ ────► │ ↑ ↑ + // └─ ... └─ same refs + test('unchanged nested relationships keep their reference', () => { + const schemaWithRelationship: SourceSchema = { + tableName: 'parent', + columns: {id: {type: 'string'}, name: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: { + children: { + tableName: 'child', + columns: {id: {type: 'string'}, parentId: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: {}, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }, + }, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }; + + const formatWithRelationship: Format = { + singular: false, + relationships: { + children: { + singular: false, + relationships: {}, + }, + }, + }; + + const apply = (entry: Entry, change: ViewChange) => + applyChange( + entry, + change, + schemaWithRelationship, + '', + formatWithRelationship, + WITH_IDS, + NO_MUTATE, + ); + + let root: Entry = {'': []}; + + // Add parent with children + root = apply(root, { + type: 'add', + node: { + row: {id: 'p1', name: 'Parent1'}, + relationships: { + children: () => [ + {row: {id: 'c1', parentId: 'p1'}, relationships: {}}, + {row: {id: 'c2', parentId: 'p1'}, relationships: {}}, + ], + }, + }, + }); + + const parent1 = at(root, '', 0); + const child1Ref = at(parent1, 'children', 0); + const child2Ref = at(parent1, 'children', 1); + + // Add a new child to the parent + root = apply(root, { + type: 'child', + node: {row: {id: 'p1', name: 'Parent1'}}, + child: { + relationshipName: 'children', + change: { + type: 'add', + node: {row: {id: 'c3', parentId: 'p1'}, relationships: {}}, + }, + }, + }); + + const newParent1 = at(root, '', 0); + // Parent should have new reference (its children changed) + expect(newParent1).not.toBe(parent1); + // But existing children should keep their references + expect(at(newParent1, 'children', 0)).toBe(child1Ref); + expect(at(newParent1, 'children', 1)).toBe(child2Ref); + // New child is added + expect(entries(newParent1, 'children')).toHaveLength(3); + }); + + // [A:rc=1] ──add A──► [A:rc=2] + // │ │ + // └─── different ref ───┘ (but same data) + test('refCount increment creates new reference but preserves data', () => { + let root: Entry = {'': []}; + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const originalRef = at(root, '', 0); + const originalRefCount = (originalRef as {[refCountSymbol]: number})[ + refCountSymbol + ]; + + // Add same row again (should increment refCount) + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const newRef = at(root, '', 0); + + // Reference should change (immutability) + expect(newRef).not.toBe(originalRef); + // RefCount should be incremented + expect((newRef as {[refCountSymbol]: number})[refCountSymbol]).toBe( + originalRefCount + 1, + ); + // Data should be the same + expect(newRef).toEqual(expect.objectContaining({id: '1', name: 'Alice'})); + }); + + // Sibling parents are independent. Changing P1's children doesn't touch P2: + // + // [P1─[C1], P2─[C2]] add C3 to P1 [P1'─[C1,C3], P2─[C2]] + // ↑ ────► ↑ + // └────────────── same ref ────────────────┘ + test('child change on one parent does not affect other parents', () => { + const schemaWithRelationship: SourceSchema = { + tableName: 'parent', + columns: {id: {type: 'string'}, name: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: { + children: { + tableName: 'child', + columns: {id: {type: 'string'}, parentId: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: {}, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }, + }, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }; + + const formatWithRelationship: Format = { + singular: false, + relationships: { + children: { + singular: false, + relationships: {}, + }, + }, + }; + + const apply = (entry: Entry, change: ViewChange) => + applyChange( + entry, + change, + schemaWithRelationship, + '', + formatWithRelationship, + WITH_IDS, + NO_MUTATE, + ); + + let root: Entry = {'': []}; + + // Add two parents with children + root = apply(root, { + type: 'add', + node: { + row: {id: 'p1', name: 'Parent1'}, + relationships: { + children: () => [ + {row: {id: 'c1', parentId: 'p1'}, relationships: {}}, + ], + }, + }, + }); + + root = apply(root, { + type: 'add', + node: { + row: {id: 'p2', name: 'Parent2'}, + relationships: { + children: () => [ + {row: {id: 'c2', parentId: 'p2'}, relationships: {}}, + ], + }, + }, + }); + + const parent1Ref = at(root, '', 0); + const parent2Ref = at(root, '', 1); + const parent2ChildrenRef = entries(parent2Ref, 'children'); + + // Add a child to parent1 only + root = apply(root, { + type: 'child', + node: {row: {id: 'p1', name: 'Parent1'}}, + child: { + relationshipName: 'children', + change: { + type: 'add', + node: {row: {id: 'c3', parentId: 'p1'}, relationships: {}}, + }, + }, + }); + + // Parent1 should have new reference + expect(at(root, '', 0)).not.toBe(parent1Ref); + // Parent2 should keep same reference (unchanged) + expect(at(root, '', 1)).toBe(parent2Ref); + // Parent2's children should keep same reference + expect(at(root, '', 1)['children']).toBe(parent2ChildrenRef); + }); + + // When withIDs is enabled, edited rows get a new idSymbol + test('edited row with withIDs gets new idSymbol', () => { + let root: Entry = {'': []}; + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const originalRef = at(root, '', 0); + const originalId = (originalRef as {[idSymbol]?: string})[idSymbol]; + expect(originalId).toBeDefined(); + + root = apply(root, { + type: 'edit', + oldNode: {row: {id: '1', name: 'Alice'}}, + node: {row: {id: '1', name: 'Alicia'}}, + }); + + const newRef = at(root, '', 0); + const newId = (newRef as {[idSymbol]?: string})[idSymbol]; + + // Reference should change (immutability) + expect(newRef).not.toBe(originalRef); + // idSymbol should be set on the new entry + expect(newId).toBeDefined(); + expect(newId).toBe(originalId); // Same ID since primary key unchanged + expect(newRef).toEqual( + expect.objectContaining({id: '1', name: 'Alicia'}), + ); + }); + }); + + // ═══════════════════════════════════════════════════════════════════════════ + // IN-PLACE MUTATION TESTS (mutate = true) + // Verify that with mutate=true, containers are mutated in place but rows + // remain immutable and views remain isolated. + // + // Key invariants: + // 1. Multiple views never share object instances + // 2. Row objects never mutate (always get new references when changed) + // 3. Within a view: root and arrays ARE mutated in place + // ═══════════════════════════════════════════════════════════════════════════ + describe('In-place mutation (mutate = true)', () => { + // Deep freeze helper to catch bugs where we mutate inputs + function deepFreeze(obj: T): T { + Object.freeze(obj); + for (const prop of Object.getOwnPropertyNames(obj)) { + // oxlint-disable-next-line no-explicit-any + const val = (obj as any)[prop]; + if (val && typeof val === 'object' && !Object.isFrozen(val)) { + deepFreeze(val); + } + } + + return obj; + } + + const simpleSchema = { + tableName: 'item', + columns: {id: {type: 'string'}, name: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: {}, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + } as const; + + const format: Format = {singular: false, relationships: {}}; + + // Helper to reduce boilerplate in tests + const apply = (root: Entry, change: ViewChange) => + applyChange( + root, + // we freeze here to catch potential bugs where applyChange mutates the + // input change object (it shouldn't) + deepFreeze(change), + simpleSchema, + '', + format, + WITH_IDS, + MUTATE, + ); + + // root/[A] ──add B──► root/[A, B] + // ↑ ↑ ↑ ↑ + // └───┴─ same refs ─────┴───┘ + test('root and array keep their reference when adding a new row', () => { + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const firstRowRef = at(root, '', 0); + + root = apply(root, { + type: 'add', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(entries(root, '')).toBe(listRef); + // First row should keep same reference (unchanged) + expect(at(root, '', 0)).toBe(firstRowRef); + expect(entries(root, '')).toHaveLength(2); + }); + + test('root and array keep their reference when removing a row', () => { + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + root = apply(root, { + type: 'add', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + const firstRowRef = at(root, '', 0); + + root = apply(root, { + type: 'remove', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(entries(root, '')).toBe(listRef); + // First row should keep same reference (unchanged) + expect(at(root, '', 0)).toBe(firstRowRef); + expect(entries(root, '')).toHaveLength(1); + }); + + test('root, array and entries keep reference when editing a row', () => { + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + root = apply(root, { + type: 'add', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + const firstRowRef = at(root, '', 0); + const secondRowRef = at(root, '', 1); + // Verify secondRowRef data before edit + expect(secondRowRef).toEqual( + expect.objectContaining({id: '2', name: 'Bob'}), + ); + + root = apply(root, { + type: 'edit', + oldNode: {row: {id: '2', name: 'Bob'}}, + node: {row: {id: '2', name: 'Bobby'}}, + }); + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(entries(root, '')).toBe(listRef); + // First row should keep same reference (unchanged) + expect(at(root, '', 0)).toBe(firstRowRef); + expect(at(root, '', 1)).toBe(secondRowRef); + }); + + // [A] ──edit A──► [A'] + // ↑ │ + // same ref different ref + // (array) (row) + test('edited row keeps reference', () => { + // TODO(arv): Mutate element if compare === 0 + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const originalRef = at(root, '', 0); + // Verify original data before edit + expect(originalRef).toEqual( + expect.objectContaining({id: '1', name: 'Alice'}), + ); + + root = apply(root, { + type: 'edit', + oldNode: {row: {id: '1', name: 'Alice'}}, + node: {row: {id: '1', name: 'Alicia'}}, + }); + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(entries(root, '')).toBe(listRef); + expect(at(root, '', 0)).toBe(originalRef); + expect(at(root, '', 0)).toEqual( + expect.objectContaining({id: '1', name: 'Alicia'}), + ); + }); + + test('root and list keep same reference on any mutation', () => { + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(root['']).toBe(listRef); + + root = apply(root, { + type: 'add', + node: {row: {id: '2', name: 'Bob'}, relationships: {}}, + }); + + // Root and list should still keep same reference + expect(root).toBe(rootRef); + expect(root['']).toBe(listRef); + }); + + // Root, parent, and children arrays all mutate in place; unchanged child rows keep refs: + // + // P1 ─┬─ [C1, C2] add C3 P1 ─┬─ [C1, C2, C3] + // ↑ │ ────► ↑ │ ↑ ↑ + // │ └─ same refs ───────────────┘ └───┴─ same refs + // └────────────────────────────────────┘ + test('parent and child arrays mutated in place, child rows preserved', () => { + const schemaWithRelationship: SourceSchema = { + tableName: 'parent', + columns: {id: {type: 'string'}, name: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: { + children: { + tableName: 'child', + columns: {id: {type: 'string'}, parentId: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: {}, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }, + }, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }; + + const formatWithRelationship: Format = { + singular: false, + relationships: { + children: { + singular: false, + relationships: {}, + }, + }, + }; + + const apply = (entry: Entry, change: ViewChange) => + applyChange( + entry, + // we freeze here to catch potential bugs where applyChange mutates the + // input change object (it shouldn't) + deepFreeze(change), + schemaWithRelationship, + '', + formatWithRelationship, + WITH_IDS, + MUTATE, + ); + + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + // Add parent with children + root = apply(root, { + type: 'add', + node: { + row: {id: 'p1', name: 'Parent1'}, + relationships: { + children: () => [ + {row: {id: 'c1', parentId: 'p1'}, relationships: {}}, + {row: {id: 'c2', parentId: 'p1'}, relationships: {}}, + ], + }, + }, + }); + + const parent1 = at(root, '', 0); + const childrenArrayRef = entries(parent1, 'children'); + const child1Ref = at(parent1, 'children', 0); + const child2Ref = at(parent1, 'children', 1); + + // Add a new child to the parent + root = apply(root, { + type: 'child', + node: {row: {id: 'p1', name: 'Parent1'}}, + child: { + relationshipName: 'children', + change: { + type: 'add', + node: {row: {id: 'c3', parentId: 'p1'}, relationships: {}}, + }, + }, + }); + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(entries(root, '')).toBe(listRef); + // Parent should keep same reference (mutated in place) + expect(at(root, '', 0)).toBe(parent1); + // Children array should keep same reference (mutated in place) + expect(entries(at(root, '', 0), 'children')).toBe(childrenArrayRef); + // Existing children should keep their references + expect(at(at(root, '', 0), 'children', 0)).toBe(child1Ref); + expect(at(at(root, '', 0), 'children', 1)).toBe(child2Ref); + // New child is added + expect(entries(at(root, '', 0), 'children')).toHaveLength(3); + }); + + // [A:rc=1] ──add A──► [A:rc=2] + // ↑ │ + // same array same array ref + test('refCount increment mutates entry', () => { + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const originalRef = at(root, '', 0); + const originalRefCount = (originalRef as {[refCountSymbol]: number})[ + refCountSymbol + ]; + expect(originalRefCount).toBe(1); + + // Add same row again (should increment refCount) + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alicia'}, relationships: {}}, + }); + + const newRef = at(root, '', 0); + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(entries(root, '')).toBe(listRef); + expect(newRef).toBe(originalRef); + // RefCount should be incremented + expect((newRef as {[refCountSymbol]: number})[refCountSymbol]).toBe( + originalRefCount + 1, + ); + }); + + // Sibling parents are independent. Changing P1's children doesn't touch P2: + // + // [P1─[C1], P2─[C2]] add C3 to P1 [P1─[C1,C3], P2─[C2]] + // ↑ ↑ ↑ ────► ↑ ↑ ↑ + // └───┴──────┴───────── all same refs ─┴───┴────────┘ + test('child change on one parent does not affect other parents', () => { + const schemaWithRelationship: SourceSchema = { + tableName: 'parent', + columns: {id: {type: 'string'}, name: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: { + children: { + tableName: 'child', + columns: {id: {type: 'string'}, parentId: {type: 'string'}}, + primaryKey: ['id'], + sort: [['id', 'asc']], + system: 'client', + relationships: {}, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }, + }, + isHidden: false, + compareRows: makeComparator([['id', 'asc']]), + }; + + const formatWithRelationship: Format = { + singular: false, + relationships: { + children: { + singular: false, + relationships: {}, + }, + }, + }; + + const apply = (entry: Entry, change: ViewChange) => + applyChange( + entry, + // we freeze here to catch potential bugs where applyChange mutates the + // input change object (it shouldn't) + deepFreeze(change), + schemaWithRelationship, + '', + formatWithRelationship, + WITH_IDS, + MUTATE, + ); + + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + // Add two parents with children + root = apply(root, { + type: 'add', + node: { + row: {id: 'p1', name: 'Parent1'}, + relationships: { + children: () => [ + {row: {id: 'c1', parentId: 'p1'}, relationships: {}}, + ], + }, + }, + }); + + root = apply(root, { + type: 'add', + node: { + row: {id: 'p2', name: 'Parent2'}, + relationships: { + children: () => [ + {row: {id: 'c2', parentId: 'p2'}, relationships: {}}, + ], + }, + }, + }); + + const parent1Ref = at(root, '', 0); + const parent2Ref = at(root, '', 1); + const parent2ChildrenRef = entries(parent2Ref, 'children'); + + // Add a child to parent1 only + root = apply(root, { + type: 'child', + node: {row: {id: 'p1', name: 'Parent1'}}, + child: { + relationshipName: 'children', + change: { + type: 'add', + node: {row: {id: 'c3', parentId: 'p1'}, relationships: {}}, + }, + }, + }); + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(entries(root, '')).toBe(listRef); + // Both parents should keep same reference (mutated in place) + expect(at(root, '', 0)).toBe(parent1Ref); + expect(at(root, '', 1)).toBe(parent2Ref); + // Parent2's children should keep same reference + expect(at(root, '', 1)['children']).toBe(parent2ChildrenRef); + }); + + // ═════════════════════════════════════════════════════════════════════════ + // VIEW ISOLATION TESTS + // Verify that different views never share object instances + // ═════════════════════════════════════════════════════════════════════════ + test('different views never share row instances', () => { + let view1: Entry = {'': []}; + let view2: Entry = {'': []}; + + // Add same row to both views + view1 = apply(view1, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + view2 = apply(view2, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + // Views should be different objects + expect(view1).not.toBe(view2); + expect(entries(view1, '')).not.toBe(entries(view2, '')); + // Row instances should be different (no sharing between views) + expect(at(view1, '', 0)).not.toBe(at(view2, '', 0)); + }); + + test('editing a row in one view does not affect other views', () => { + let view1: Entry = {'': []}; + let view2: Entry = {'': []}; + + // Add same row to both views + view1 = apply(view1, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + view2 = apply(view2, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const view2RowRef = at(view2, '', 0); + + // Edit row in view1 + view1 = apply(view1, { + type: 'edit', + oldNode: {row: {id: '1', name: 'Alice'}}, + node: {row: {id: '1', name: 'Alicia'}}, + }); + + // View1 should have updated data + expect(at(view1, '', 0)).toEqual( + expect.objectContaining({id: '1', name: 'Alicia'}), + ); + // View2 should be completely unchanged (same reference, same data) + expect(at(view2, '', 0)).toBe(view2RowRef); + expect(at(view2, '', 0)).toEqual( + expect.objectContaining({id: '1', name: 'Alice'}), + ); + }); + + // When withIDs is enabled with mutation, idSymbol is set by mutating the entry + test('edited row with withIDs mutates idSymbol in place', () => { + let root: Entry = {'': []}; + const rootRef = root; + const listRef = entries(root, ''); + + root = apply(root, { + type: 'add', + node: {row: {id: '1', name: 'Alice'}, relationships: {}}, + }); + + const originalRef = at(root, '', 0); + const originalId = (originalRef as {[idSymbol]?: string})[idSymbol]; + expect(originalId).toBeDefined(); + + root = apply(root, { + type: 'edit', + oldNode: {row: {id: '1', name: 'Alice'}}, + node: {row: {id: '1', name: 'Alicia'}}, + }); + + const newRef = at(root, '', 0); + const newId = (newRef as {[idSymbol]?: string})[idSymbol]; + + // Root and list should keep same reference (mutated in place) + expect(root).toBe(rootRef); + expect(entries(root, '')).toBe(listRef); + // Entry reference should stay the same (mutated in place) + expect(newRef).toBe(originalRef); + // idSymbol should be set on the mutated entry + expect(newId).toBeDefined(); + expect(newId).toBe(originalId); // Same ID since primary key unchanged + expect(newRef).toEqual( + expect.objectContaining({id: '1', name: 'Alicia'}), + ); + }); + }); }); diff --git a/packages/zql/src/ivm/view-apply-change.ts b/packages/zql/src/ivm/view-apply-change.ts index d88dbbe68d..ab4b3665f3 100644 --- a/packages/zql/src/ivm/view-apply-change.ts +++ b/packages/zql/src/ivm/view-apply-change.ts @@ -15,11 +15,43 @@ import type {Entry, Format} from './view.ts'; export const refCountSymbol = Symbol('rc'); export const idSymbol = Symbol('id'); -type MetaEntry = Writable & { - [refCountSymbol]: number; - [idSymbol]?: string | undefined; +type ReadonlyMetaEntry = Entry & { + readonly [refCountSymbol]: number; + readonly [idSymbol]?: string | undefined; +}; + +type MutableMetaEntry = Writable; + +/** + * MetaEntry is an Entry with internal tracking fields for reference counting + * and stable identity. All entries in the view tree are MetaEntry instances, + * created through makeNewMetaEntry(). + */ +type MetaEntry = M extends true + ? MutableMetaEntry + : ReadonlyMetaEntry; + +type MutableArray = M extends true ? T[] : readonly T[]; + +type MetaEntryList = MutableArray>; + +type MutableMetaEntryList = MutableMetaEntry[]; + +/** + * Node with eagerly-expanded relationships (arrays instead of generators). + * Used when batching changes to capture source state at push time. + */ +export type ExpandedNode = { + row: Row; + relationships: Record; }; -type MetaEntryList = MetaEntry[]; + +/** + * A node for view changes. Can be either: + * - A lazy Node with generator relationships (original behavior) + * - An ExpandedNode with pre-computed relationship arrays (for batching) + */ +export type ViewNode = Node | ExpandedNode; /** * `applyChange` does not consume the `relationships` of `ChildChange#node`, @@ -36,12 +68,12 @@ export type RowOnlyNode = {row: Row}; export type AddViewChange = { type: 'add'; - node: Node; + node: ViewNode; }; export type RemoveViewChange = { type: 'remove'; - node: Node; + node: ViewNode; }; type ChildViewChange = { @@ -69,6 +101,38 @@ export interface RefCountMap { delete(entry: Entry): boolean; } +/** + * Get child nodes from a relationship, handling both lazy (Node) and expanded (ExpandedNode). + */ +function* getChildNodes( + node: ViewNode, + relationship: string, +): Generator { + const children = node.relationships[relationship]; + if (Array.isArray(children)) { + // ExpandedNode: already an array + yield* children; + } else { + // Node: lazy generator function + yield* skipYields(children()); + } +} + +type Mutate = boolean; +type WithIDs = boolean; + +/** + * Immutable view update. Returns new Entry on change, same Entry if unchanged. + * Unchanged entries keep identity, enabling shallow comparison optimizations + * in UI frameworks (React.memo, Solid's fine-grained reactivity, etc). + * + * Propagation: recurse DOWN to find target, copy objects on the way UP. + * Siblings keep original refs. Only the ancestor path is copied. + * + * root {users:[A,B], items:[C,D,E]} --edit C--> root' {users:[A,B], items':[C',D,E]} + * │ same ref │ │ │ + * └─────────────────┴── unchanged ──────────────┘ new array C' new, D/E same + */ export function applyChange( parentEntry: Entry, change: ViewChange, @@ -76,46 +140,68 @@ export function applyChange( relationship: string, format: Format, withIDs = false, -): void { + mutate = false, +): Entry { + return applyChangeInternal( + parentEntry as MetaEntry, + change, + schema, + relationship, + format, + withIDs, + mutate, + ); +} + +export function applyChangeInternal( + parentEntry: MetaEntry, + change: ViewChange, + schema: SourceSchema, + relationship: string, + format: Format, + withIDs: WithIDs, + mutate: M, +): MetaEntry { if (schema.isHidden) { switch (change.type) { case 'add': - case 'remove': - for (const [relationship, children] of Object.entries( - change.node.relationships, - )) { + case 'remove': { + let currentParent = parentEntry; + for (const relationship of Object.keys(change.node.relationships)) { const childSchema = must(schema.relationships[relationship]); - for (const node of skipYields(children())) { - applyChange( - parentEntry, + for (const node of getChildNodes(change.node, relationship)) { + currentParent = applyChangeInternal( + currentParent, {type: change.type, node}, childSchema, relationship, format, withIDs, + mutate, ); } } - return; + return currentParent; + } case 'edit': // If hidden at this level it means that the hidden row was changed. If // the row was changed in such a way that it would change the // relationships then the edit would have been split into remove and // add. - return; + return parentEntry; case 'child': { const childSchema = must( schema.relationships[change.child.relationshipName], ); - applyChange( + return applyChangeInternal( parentEntry, change.child.change, childSchema, relationship, format, withIDs, + mutate, ); - return; } default: unreachable(change); @@ -124,85 +210,119 @@ export function applyChange( const {singular, relationships: childFormats} = format; switch (change.type) { + // ADD: Insert row (rc=1) or increment refCount if duplicate. + // RefCount tracks when the same row is reachable via multiple edges + // within a relationship: + // + // issue.labels: [L1, L2] both point to same creator + // │ │ │ + // ▼ ▼ ▼ + // label.creator ──────────► [User:rc=2] (one row, two refs) + // + // add(A) add(A) remove(A) remove(A) + // ↓ ↓ ↓ ↓ + // [A:rc=1] → [A:rc=2] → [A:rc=1] → (deleted) case 'add': { - let newEntry: MetaEntry | undefined; - if (singular) { - const oldEntry = parentEntry[relationship] as MetaEntry | undefined; + const oldEntry = getOptionalSingularEntry(parentEntry, relationship); if (oldEntry !== undefined) { + // Duplicate add: increment refCount assert( schema.compareRows(oldEntry, change.node.row) === 0, `Singular relationship '${relationship}' should not have multiple rows. You may need to declare this relationship with the \`many\` helper instead of the \`one\` helper in your schema.`, ); - // adding same again. - oldEntry[refCountSymbol]++; - } else { - newEntry = makeNewMetaEntry(change.node.row, schema, withIDs, 1); - (parentEntry as Writable)[relationship] = newEntry; + const newEntry = incRefCount(mutate, oldEntry); + return setRelation(mutate, parentEntry, relationship, newEntry); + } else { + // New row: create with rc=1, initialize nested relationships + const newEntry = makeNewMetaEntry( + change.node.row, + schema, + withIDs, + 1, + ); + initializeRelationshipsForNewEntryIfAny( + newEntry, + change.node, + schema, + childFormats, + withIDs, + ); + return setRelation(true, parentEntry, relationship, newEntry); } } else { - newEntry = add( + // Plural: binary search for position, insert or increment refCount + const view = getChildEntryList(parentEntry, relationship); + const {newEntry, newView} = add( change.node.row, - getChildEntryList(parentEntry, relationship), + view, schema, withIDs, + mutate, ); - } - if (newEntry) { - for (const [relationship, children] of Object.entries( - change.node.relationships, - )) { - // TODO: Is there a flag to make TypeScript complain that dictionary access might be undefined? - const childSchema = must(schema.relationships[relationship]); - const childFormat = childFormats[relationship]; - if (childFormat === undefined) { - continue; - } - - const newView = childFormat.singular - ? undefined - : ([] as MetaEntryList); - newEntry[relationship] = newView; - - for (const node of skipYields(children())) { - applyChange( - newEntry, - {type: 'add', node}, - childSchema, - relationship, - childFormat, - withIDs, - ); - } + if (newEntry) { + initializeRelationshipsForNewEntryIfAny( + newEntry, + change.node, + schema, + childFormats, + withIDs, + ); } + return setRelation(mutate, parentEntry, relationship, newView); } - break; } + // REMOVE: Decrement refCount, physically remove when rc=0. case 'remove': { if (singular) { - const oldEntry = parentEntry[relationship] as MetaEntry | undefined; - assert(oldEntry !== undefined, 'node does not exist'); + const oldEntry = getSingularEntry(parentEntry, relationship); const rc = oldEntry[refCountSymbol]; if (rc === 1) { - (parentEntry as Writable)[relationship] = undefined; + return setRelation(mutate, parentEntry, relationship, undefined); } - oldEntry[refCountSymbol]--; + const newEntry = decRefCount(mutate, oldEntry); + return setRelation(mutate, parentEntry, relationship, newEntry); } else { - removeAndUpdateRefCount( - getChildEntryList(parentEntry, relationship), + const view = getChildEntryList(parentEntry, relationship); + const newView = removeAndUpdateRefCount( + view, change.node.row, schema.compareRows, + mutate, ); + return setRelation(mutate, parentEntry, relationship, newView); } - break; } + // CHILD: Propagate nested change up to this level (leaf-to-root pattern). case 'child': { - let existing: MetaEntry; + const childSchema = must( + schema.relationships[change.child.relationshipName], + ); + const childFormat = format.relationships[change.child.relationshipName]; + if (childFormat === undefined) { + return parentEntry; // Relationship not in view format + } + if (singular) { - existing = getSingularEntry(parentEntry, relationship); + const existing = getSingularEntry(parentEntry, relationship); + const newExisting = applyChangeInternal( + existing, + change.child.change, + childSchema, + change.child.relationshipName, + childFormat, + withIDs, + mutate, + ); + // Preserve identity if child didn't change (enables shallow-compare optimizations). + if (newExisting === existing) { + return parentEntry; + } + return setRelation(mutate, parentEntry, relationship, newExisting); } else { + // Find the target row in the sorted array via binary search. const view = getChildEntryList(parentEntry, relationship); const {pos, found} = binarySearch( view, @@ -210,33 +330,48 @@ export function applyChange( schema.compareRows, ); assert(found, 'node does not exist'); - existing = view[pos]; - } - - const childSchema = must( - schema.relationships[change.child.relationshipName], - ); - const childFormat = format.relationships[change.child.relationshipName]; - if (childFormat !== undefined) { - applyChange( + const existing = view[pos]; + const newExisting = applyChangeInternal( existing, change.child.change, childSchema, change.child.relationshipName, childFormat, withIDs, + mutate, + ); + // Preserve identity if descendant didn't change. + if (newExisting === existing) { + return parentEntry; + } + // applyChangeInternal preserves MetaEntry structure when input is MetaEntry + assertMetaEntry(newExisting); + return setRelation( + mutate, + parentEntry, + relationship, + arrayWith(mutate, view, pos, newExisting), ); } - break; } + // EDIT: Update row fields. If sort key changes, row may move position. + // + // Position change with rc>1 (two query paths reach same row): + // + // Before: [A, B(rc=2), C, D] After: [A, B(rc=1), C, B'(rc=1), D] + // │ │ │ + // path1 + path2 path1 ghost path2 moved + // + // Why ghost stays: path1 still expects B at old position. + // B' appears where path2's sort order places it. case 'edit': { if (singular) { - const existing = parentEntry[relationship]; - assertMetaEntry(existing); - applyEdit(existing, change, schema, withIDs); + const existing = getSingularEntry(parentEntry, relationship); + const newEntry = applyEdit(existing, change, schema, withIDs, mutate); + return setRelation(mutate, parentEntry, relationship, newEntry); } else { const view = getChildEntryList(parentEntry, relationship); - // The position of the row in the list may have changed due to the edit. + // Sort key changed: row may need to move if (schema.compareRows(change.oldNode.row, change.node.row) !== 0) { const {pos: oldPos, found: oldFound} = binarySearch( view, @@ -251,115 +386,322 @@ export function applyChange( schema.compareRows, ); // A special case: - // when refCount is 1 (so the row is being moved - // without leaving a placeholder behind), and the new pos is - // the same as the old, or directly after the old (so after the remove - // of the old it would be in the same pos): - // the row does not need to be moved, it can just be edited in place. + // when refCount is 1 (so the row is being moved without leaving a + // placeholder behind), and the new pos is the same as the old, or + // directly after the old (so after the remove of the old it would be + // in the same pos): the row does not need to be moved, just edited. if ( oldEntry[refCountSymbol] === 1 && (pos === oldPos || pos - 1 === oldPos) ) { - applyEdit(oldEntry, change, schema, withIDs); + const newEntry = applyEdit( + oldEntry, + change, + schema, + withIDs, + mutate, + ); + return setRelation( + mutate, + parentEntry, + relationship, + arrayWith(mutate, view, oldPos, newEntry), + ); } else { - // Move the row. If the row has > 1 ref count, an edit should - // be received for each ref count. On the first edit, the original - // row is moved, the edit is applied to it and its ref count is set - // to 1. A shallow copy of the row is left at the old pos for - // processing of the remaining edit, and the copy's ref count - // is decremented. As each edit is received the ref count of the - // copy is decrement, and the ref count of the row at the new - // position is incremented. When the copy's ref count goes to 0, - // it is removed. - oldEntry[refCountSymbol]--; + // Move the row. If rc > 1, an edit will be received for each ref. + // On first edit: move row, apply edit, set rc=1. Leave a copy at + // old pos with decremented rc. As each edit arrives, old copy's rc + // decrements and new pos rc increments. When copy rc hits 0, remove. + const newRefCount = oldEntry[refCountSymbol] - 1; + let newView: MutableMetaEntryList; let adjustedPos = pos; - if (oldEntry[refCountSymbol] === 0) { - view.splice(oldPos, 1); + + if (newRefCount === 0) { + newView = removeAt(mutate, view, oldPos); adjustedPos = oldPos < pos ? pos - 1 : pos; + } else { + const oldEntryCopy = setRefCount(mutate, oldEntry, newRefCount); + newView = arrayWith(mutate, view, oldPos, oldEntryCopy); } - let entryToEdit; if (found) { - entryToEdit = view[adjustedPos]; + // Merge with existing at new pos + const existingEntry = newView[adjustedPos]; + const editedEntry = applyEdit( + existingEntry, + change, + schema, + withIDs, + mutate, + ); + const updatedEntry = setRefCount( + mutate, + editedEntry, + existingEntry[refCountSymbol] + 1, + ); + return setRelation( + mutate, + parentEntry, + relationship, + arrayWith(mutate, newView, adjustedPos, updatedEntry), + ); } else { - view.splice(adjustedPos, 0, oldEntry); - entryToEdit = oldEntry; - if (oldEntry[refCountSymbol] > 0) { - const oldEntryCopy = {...oldEntry}; - view[oldPos] = oldEntryCopy; - } + // Insert at new pos with rc=1 + const editedEntry = applyEdit( + oldEntry, + change, + schema, + withIDs, + mutate, + ); + const movedEntry = setRefCount(mutate, editedEntry, 1); + return setRelation( + mutate, + parentEntry, + relationship, + insertAt(mutate, newView, adjustedPos, movedEntry), + ); } - entryToEdit[refCountSymbol]++; - applyEdit(entryToEdit, change, schema, withIDs); } } else { - // Position could not have changed, so simply edit in place. + // Sort key unchanged: edit in place const {pos, found} = binarySearch( view, change.oldNode.row, schema.compareRows, ); assert(found, 'node does not exist'); - applyEdit(view[pos], change, schema, withIDs); + const newEntry = applyEdit( + view[pos], + change, + schema, + withIDs, + mutate, + ); + return setRelation( + mutate, + parentEntry, + relationship, + arrayWith(mutate, view, pos, newEntry), + ); } } - - break; } default: unreachable(change); } } -function applyEdit( - existing: MetaEntry, +/** + * Batch apply multiple changes to an Entry tree. + * For small batches or complex cases, falls back to sequential applyChange. + * Future optimization: O(N + K) batch processing for large K. + */ +export function applyChanges( + parentEntry: Entry, + changes: ViewChange[], + schema: SourceSchema, + relationship: string, + format: Format, + withIDs: WithIDs = false, + mutate: Mutate = false, +): Entry { + let result = parentEntry; + for (const change of changes) { + result = applyChange( + result, + change, + schema, + relationship, + format, + withIDs, + mutate, + ); + } + return result; +} + +function applyEdit( + existing: MetaEntry, change: EditViewChange, schema: SourceSchema, - withIDs: boolean, -) { - Object.assign(existing, change.node.row); + withIDs: WithIDs, + mutate: Mutate, +): MetaEntry { + const newEntry: MutableMetaEntry = + // Even for mutate we want to create a new entry if the primary key changed. + mutate && schema.compareRows(change.oldNode.row, change.node.row) === 0 + ? Object.assign(existing, change.node.row) + : {...existing, ...change.node.row}; + if (withIDs) { - existing[idSymbol] = makeID(change.node.row, schema); + return setProperty( + mutate, + newEntry, + idSymbol, + makeID(change.node.row, schema), + ); } + return newEntry; } -function add( +/** + * Initialize child relationships on a newly-added entry. + * Returns the same entry reference if no relationships to initialize, + * or a new entry (via spread) if relationships were added. + * + * New nodes don't exist in the view yet, so we can build in-place (no refs to preserve): + * + * Existing node edit (must path-copy): New node (can build in-place): + * + * view: [A, B, C] view: [A, B, _] + * │ │ + * edit C.child add C with children + * │ │ + * ▼ ▼ + * view': [A, B, C'] ◄─ path-copy view': [A, B, C{children:[...]}] + * up the tree └─ built in-place + * + * Hidden schemas still use applyChange to collapse junction levels. + */ +function initializeRelationshipsForNewEntryIfAny( + entry: MutableMetaEntry, + node: ViewNode, + schema: SourceSchema, + childFormats: Record, + withIDs: WithIDs, +): void { + let result = entry; + for (const relationship of Object.keys(node.relationships)) { + const childSchema = must(schema.relationships[relationship]); + const childFormat = childFormats[relationship]; + if (childFormat === undefined) { + continue; + } + + // Hidden/singular: use applyChange to handle properly + if (childSchema.isHidden || childFormat.singular) { + const newView = childFormat.singular + ? undefined + : ([] as MutableMetaEntryList); + result[relationship] = newView; + + for (const childNode of getChildNodes(node, relationship)) { + applyChangeInternal( + result, + {type: 'add', node: childNode}, + childSchema, + relationship, + childFormat, + withIDs, + true, // this is a new entry, so we can mutate + ); + } + } else { + // Plural non-hidden: build array in-place for efficiency + const childArray: MutableMetaEntryList = []; + + for (const childNode of getChildNodes(node, relationship)) { + const newEntry = makeNewMetaEntry( + childNode.row, + childSchema, + withIDs, + 1, + ); + const {pos, found} = binarySearch( + childArray, + childNode.row, + childSchema.compareRows, + ); + + if (found) { + childArray[pos][refCountSymbol]++; + } else { + childArray.splice(pos, 0, newEntry); + initializeRelationshipsForNewEntryIfAny( + newEntry, + childNode, + childSchema, + childFormat.relationships, + withIDs, + ); + } + } + + result[relationship] = childArray; + } + } +} + +function add( row: Row, - view: MetaEntryList, + view: MetaEntryList, schema: SourceSchema, - withIDs: boolean, -): MetaEntry | undefined { + withIDs: WithIDs, + mutate: M, +): { + newEntry: MutableMetaEntry | undefined; + newView: MutableMetaEntryList; +} { const {pos, found} = binarySearch(view, row, schema.compareRows); if (found) { - view[pos][refCountSymbol]++; - return undefined; + const existing = view[pos]; + + const updated = incRefCount(mutate, existing); + return { + newEntry: undefined, + newView: arrayWith(mutate, view, pos, updated), + }; } const newEntry = makeNewMetaEntry(row, schema, withIDs, 1); - view.splice(pos, 0, newEntry); - return newEntry; + return {newEntry, newView: insertAt(mutate, view, pos, newEntry)}; } -function removeAndUpdateRefCount( - view: MetaEntryList, +function insertAt( + mutate: M, + array: MutableArray, + index: number, + item: T, +): T[] { + if (mutate) { + (array as T[]).splice(index, 0, item); + return array as T[]; + } + return array.toSpliced(index, 0, item); +} + +function removeAt( + mutate: M, + array: MutableArray, + index: number, +): T[] { + if (mutate) { + (array as T[]).splice(index, 1); + return array as T[]; + } + return array.toSpliced(index, 1); +} + +function removeAndUpdateRefCount( + view: MetaEntryList, row: Row, compareRows: Comparator, -): MetaEntry { + mutate: M, +): MutableMetaEntryList { const {pos, found} = binarySearch(view, row, compareRows); assert(found, 'node does not exist'); const oldEntry = view[pos]; const rc = oldEntry[refCountSymbol]; if (rc === 1) { - view.splice(pos, 1); + return removeAt(mutate, view, pos); } - oldEntry[refCountSymbol]--; - - return oldEntry; + const newEntry = decRefCount(mutate, oldEntry); + return arrayWith(mutate, view, pos, newEntry); } -// TODO: Do not return an object. It puts unnecessary pressure on the GC. function binarySearch( - view: MetaEntryList, + view: MetaEntryList, target: Row, comparator: Comparator, ) { @@ -367,7 +709,8 @@ function binarySearch( let high = view.length - 1; while (low <= high) { const mid = (low + high) >>> 1; - const comparison = comparator(view[mid] as Row, target as Row); + // MetaEntry has all Row props; comparator only reads string keys + const comparison = comparator(view[mid] as Row, target); if (comparison < 0) { low = mid + 1; } else if (comparison > 0) { @@ -379,36 +722,61 @@ function binarySearch( return {pos: low, found: false}; } -function getChildEntryList( - parentEntry: Entry, +/** Assert value is MetaEntry (has refCountSymbol). */ +function assertMetaEntry( + v: unknown, +): asserts v is MetaEntry { + assertNumber((v as Partial>)[refCountSymbol]); +} + +/** Get singular MetaEntry, throws if missing. */ +function getSingularEntry( + parentEntry: MetaEntry, relationship: string, -): MetaEntryList { - const view = parentEntry[relationship]; - assertArray(view); - return view as MetaEntryList; +): MetaEntry { + const entry = parentEntry[relationship]; + assert(entry !== undefined, 'node does not exist'); + assertMetaEntry(entry); + return entry; } -function assertMetaEntry(v: unknown): asserts v is MetaEntry { - assertNumber((v as Partial)[refCountSymbol]); +/** Get singular MetaEntry or undefined if not set. */ +function getOptionalSingularEntry( + parentEntry: MetaEntry, + relationship: string, +): MetaEntry | undefined { + const entry = parentEntry[relationship]; + if (entry === undefined) { + return undefined; + } + assertMetaEntry(entry); + return entry; } -function getSingularEntry(parentEntry: Entry, relationship: string): MetaEntry { - const e = parentEntry[relationship]; - assertNumber((e as Partial)[refCountSymbol]); - return e as MetaEntry; +/** Get child array as MetaEntryList. */ +function getChildEntryList( + parentEntry: MetaEntry, + relationship: string, +): MetaEntryList { + const view = parentEntry[relationship]; + assertArray(view); + return view as MetaEntryList; } +/** Create MetaEntry from row with given refCount. */ function makeNewMetaEntry( row: Row, schema: SourceSchema, - withIDs: boolean, + withIDs: WithIDs, rc: number, -): MetaEntry { +): MutableMetaEntry { + // This creates a new MetaEntry from a Row. We never mutate Rows. if (withIDs) { return {...row, [refCountSymbol]: rc, [idSymbol]: makeID(row, schema)}; } return {...row, [refCountSymbol]: rc}; } + function makeID(row: Row, schema: SourceSchema) { // optimization for case of non-compound primary key if (schema.primaryKey.length === 1) { @@ -416,3 +784,66 @@ function makeID(row: Row, schema: SourceSchema) { } return JSON.stringify(schema.primaryKey.map(k => row[k])); } + +function incRefCount( + mutate: M, + entry: MetaEntry, +): MutableMetaEntry { + return setRefCount(mutate, entry, entry[refCountSymbol] + 1); +} + +function decRefCount( + mutate: M, + entry: MetaEntry, +): MutableMetaEntry { + return setRefCount(mutate, entry, entry[refCountSymbol] - 1); +} + +function setRefCount( + mutate: M, + entry: MetaEntry, + count: number, +): MutableMetaEntry { + if (mutate) { + (entry as MutableMetaEntry)[refCountSymbol] = count; + return entry; + } + return {...entry, [refCountSymbol]: count}; +} + +function arrayWith( + mutate: M, + array: MutableArray, + index: number, + value: T, +): T[] { + if (mutate) { + (array as T[])[index] = value; + return array as T[]; + } + return array.with(index, value); +} + +function setProperty< + M extends Mutate, + K extends string | keyof MetaEntry, + V, +>( + mutate: M, + parentEntry: MetaEntry, + key: K, + value: V, +): MutableMetaEntry & {[P in K]: V} { + if (mutate) { + (parentEntry as {[P in K]: V})[key] = value; + return parentEntry as MutableMetaEntry & {[P in K]: V}; + } + return {...parentEntry, [key]: value}; +} + +const setRelation: ( + mutate: M, + parentEntry: MetaEntry, + relationship: string, + value: Entry | Entry[] | undefined, +) => MutableMetaEntry = setProperty; diff --git a/packages/zql/src/query/query-delegate-base.ts b/packages/zql/src/query/query-delegate-base.ts index 7ad9da3b07..a472bf4589 100644 --- a/packages/zql/src/query/query-delegate-base.ts +++ b/packages/zql/src/query/query-delegate-base.ts @@ -433,8 +433,6 @@ function arrayViewFactory< updateTTL, ); v.onDestroy = onDestroy; - onTransactionCommit(() => { - v.flush(); - }); + onTransactionCommit(() => v.flush()); return v; } diff --git a/packages/zql/src/query/query-impl.query.test.ts b/packages/zql/src/query/query-impl.query.test.ts index 7f02305caa..8e5bc8ee80 100644 --- a/packages/zql/src/query/query-impl.query.test.ts +++ b/packages/zql/src/query/query-impl.query.test.ts @@ -6,8 +6,8 @@ import {must} from '../../../shared/src/must.ts'; import {relationships} from '../../../zero-schema/src/builder/relationship-builder.ts'; import {createSchema} from '../../../zero-schema/src/builder/schema-builder.ts'; import {number, table} from '../../../zero-schema/src/builder/table-builder.ts'; -import {createSource} from '../ivm/test/source-factory.ts'; import {consume} from '../ivm/stream.ts'; +import {createSource} from '../ivm/test/source-factory.ts'; import type {QueryDelegate} from './query-delegate.ts'; import {newQuery} from './query-impl.ts'; import {asQueryInternals} from './query-internals.ts'; diff --git a/tsconfig.json b/tsconfig.json index 59da6fd5c2..28b7788f7e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "es2022", - "lib": ["ES2022", "ES2023.Collection", "DOM", "DOM.Iterable"], + "lib": ["ES2022", "ES2023.Array", "ES2023.Collection", "DOM", "DOM.Iterable"], "module": "NodeNext", "verbatimModuleSyntax": true, "erasableSyntaxOnly": true, From 7926119f1a5c0fab3c6371c2cfdc0d7cac3e67bb Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 12 Feb 2026 13:07:42 -0800 Subject: [PATCH 052/495] chore(zero-cache): improved error handling of backfill streams (#5547) Improve the backfill stream and manager to handle: * schema failures from COPY requests due to the fact that transaction snapshots [do not always guarantee DDL consistency for `ALTER TABLE`](https://www.postgresql.org/docs/current/mvcc-caveats.html), rendering the previous schema check insufficient for guaranteeing that the COPY will succeed. * non-empty tables without a primary key. These will result in a logged error and be retried with exponential backoff. (Tables without primary keys are replicated, but not synced to downstream clients anyway) Tangential fix: * Also thread the JSON_FORMAT through the backfill request manager so that stringified JSON in `backfill` messages can be properly handled by the replicator --- .../common/backfill-manager.test.ts | 143 ++++++++++++++++-- .../change-source/common/backfill-manager.ts | 131 ++++++++++++---- .../change-source/pg/backfill-stream.ts | 39 +++-- 3 files changed, 259 insertions(+), 54 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts index b86f2048de..c55e0aab0f 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts @@ -4,6 +4,7 @@ import {createSilentLogContext} from '../../../../../shared/src/logging-test-uti import {must} from '../../../../../shared/src/must.ts'; import {Queue} from '../../../../../shared/src/queue.ts'; import {sleep} from '../../../../../shared/src/sleep.ts'; +import {JSON_PARSED} from '../../../types/lite.ts'; import { majorVersionFromString, majorVersionToString, @@ -32,6 +33,7 @@ describe('backfill-manager', () => { lc, changeStream, backfillStreamer, + JSON_PARSED, 10, 50, ); @@ -116,7 +118,7 @@ describe('backfill-manager', () => { ]); expect(await drainChanges(5)).toMatchObject([ - ['begin', {tag: 'begin'}, {commitWatermark: '123.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], [ 'data', { @@ -243,7 +245,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '125'}], - ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], [ 'data', { @@ -361,7 +363,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '130'}], - ['begin', {tag: 'begin'}, {commitWatermark: '130.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '130.01'}], [ 'data', { @@ -539,7 +541,7 @@ describe('backfill-manager', () => { changeStream.release('125'); expect((await drainChanges(15)).slice(-3)).toMatchObject([ - ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], [ 'data', { @@ -633,7 +635,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '125'}], - ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], [ 'data', { @@ -733,7 +735,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '125'}], - ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], [ 'data', { @@ -836,7 +838,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '125'}], - ['begin', {tag: 'begin'}, {commitWatermark: '125.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], [ 'data', { @@ -970,7 +972,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '140'}], - ['begin', {tag: 'begin'}, {commitWatermark: '140.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '140.01'}], [ 'data', { @@ -1192,7 +1194,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '140'}], - ['begin', {tag: 'begin'}, {commitWatermark: '140.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '140.01'}], [ 'data', { @@ -1217,7 +1219,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '140.01'}], - ['begin', {tag: 'begin'}, {commitWatermark: '140.02'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '140.02'}], [ 'data', { @@ -1292,7 +1294,7 @@ describe('backfill-manager', () => { ]); expect(await drainChanges(3)).toMatchObject([ - ['begin', {tag: 'begin'}, {commitWatermark: '123.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], [ 'data', { @@ -1340,6 +1342,115 @@ describe('backfill-manager', () => { ]); }); + test('backfill retried for non-empty table without row key', async () => { + testStreams.push( + [ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: []}}, + columns: ['id'], + watermark: '150', + rowValues: [[1]], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: []}}, + columns: ['id'], + }, + ], + [ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: []}}, + columns: ['id'], + watermark: '150', + rowValues: [[1]], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: []}}, + columns: ['id'], + }, + ], + // This time the table has a row key. + [ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['id']}}, + columns: [], + watermark: '188', + rowValues: [[1]], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['id']}}, + columns: [], + }, + ], + ); + + void backfillManager.run('123', [ + { + columns: {id: {id: '123'}}, + table: { + metadata: {rowKey: {}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + + expect(await drainChanges(4)).toMatchObject([ + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], + [ + 'data', + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['id']}}, + columns: [], + watermark: '188', + rowValues: [[1]], + }, + ], + [ + 'data', + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['id']}}, + columns: [], + }, + ], + ['commit', {tag: 'commit'}, {watermark: '123.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + { + columns: {id: {id: '123'}}, + table: { + metadata: {rowKey: {}}, + name: 'bar', + schema: 'foo', + }, + }, + { + columns: {id: {id: '123'}}, + table: { + metadata: {rowKey: {}}, + name: 'bar', + schema: 'foo', + }, + }, + { + columns: {id: {id: '123'}}, + table: { + metadata: {rowKey: {}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + }); + test('backfill stream yields to other stream reservations', async () => { testStreams.push([ { @@ -1403,7 +1514,7 @@ describe('backfill-manager', () => { // Each 'backfill' message is wrapped in a separate transaction because // the backfill-manager yielded the stream between every message. expect(await drainChanges(15)).toMatchObject([ - ['begin', {tag: 'begin'}, {commitWatermark: '141.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '141.01'}], [ 'data', { @@ -1419,7 +1530,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '141.01'}], - ['begin', {tag: 'begin'}, {commitWatermark: '142.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '142.01'}], [ 'data', { @@ -1435,7 +1546,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '142.01'}], - ['begin', {tag: 'begin'}, {commitWatermark: '143.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '143.01'}], [ 'data', { @@ -1451,7 +1562,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '143.01'}], - ['begin', {tag: 'begin'}, {commitWatermark: '144.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '144.01'}], [ 'data', { @@ -1467,7 +1578,7 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '144.01'}], - ['begin', {tag: 'begin'}, {commitWatermark: '145.01'}], + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '145.01'}], [ 'data', { diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts index 346fee66b0..35e604a40d 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -3,6 +3,8 @@ import {assert} from '../../../../../shared/src/asserts.ts'; import {stringify} from '../../../../../shared/src/bigint-json.ts'; import {CustomKeyMap} from '../../../../../shared/src/custom-key-map.ts'; import {must} from '../../../../../shared/src/must.ts'; +import {randInt} from '../../../../../shared/src/rand.ts'; +import {JSON_STRINGIFIED, type JSONFormat} from '../../../types/lite.ts'; import { majorVersionToString, stateVersionFromString, @@ -67,6 +69,7 @@ export class BackfillManager implements Cancelable, Listener { ); readonly #changeStreamer: ChangeStreamMultiplexer; readonly #backfillStreamer: BackfillStreamer; + readonly #jsonFormat: JSONFormat; /** * The current running backfill. The backfill request is always also in @@ -83,12 +86,14 @@ export class BackfillManager implements Cancelable, Listener { lc: LogContext, changeStreamer: ChangeStreamMultiplexer, backfillStreamer: BackfillStreamer, + jsonFormat: JSONFormat = JSON_STRINGIFIED, minBackoffMs = MIN_BACKOFF_INTERVAL_MS, maxBackoffMs = MAX_BACKOFF_INTERVAL_MS, ) { this.#lc = lc.withContext('component', 'backfill-manager'); this.#changeStreamer = changeStreamer; this.#backfillStreamer = backfillStreamer; + this.#jsonFormat = jsonFormat; this.#minBackoffMs = minBackoffMs; this.#maxBackoffMs = maxBackoffMs; this.#retryDelayMs = minBackoffMs; @@ -108,30 +113,42 @@ export class BackfillManager implements Cancelable, Listener { #backfillRetryTimer: NodeJS.Timeout | undefined; #checkAndStartBackfill() { - if (!this.#backfillRetryTimer && !this.#runningBackfill) { - // Use the iterator to pick the first request. - for (const first of this.#requiredBackfills.values()) { - const state = {request: first, minMajorVersion: ''}; - const lc = this.#lc.withContext('table', first.table.name); - - this.#runningBackfill = state; - void this.#runBackfill(lc, state) - .then(() => { - this.#stopRunningBackfill('backfill exited', state); - this.#retryDelayMs = this.#minBackoffMs; // reset on success - }) - // For unexpected errors (e.g. upstream replication slot - // unavailability), retry with exponential backoff. - .catch(e => { - this.#stopRunningBackfill(String(e), state); - this.#retryBackfillWithBackoff(e); - }); - return; - } + if ( + !this.#backfillRetryTimer && + !this.#runningBackfill && + this.#requiredBackfills.size + ) { + // Pick a random backfill to avoid head-of-line blocking by a + // problematic backfill (e.g. awaiting a primary key). This is + // simpler that adding logic to classify (and declassify) + // problematic backfills. + const candidates = [...this.#requiredBackfills.values()]; + const request = candidates[randInt(0, candidates.length - 1)]; + const state = {request, minMajorVersion: ''}; + const lc = this.#lc.withContext('table', request.table.name); + + this.#runningBackfill = state; + void this.#runBackfill(lc, state) + .then(() => { + this.#stopRunningBackfill('backfill exited', state); + this.#retryDelayMs = this.#minBackoffMs; // reset on success + }) + // For unexpected errors (e.g. upstream replication slot + // unavailability), retry with exponential backoff. + .catch(e => { + this.#stopRunningBackfill(String(e), state); + this.#retryBackfillWithBackoff(e); + }); } } #retryBackfillWithBackoff(e: unknown) { + if (e instanceof SchemaIncompatibilityError) { + this.#lc.info?.(`Schema incompatibility detected by backfill stream`, e); + // No need for backoff with schema incompatibility errors + this.#checkAndStartBackfill(); + return; + } const log = this.#retryDelayMs === this.#maxBackoffMs ? 'error' : 'warn'; this.#lc[log]?.( `Error running backfill. Retrying in ${this.#retryDelayMs} ms`, @@ -185,7 +202,11 @@ export class BackfillManager implements Cancelable, Listener { minor: BigInt(minor) + 1n, }); - void changeStream.push(['begin', {tag: 'begin'}, {commitWatermark: tx}]); + void changeStream.push([ + 'begin', + {tag: 'begin', json: this.#jsonFormat}, + {commitWatermark: tx}, + ]); return (backfillTx = tx); }; @@ -205,6 +226,14 @@ export class BackfillManager implements Cancelable, Listener { // If necessary, yield the reservation to the main stream. backfillTx && changeStream.waiterDelay() > 0 && commitTx(); + if ( + msg.tag === 'backfill' && + msg.rowValues.length > 0 && + msg.relation.rowKey.columns.length === 0 + ) { + throw new MissingRowKeyError(state.request); + } + // Reserve the changeStreamer if not in a transaction. if ((backfillTx ??= await beginTxFor(msg)) === null) { lc.info?.( @@ -249,17 +278,16 @@ export class BackfillManager implements Cancelable, Listener { } #setRequiredBackfill(source: string, req: BackfillRequest) { - const exists = this.#requiredBackfills.has(req.table); - this.#lc.info?.(`Backfill ${exists ? 'updated' : 'added'} by ${source}`, { - backfill: req, - }); + const action = this.#requiredBackfills.has(req.table) ? 'updated' : 'added'; + this.#lc.info?.(`Backfill ${action}: ${source}`, {backfill: req}); this.#requiredBackfills.set(req.table, req); } #deleteRequiredBackfill(source: string, id: Identifier) { const req = this.#requiredBackfills.get(id); if (req) { - this.#lc.info?.(`Backfill dropped by ${source}`, {backfill: req}); + const action = source === 'backfill-completed' ? 'completed' : 'dropped'; + this.#lc.info?.(`Backfill ${action}: ${source}`, {backfill: req}); this.#requiredBackfills.delete(id); } } @@ -470,3 +498,54 @@ export class BackfillManager implements Cancelable, Listener { clearTimeout(this.#backfillRetryTimer); } } + +abstract class BackfillStreamError extends Error { + constructor(bf: BackfillRequest, msg: string, cause?: unknown) { + super( + `Cannot backfill ${bf.table.schema}.${bf.table.name}` + + `[${Object.keys(bf.columns).join(',')}]: ${msg}`, + {cause}, + ); + } +} + +/** + * Background: The zero-cache supports replication of tables without a + * PRIMARY KEY to facilitate the onboarding process. These rows can be + * INSERT'ed, but postgres will rightfully prohibit UPDATEs and DELETEs + * on such tables because the rows cannot be identified by a key. Supporting + * this mode of replication allows the user to "fix" the setup by adding the + * primary key, after which the table can be published downstream without + * requiring a resync of the data. + * + * In terms of backfill, however, non-empty tables without a row key **cannot** + * be backfilled, because backfill retries would result in writing duplicating + * rows. (Empty tables, on the other hand, are fine because there is no data + * to be deduped.) + * + * The MissingRowKeyError is used to signal that the table cannot be backfilled + * in its current state. For simplicity, it is handled like runtime errors and + * retried with backoff, with which it can eventually succeed if (1) a primary + * key is added or (2) the table is emptied, e.g. via a TRUNCATE. + */ +class MissingRowKeyError extends BackfillStreamError { + readonly name = 'MissingRowKeyError'; + + constructor(bf: BackfillRequest, cause?: unknown) { + super(bf, `"${bf.table.name}" is missing a PRIMARY KEY`, cause); + } +} + +/** + * Error type for backfill stream implementations to throw indicating that + * the backfill request failed to due a schema incompatibility error. This + * type of error does not need exponential backoff, as the retry happens + * naturally once the invalidating schema change is processed and committed. + */ +export class SchemaIncompatibilityError extends BackfillStreamError { + readonly name = 'SchemaIncompatibilityError'; + + constructor(bf: BackfillRequest, msg: string, cause?: unknown) { + super(bf, msg, cause); + } +} diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts index 40672ef10c..3db0f5176e 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts @@ -1,5 +1,10 @@ +import { + PG_UNDEFINED_COLUMN, + PG_UNDEFINED_TABLE, +} from '@drdgvhbh/postgres-error-codes'; import type {LogContext} from '@rocicorp/logger'; import {getDefaultHighWaterMark} from 'node:stream'; +import postgres from 'postgres'; import {equals} from '../../../../../shared/src/set-utils.ts'; import * as v from '../../../../../shared/src/valita.ts'; import {READONLY} from '../../../db/mode-enum.ts'; @@ -8,6 +13,7 @@ import {getTypeParsers, type TypeParser} from '../../../db/pg-type-parser.ts'; import type {PublishedTableSpec} from '../../../db/specs.ts'; import {TransactionPool} from '../../../db/transaction-pool.ts'; import {pgClient} from '../../../types/pg.ts'; +import {SchemaIncompatibilityError} from '../common/backfill-manager.ts'; import type { BackfillCompleted, BackfillRequest, @@ -76,9 +82,29 @@ export async function* streamBackfill( cols.map(col => types.getTypeParser(tableSpec.columns[col].typeOID)), flushThresholdBytes, ); + } catch (e) { + // Although we make the best effort to validate the schema at the + // transaction snapshot, certain forms of `ALTER TABLE` are not + // MVCC safe and not "frozen" in the snapshot: + // + // https://www.postgresql.org/docs/current/mvcc-caveats.html + // + // Handle these errors as schema incompatibility errors rather than + // unknown runtime errors. + if ( + e instanceof postgres.PostgresError && + (e.code === PG_UNDEFINED_TABLE || e.code === PG_UNDEFINED_COLUMN) + ) { + throw new SchemaIncompatibilityError(bf, String(e), {cause: e}); + } + throw e; } finally { tx.setDone(); - await db.end(); + // errors are already thrown and handled from processReadTask() + void tx.done().catch(() => {}); + // Workaround postgres.js hanging at the end of some COPY commands: + // https://github.com/porsager/postgres/issues/499 + void db.end().catch(e => lc.warn?.(`error closing backfill connection`, e)); } } @@ -264,14 +290,3 @@ function validateSchema( return {tableSpec: spec, backfill}; }); } - -export class SchemaIncompatibilityError extends Error { - readonly name = 'SchemaIncompatibilityError'; - - constructor(bf: BackfillRequest, msg: string) { - super( - `Cannot backfill ${bf.table.schema}.${bf.table.name}` + - `[${Object.keys(bf.columns).join(',')}]: ${msg}`, - ); - } -} From 7f7b68d2f6e0fe179f7500b89a246d6f04392eb4 Mon Sep 17 00:00:00 2001 From: utkarsh-611 Date: Thu, 12 Feb 2026 14:58:28 -0800 Subject: [PATCH 053/495] fix: guard against closed WebSocket in cross-process handoff (#5541) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The change-streamer process was crashing with the error: Error: websocket already in state 3 at new WebSocketCloser (streams.js:223:11) at WebSocketCloser.forSource (streams.js:198:12) at streamOut (streams.js:110:34) at #reserveSnapshot (change-streamer-http.js:100:12) **This caused a cascade failure:** change-streamer → dispatcher → backup-replicator → zero-cache, taking down the entire replication system. Race condition in WebSocket handoff: When a replicator connects to the change-streamer, the WebSocket goes through a multi-process handoff: Client → Dispatcher (process A) → Change-Streamer (process B) The WebSocket can close (due to network issues or client disconnect) during this handoff. When the handler (#reserveSnapshot or #subscribe) then tries to use the WebSocket, it's already in CLOSED state (readyState=3). The WebSocketCloser constructor validates the WebSocket state and throws an error for unexpected states: ``` switch (ws.readyState) { case ws.CONNECTING: break; // expected case ws.OPEN: this.#connected.resolve(); break; default: this.#connected.reject( new Error(`websocket already in state ${ws.readyState}`) ); } ``` This error was unhandled in the async handler, crashing the process. Solution Added defensive guards at the start of both #reserveSnapshot and #subscribe handlers to check WebSocket state before attempting to stream: ``` if (ws.readyState === ws.CLOSED || ws.readyState === ws.CLOSING) { this._lc.warn?.('websocket closed before stream could start'); return; } ``` --------- Co-authored-by: Darick Tong --- .../src/types/websocket-handoff.test.ts | 58 +++++++++++++++++++ .../zero-cache/src/types/websocket-handoff.ts | 11 +++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/packages/zero-cache/src/types/websocket-handoff.test.ts b/packages/zero-cache/src/types/websocket-handoff.test.ts index dd7e25604b..4e1db83503 100644 --- a/packages/zero-cache/src/types/websocket-handoff.test.ts +++ b/packages/zero-cache/src/types/websocket-handoff.test.ts @@ -256,4 +256,62 @@ describe('types/websocket-handoff', () => { wssNoCompression.close(); }); + + test('websocket closed during upgrade is handled gracefully', async () => { + const [parent, child] = inProcChannel(); + + installWebSocketHandoff( + lc, + () => ({ + payload: {foo: 'boo'}, + sender: child, + }), + server, + ); + + let receiveCalled = false; + const {promise: testComplete, resolve: completeTest} = resolver(); + + // Create a custom WSS that simulates a closed websocket after upgrade + const wssWithClosedWs = new WebSocketServer({noServer: true}); + + // Override handleUpgrade to close the websocket before calling the callback + const originalHandleUpgrade = wssWithClosedWs.handleUpgrade.bind(wssWithClosedWs); + wssWithClosedWs.handleUpgrade = (request, socket, head, callback) => { + originalHandleUpgrade(request, socket, head, (ws, req) => { + // Simulate the race condition: close the websocket before the callback runs + ws.close(); + // Wait a tick for the close to take effect + setTimeout(() => callback(ws, req), 10); + }); + }; + + installWebSocketReceiver( + lc, + wssWithClosedWs, + () => { + receiveCalled = true; + }, + parent, + ); + + const ws = new WebSocket(`ws://localhost:${port}/`); + ws.on('close', () => { + // Give time for receive to potentially be called + setTimeout(() => { + completeTest(); + }, 50); + }); + ws.on('error', () => { + // Errors are expected when connection closes abruptly + }); + + await testComplete; + + // The receive callback should NOT have been called because + // the websocket was closed during the handoff + expect(receiveCalled).toBe(false); + + wssWithClosedWs.close(); + }); }); diff --git a/packages/zero-cache/src/types/websocket-handoff.ts b/packages/zero-cache/src/types/websocket-handoff.ts index a9fd6dc2a5..0dbfd5f1c5 100644 --- a/packages/zero-cache/src/types/websocket-handoff.ts +++ b/packages/zero-cache/src/types/websocket-handoff.ts @@ -149,7 +149,16 @@ export function installWebSocketReceiver

( message as IncomingMessage, socket as Socket, Buffer.from(head), - ws => receive(ws, payload, message), + ws => { + // Guard against WebSocket being closed during handoff. + // This can happen due to network issues or client disconnection + // between the time the socket was sent and when handleUpgrade completes. + if (ws.readyState === ws.CLOSED || ws.readyState === ws.CLOSING) { + lc.warn?.('websocket closed during upgrade, skipping receive'); + return; + } + receive(ws, payload, message); + }, ); }); } From 9e55e059d3e87408355b8fd20747466d0ff89bb0 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 12 Feb 2026 14:59:51 -0800 Subject: [PATCH 054/495] chore: prettier (#5549) Followup to https://github.com/rocicorp/mono/pull/5541 --- packages/zero-cache/src/types/websocket-handoff.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/zero-cache/src/types/websocket-handoff.test.ts b/packages/zero-cache/src/types/websocket-handoff.test.ts index 4e1db83503..127d7cf0fb 100644 --- a/packages/zero-cache/src/types/websocket-handoff.test.ts +++ b/packages/zero-cache/src/types/websocket-handoff.test.ts @@ -276,7 +276,8 @@ describe('types/websocket-handoff', () => { const wssWithClosedWs = new WebSocketServer({noServer: true}); // Override handleUpgrade to close the websocket before calling the callback - const originalHandleUpgrade = wssWithClosedWs.handleUpgrade.bind(wssWithClosedWs); + const originalHandleUpgrade = + wssWithClosedWs.handleUpgrade.bind(wssWithClosedWs); wssWithClosedWs.handleUpgrade = (request, socket, head, callback) => { originalHandleUpgrade(request, socket, head, (ws, req) => { // Simulate the race condition: close the websocket before the callback runs From e51d484e04d6e05b34cc8d549f923be81ebd2da7 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 12 Feb 2026 16:45:47 -0800 Subject: [PATCH 055/495] chore: fix construction of initial backfill requests from the change db (#5550) --- .../change-streamer/storer.pg.test.ts | 560 +++++++++--------- .../src/services/change-streamer/storer.ts | 16 +- 2 files changed, 306 insertions(+), 270 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index ec92efab0c..9121b191fe 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -232,27 +232,29 @@ describe('change-streamer/storer', () => { // since none was ever specified. expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [ - { - "columns": { - "a": { - "barID": "zoo", - "fooID": 987, + { + "backfillRequests": Result [ + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "b": { + "barID": "ozz", + "fooID": 843, + }, }, - "b": { - "barID": "ozz", - "fooID": 843, + "table": { + "metadata": null, + "name": "bar", + "schema": "your", }, }, - "metadata": null, - "name": "bar", - "schema": "your", - }, - ], - "lastWatermark": "0a", - } - `); + ], + "lastWatermark": "0a", + } + `); // Add a column to the original table backfill metadata. storer.store([ @@ -280,46 +282,50 @@ describe('change-streamer/storer', () => { // table metadata. expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [ - { - "columns": { - "a": { - "barID": "zoo", - "fooID": 987, + { + "backfillRequests": Result [ + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "b": { + "barID": "ozz", + "fooID": 843, + }, }, - "b": { - "barID": "ozz", - "fooID": 843, + "table": { + "metadata": null, + "name": "bar", + "schema": "your", }, }, - "metadata": null, - "name": "bar", - "schema": "your", - }, - { - "columns": { - "c": { - "barID": "baz", - "fooID": 123, + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "a", - "b", - ], - "type": "index", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "a", + "b", + ], + "type": "index", + }, + }, + "name": "foo", + "schema": "my", }, }, - "name": "foo", - "schema": "my", - }, - ], - "lastWatermark": "0b", - } - `); + ], + "lastWatermark": "0b", + } + `); // Add another column to the same table with new table metadata. storer.store([ @@ -348,49 +354,53 @@ describe('change-streamer/storer', () => { expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [ - { - "columns": { - "c": { - "barID": "baz", - "fooID": 123, - }, - "d": { - "barID": "boo", - "fooID": 456, + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "b", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", }, }, - "name": "foo", - "schema": "my", - }, - { - "columns": { - "a": { - "barID": "zoo", - "fooID": 987, + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "b": { + "barID": "ozz", + "fooID": 843, + }, }, - "b": { - "barID": "ozz", - "fooID": 843, + "table": { + "metadata": null, + "name": "bar", + "schema": "your", }, }, - "metadata": null, - "name": "bar", - "schema": "your", - }, - ], - "lastWatermark": "0c", - } - `); + ], + "lastWatermark": "0c", + } + `); // Update the table metadata of the new table. storer.store([ @@ -420,56 +430,60 @@ describe('change-streamer/storer', () => { expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [ - { - "columns": { - "c": { - "barID": "baz", - "fooID": 123, - }, - "d": { - "barID": "boo", - "fooID": 456, + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "b", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", }, }, - "name": "foo", - "schema": "my", - }, - { - "columns": { - "a": { - "barID": "zoo", - "fooID": 987, - }, - "b": { - "barID": "ozz", - "fooID": 843, + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "b": { + "barID": "ozz", + "fooID": 843, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "a", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "a", + ], + "type": "default", + }, + }, + "name": "bar", + "schema": "your", }, }, - "name": "bar", - "schema": "your", - }, - ], - "lastWatermark": "0d", - } - `); + ], + "lastWatermark": "0d", + } + `); // Rename one of the backfilling columns storer.store([ @@ -501,56 +515,60 @@ describe('change-streamer/storer', () => { expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [ - { - "columns": { - "c": { - "barID": "baz", - "fooID": 123, - }, - "d": { - "barID": "boo", - "fooID": 456, + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "b", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", }, }, - "name": "foo", - "schema": "my", - }, - { - "columns": { - "a": { - "barID": "zoo", - "fooID": 987, - }, - "newName": { - "barID": "ozz", - "fooID": 843, + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, + "newName": { + "barID": "ozz", + "fooID": 843, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "a", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "a", + ], + "type": "default", + }, + }, + "name": "bar", + "schema": "your", }, }, - "name": "bar", - "schema": "your", - }, - ], - "lastWatermark": "0e", - } - `); + ], + "lastWatermark": "0e", + } + `); // Drop a backfilling column. storer.store([ @@ -575,52 +593,56 @@ describe('change-streamer/storer', () => { expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [ - { - "columns": { - "c": { - "barID": "baz", - "fooID": 123, - }, - "d": { - "barID": "boo", - "fooID": 456, + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "b", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", }, }, - "name": "foo", - "schema": "my", - }, - { - "columns": { - "a": { - "barID": "zoo", - "fooID": 987, + { + "columns": { + "a": { + "barID": "zoo", + "fooID": 987, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "a", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "a", + ], + "type": "default", + }, + }, + "name": "bar", + "schema": "your", }, }, - "name": "bar", - "schema": "your", - }, - ], - "lastWatermark": "0f", - } - `); + ], + "lastWatermark": "0f", + } + `); // Set the other backfilling column to completed storer.store([ @@ -646,34 +668,36 @@ describe('change-streamer/storer', () => { expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [ - { - "columns": { - "c": { - "barID": "baz", - "fooID": 123, - }, - "d": { - "barID": "boo", - "fooID": 456, + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "d": { + "barID": "boo", + "fooID": 456, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "b", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "foo", + "schema": "my", }, }, - "name": "foo", - "schema": "my", - }, - ], - "lastWatermark": "110", - } - `); + ], + "lastWatermark": "110", + } + `); // Rename the backfilling table, and a contained column in the same tx. storer.store([ @@ -716,34 +740,36 @@ describe('change-streamer/storer', () => { expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [ - { - "columns": { - "c": { - "barID": "baz", - "fooID": 123, - }, - "deez": { - "barID": "boo", - "fooID": 456, + { + "backfillRequests": Result [ + { + "columns": { + "c": { + "barID": "baz", + "fooID": 123, + }, + "deez": { + "barID": "boo", + "fooID": 456, + }, }, - }, - "metadata": { - "rowKey": { - "columns": [ - "b", - ], - "type": "default", + "table": { + "metadata": { + "rowKey": { + "columns": [ + "b", + ], + "type": "default", + }, + }, + "name": "bloo", + "schema": "your", }, }, - "name": "bloo", - "schema": "your", - }, - ], - "lastWatermark": "111", - } - `); + ], + "lastWatermark": "111", + } + `); // Drop the backfilling table storer.store([ diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index e3729aed52..70b17f1f6e 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -8,6 +8,7 @@ import {assert} from '../../../../shared/src/asserts.ts'; import {BigIntJSON} from '../../../../shared/src/bigint-json.ts'; import {Queue} from '../../../../shared/src/queue.ts'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; +import * as v from '../../../../shared/src/valita.ts'; import * as Mode from '../../db/mode-enum.ts'; import {TransactionPool} from '../../db/transaction-pool.ts'; import { @@ -17,6 +18,7 @@ import { } from '../../types/pg.ts'; import {cdcSchema, type ShardID} from '../../types/shards.ts'; import { + backfillRequestSchema, isDataChange, isSchemaChange, type BackfillID, @@ -68,6 +70,8 @@ type PendingTransaction = { startingReplicationState: Promise; }; +const backfillRequestsSchema = v.array(backfillRequestSchema); + /** * Handles the storage of changes and the catchup of subscribers * that are behind. @@ -208,13 +212,19 @@ export class Storer implements Service { // `columns` object. It is LEFT JOIN'ed with the `tableMetadata` table // to make it optional and possibly `null`. sql` - SELECT b."schema", b."table" as name, t."metadata", - json_object_agg(b."column", b."backfill") as columns + SELECT + json_build_object( + 'schema', b."schema", + 'name', b."table", + 'metadata', t."metadata" + ) as "table", + json_object_agg(b."column", b."backfill") + as "columns" FROM ${this.#cdc('backfilling')} as b LEFT JOIN ${this.#cdc('tableMetadata')} as t ON (b."schema" = t."schema" AND b."table" = t."table") GROUP BY b."schema", b."table", t."metadata" - `, + `.then(result => v.parse(result, backfillRequestsSchema)), ], ); From db0a62fbfdeaa028222aaa85a9173c00645daa09 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 12 Feb 2026 17:36:14 -0800 Subject: [PATCH 056/495] chore(zero-cache): cancel empty backfills, always retry with backoff (#5551) Drop backfill requests if there are no more columns to backfill when processing a `drop-column` message. Always use backoff when retrying a thrown SchemaIncompatibilityError instead of special casing it. The request is not necessarily guaranteed to succeed immediately. Add some timing logging. --- .../common/backfill-manager.test.ts | 67 +++++++++++++++++++ .../change-source/common/backfill-manager.ts | 22 +++--- .../change-source/pg/backfill-stream.ts | 4 +- 3 files changed, 82 insertions(+), 11 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts index c55e0aab0f..9600cbe1f3 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts @@ -1086,6 +1086,73 @@ describe('backfill-manager', () => { ]); }); + test('backfill canceled because of last column drop', async () => { + testStreams.push([ + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + }, + ]); + await changeStream.reserve('main'); + + // Backfill manager will start the first request and block on the + // 'main' change-stream reservation. + void backfillManager.run('123', [ + { + columns: {b: {id: '234'}}, + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + }, + ]); + + // In the meantime, the table gets renamed on the main stream. + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'drop-column', + table: {schema: 'foo', name: 'bar'}, + column: 'b', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('125'); + + // The backfill request is canceled + expect(await drainChanges(3)).toMatchObject([ + ['begin', {tag: 'begin'}, {commitWatermark: '125'}], + [ + 'data', + { + tag: 'drop-column', + table: {schema: 'foo', name: 'bar'}, + column: 'b', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '125'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + // Canceled request, and no subsequent attempts + { + table: { + schema: 'foo', + name: 'bar', + metadata: {rowKey: {a: 123}}, + }, + columns: {b: {id: '234'}}, + }, + ]); + }); + test('column added to backfilling table', async () => { testStreams.push( [ diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts index 35e604a40d..1bccc26bb1 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -100,6 +100,10 @@ export class BackfillManager implements Cancelable, Listener { } run(lastWatermark: string, initialRequests: BackfillRequest[]) { + this.#lc.info?.( + `starting backfill manager with ${initialRequests.length} initial requests`, + {requests: initialRequests}, + ); this.#changeStreamWatermark = stateVersionFromString(lastWatermark); initialRequests.forEach(req => this.#setRequiredBackfill('initial-request', req), @@ -143,12 +147,6 @@ export class BackfillManager implements Cancelable, Listener { } #retryBackfillWithBackoff(e: unknown) { - if (e instanceof SchemaIncompatibilityError) { - this.#lc.info?.(`Schema incompatibility detected by backfill stream`, e); - // No need for backoff with schema incompatibility errors - this.#checkAndStartBackfill(); - return; - } const log = this.#retryDelayMs === this.#maxBackoffMs ? 'error' : 'warn'; this.#lc[log]?.( `Error running backfill. Retrying in ${this.#retryDelayMs} ms`, @@ -428,10 +426,14 @@ export class BackfillManager implements Cancelable, Listener { const backfillRequest = this.#requiredBackfills.get(table); if (backfillRequest && column in backfillRequest.columns) { const {[column]: _excluded, ...remaining} = backfillRequest.columns; - this.#setRequiredBackfill(tag, { - ...backfillRequest, - columns: remaining, - }); + if (Object.keys(remaining).length === 0) { + this.#deleteRequiredBackfill(tag, table); + } else { + this.#setRequiredBackfill(tag, { + ...backfillRequest, + columns: remaining, + }); + } const backfill = this.#backfillRunningFor(table); if (backfill && column in backfill.request.columns) { this.#stopRunningBackfill(`column dropped`); diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts index 3db0f5176e..e1170657ce 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts @@ -117,6 +117,7 @@ async function* stream( colParsers: TypeParser[], flushThresholdBytes: number, ): AsyncGenerator { + const start = performance.now(); lc.info?.(`Starting backfill copy stream:`, selectStmt); const copyStream = await tx.processReadTask(sql => sql.unsafe(`COPY (${selectStmt}) TO STDOUT`).readable(), @@ -163,7 +164,8 @@ async function* stream( } yield {tag: 'backfill-completed', ...backfill}; - lc.info?.(`Finished streaming ${totalRows} rows`); + const elapsed = performance.now() - start; + lc.info?.(`Finished streaming ${totalRows} rows (${elapsed.toFixed(3)} ms)`); } /** From a76e2e1f970b343c885b19b7aa069c91272a71c8 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 12 Feb 2026 18:59:51 -0800 Subject: [PATCH 057/495] chore(zero-cache): parameterize the back-pressure limit and lower the default (#5552) Lower the default back-pressure limit from 5% to 4% of the available heap. Large backfills can cause OOMs at 5%. The backfill messages are batched and thus larger than normal replication messages, which may explain why the threshold has become more of an underestimate, as the amount of memory in use is temporarily doubled when the messages have not been sent over the wire to replication subscribers. Make the proportion parameterizable in case of emergencies, and document the intended use case in the options usage text. --- .../zero-cache/src/config/zero-config.test.ts | 1043 +++++++++-------- packages/zero-cache/src/config/zero-config.ts | 24 + .../zero-cache/src/server/change-streamer.ts | 9 +- .../change-streamer-service.pg.test.ts | 7 + .../change-streamer-service.ts | 4 + .../change-streamer/storer.pg.test.ts | 2 + .../src/services/change-streamer/storer.ts | 24 +- 7 files changed, 580 insertions(+), 533 deletions(-) diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index 07c81aa4f9..bc995543ef 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -27,517 +27,538 @@ test('zero-cache --help', () => { expect(logger.info).toHaveBeenCalled(); expect(stripAnsi(logger.info.mock.calls[0][0])).toMatchInlineSnapshot(` " - --upstream-db string required - ZERO_UPSTREAM_DB env - The "upstream" authoritative postgres database. - In the future we will support other types of upstream besides PG. - - --upstream-max-conns number default: 20 - ZERO_UPSTREAM_MAX_CONNS env - The maximum number of connections to open to the upstream database - for committing mutations. This is divided evenly amongst sync workers. - In addition to this number, zero-cache uses one connection for the - replication stream. - - Note that this number must allow for at least one connection per - sync worker, or zero-cache will fail to start. See num-sync-workers - - --mutate-url string[] optional - ZERO_MUTATE_URL env - The URL of the API server to which zero-cache will push mutations. - - IMPORTANT: URLs are matched using URLPattern, a standard Web API. - - Pattern Syntax: - URLPattern uses a simple and intuitive syntax similar to Express routes. - Wildcards and named parameters make it easy to match multiple URLs. - - Basic Examples: - Exact URL match: - "https://api.example.com/mutate" - Any subdomain using wildcard: - "https://*.example.com/mutate" - Multiple subdomain levels: - "https://*.*.example.com/mutate" - Any path under a domain: - "https://api.example.com/*" - Named path parameters: - "https://api.example.com/:version/mutate" - ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. - - Advanced Patterns: - Optional path segments: - "https://api.example.com/:path?" - Regex in segments (for specific patterns): - "https://api.example.com/:version(v\\d+)/mutate" - ↳ Matches only "v" followed by digits - - Multiple patterns: - ["https://api1.example.com/mutate", "https://api2.example.com/mutate"] - - Note: Query parameters and URL fragments (#) are automatically ignored during matching. - - For full URLPattern syntax, see: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern - - --mutate-api-key string optional - ZERO_MUTATE_API_KEY env - An optional secret used to authorize zero-cache to call the API server handling writes. - - --mutate-forward-cookies boolean default: false - ZERO_MUTATE_FORWARD_COOKIES env - If true, zero-cache will forward cookies from the request. - This is useful for passing authentication cookies to the API server. - If false, cookies are not forwarded. - - --mutate-allowed-client-headers string[] optional - ZERO_MUTATE_ALLOWED_CLIENT_HEADERS env - A list of header names that clients are allowed to set via custom headers. - If specified, only headers in this list will be forwarded to the push URL. - Header names are case-insensitive. - If not specified, no client-provided headers are forwarded (secure by default). - Example: ZERO_MUTATE_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id - - --query-url string[] optional - ZERO_QUERY_URL env - The URL of the API server to which zero-cache will send synced queries. - - IMPORTANT: URLs are matched using URLPattern, a standard Web API. - - Pattern Syntax: - URLPattern uses a simple and intuitive syntax similar to Express routes. - Wildcards and named parameters make it easy to match multiple URLs. - - Basic Examples: - Exact URL match: - "https://api.example.com/mutate" - Any subdomain using wildcard: - "https://*.example.com/mutate" - Multiple subdomain levels: - "https://*.*.example.com/mutate" - Any path under a domain: - "https://api.example.com/*" - Named path parameters: - "https://api.example.com/:version/mutate" - ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. - - Advanced Patterns: - Optional path segments: - "https://api.example.com/:path?" - Regex in segments (for specific patterns): - "https://api.example.com/:version(v\\d+)/mutate" - ↳ Matches only "v" followed by digits - - Multiple patterns: - ["https://api1.example.com/mutate", "https://api2.example.com/mutate"] - - Note: Query parameters and URL fragments (#) are automatically ignored during matching. - - For full URLPattern syntax, see: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern - - --query-api-key string optional - ZERO_QUERY_API_KEY env - An optional secret used to authorize zero-cache to call the API server handling writes. - - --query-forward-cookies boolean default: false - ZERO_QUERY_FORWARD_COOKIES env - If true, zero-cache will forward cookies from the request. - This is useful for passing authentication cookies to the API server. - If false, cookies are not forwarded. - - --query-allowed-client-headers string[] optional - ZERO_QUERY_ALLOWED_CLIENT_HEADERS env - A list of header names that clients are allowed to set via custom headers. - If specified, only headers in this list will be forwarded to the query URL. - Header names are case-insensitive. - If not specified, no client-provided headers are forwarded (secure by default). - Example: ZERO_QUERY_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id - - --cvr-db string optional - ZERO_CVR_DB env - The Postgres database used to store CVRs. CVRs (client view records) keep track - of the data synced to clients in order to determine the diff to send on reconnect. - If unspecified, the upstream-db will be used. - - --cvr-max-conns number default: 30 - ZERO_CVR_MAX_CONNS env - The maximum number of connections to open to the CVR database. - This is divided evenly amongst sync workers. - - Note that this number must allow for at least one connection per - sync worker, or zero-cache will fail to start. See num-sync-workers - - --cvr-garbage-collection-inactivity-threshold-hours number default: 48 - ZERO_CVR_GARBAGE_COLLECTION_INACTIVITY_THRESHOLD_HOURS env - The duration after which an inactive CVR is eligible for garbage collection. - Note that garbage collection is an incremental, periodic process which does not - necessarily purge all eligible CVRs immediately. - - --cvr-garbage-collection-initial-interval-seconds number default: 60 - ZERO_CVR_GARBAGE_COLLECTION_INITIAL_INTERVAL_SECONDS env - The initial interval at which to check and garbage collect inactive CVRs. - This interval is increased exponentially (up to 16 minutes) when there is - nothing to purge. - - --cvr-garbage-collection-initial-batch-size number default: 25 - ZERO_CVR_GARBAGE_COLLECTION_INITIAL_BATCH_SIZE env - The initial number of CVRs to purge per garbage collection interval. - This number is increased linearly if the rate of new CVRs exceeds the rate of - purged CVRs, in order to reach a steady state. - - Setting this to 0 effectively disables CVR garbage collection. - - --query-hydration-stats boolean optional - ZERO_QUERY_HYDRATION_STATS env - Track and log the number of rows considered by query hydrations which - take longer than log-slow-hydrate-threshold milliseconds. - This is useful for debugging and performance tuning. - - --enable-query-planner boolean default: true - ZERO_ENABLE_QUERY_PLANNER env - Enable the query planner for optimizing ZQL queries. - - The query planner analyzes and optimizes query execution by determining - the most efficient join strategies. - - You can disable the planner if it is picking bad strategies. - - --yield-threshold-ms number default: 10 - ZERO_YIELD_THRESHOLD_MS env - The maximum amount of time in milliseconds that a sync worker will - spend in IVM (processing query hydration and advancement) before yielding - to the event loop. Lower values increase responsiveness and fairness at - the cost of reduced throughput. - - --change-db string optional - ZERO_CHANGE_DB env - The Postgres database used to store recent replication log entries, in order - to sync multiple view-syncers without requiring multiple replication slots on - the upstream database. If unspecified, the upstream-db will be used. - - --change-max-conns number default: 5 - ZERO_CHANGE_MAX_CONNS env - The maximum number of connections to open to the change database. - This is used by the change-streamer for catching up - zero-cache replication subscriptions. - - --replica-file string default: "zero.db" - ZERO_REPLICA_FILE env - File path to the SQLite replica that zero-cache maintains. - This can be lost, but if it is, zero-cache will have to re-replicate next - time it starts up. - - --replica-vacuum-interval-hours number optional - ZERO_REPLICA_VACUUM_INTERVAL_HOURS env - Performs a VACUUM at server startup if the specified number of hours has elapsed - since the last VACUUM (or initial-sync). The VACUUM operation is heavyweight - and requires double the size of the db in disk space. If unspecified, VACUUM - operations are not performed. - - --log-level debug,info,warn,error default: "info" - ZERO_LOG_LEVEL env - - --log-format text,json default: "text" - ZERO_LOG_FORMAT env - Use text for developer-friendly console logging - and json for consumption by structured-logging services - - --log-slow-row-threshold number default: 2 - ZERO_LOG_SLOW_ROW_THRESHOLD env - The number of ms a row must take to fetch from table-source before it is considered slow. - - --log-slow-hydrate-threshold number default: 100 - ZERO_LOG_SLOW_HYDRATE_THRESHOLD env - The number of milliseconds a query hydration must take to print a slow warning. - - --log-ivm-sampling number default: 5000 - ZERO_LOG_IVM_SAMPLING env - How often to collect IVM metrics. 1 out of N requests will be sampled where N is this value. - - --app-id string default: "zero" - ZERO_APP_ID env - Unique identifier for the app. - - Multiple zero-cache apps can run on a single upstream database, each of which - is isolated from the others, with its own permissions, sharding (future feature), - and change/cvr databases. - - The metadata of an app is stored in an upstream schema with the same name, - e.g. "zero", and the metadata for each app shard, e.g. client and mutation - ids, is stored in the "{app-id}_{#}" schema. (Currently there is only a single - "0" shard, but this will change with sharding). - - The CVR and Change data are managed in schemas named "{app-id}_{shard-num}/cvr" - and "{app-id}_{shard-num}/cdc", respectively, allowing multiple apps and shards - to share the same database instance (e.g. a Postgres "cluster") for CVR and Change management. - - Due to constraints on replication slot names, an App ID may only consist of - lower-case letters, numbers, and the underscore character. - - Note that this option is used by both zero-cache and zero-deploy-permissions. - - --app-publications string[] default: [] - ZERO_APP_PUBLICATIONS env - Postgres PUBLICATIONs that define the tables and columns to - replicate. Publication names may not begin with an underscore, - as zero reserves that prefix for internal use. - - If unspecified, zero-cache will create and use an internal publication that - publishes all tables in the public schema, i.e.: - - CREATE PUBLICATION _{app-id}_public_0 FOR TABLES IN SCHEMA public; - - Note that changing the set of publications will result in resyncing the replica, - which may involve downtime (replication lag) while the new replica is initializing. - To change the set of publications without disrupting an existing app, a new app - should be created. - - --port number default: 4848 - ZERO_PORT env - The port for sync connections. - - --change-streamer-uri string optional - ZERO_CHANGE_STREAMER_URI env - When set, connects to the change-streamer at the given URI. - In a multi-node setup, this should be specified in view-syncer options, - pointing to the replication-manager URI, which runs a change-streamer - on port 4849. - - --change-streamer-mode dedicated,discover default: "dedicated" - ZERO_CHANGE_STREAMER_MODE env - As an alternative to ZERO_CHANGE_STREAMER_URI, the ZERO_CHANGE_STREAMER_MODE - can be set to "discover" to instruct the view-syncer to connect to the - ip address registered by the replication-manager upon startup. - - This may not work in all networking configurations, e.g. certain private - networking or port forwarding configurations. Using the ZERO_CHANGE_STREAMER_URI - with an explicit routable hostname is recommended instead. - - Note: This option is ignored if the ZERO_CHANGE_STREAMER_URI is set. - - --change-streamer-port number optional - ZERO_CHANGE_STREAMER_PORT env - The port on which the change-streamer runs. This is an internal - protocol between the replication-manager and view-syncers, which - runs in the same process tree in local development or a single-node configuration. - - If unspecified, defaults to --port + 1. - - --change-streamer-startup-delay-ms number default: 15000 - ZERO_CHANGE_STREAMER_STARTUP_DELAY_MS env - The delay to wait before the change-streamer takes over the replication stream - (i.e. the handoff during replication-manager updates), to allow loadbalancers to register - the task as healthy based on healthcheck parameters. Note that if a change stream request - is received during this interval, the delay will be canceled and the takeover will happen - immediately, since the incoming request indicates that the task is registered as a target. - - --task-id string optional - ZERO_TASK_ID env - Globally unique identifier for the zero-cache instance. - - Setting this to a platform specific task identifier can be useful for debugging. - If unspecified, zero-cache will attempt to extract the TaskARN if run from within - an AWS ECS container, and otherwise use a random string. - - --per-user-mutation-limit-max number optional - ZERO_PER_USER_MUTATION_LIMIT_MAX env - The maximum mutations per user within the specified windowMs. - If unset, no rate limiting is enforced. - - --per-user-mutation-limit-window-ms number default: 60000 - ZERO_PER_USER_MUTATION_LIMIT_WINDOW_MS env - The sliding window over which the perUserMutationLimitMax is enforced. - - --num-sync-workers number optional - ZERO_NUM_SYNC_WORKERS env - The number of processes to use for view syncing. - Leave this unset to use the maximum available parallelism. - If set to 0, the server runs without sync workers, which is the - configuration for running the replication-manager. - - --auto-reset boolean default: true - ZERO_AUTO_RESET env - Automatically wipe and resync the replica when replication is halted. - This situation can occur for configurations in which the upstream database - provider prohibits event trigger creation, preventing the zero-cache from - being able to correctly replicate schema changes. For such configurations, - an upstream schema change will instead result in halting replication with an - error indicating that the replica needs to be reset. - - When auto-reset is enabled, zero-cache will respond to such situations - by shutting down, and when restarted, resetting the replica and all synced - clients. This is a heavy-weight operation and can result in user-visible - slowness or downtime if compute resources are scarce. - - --admin-password string optional - ZERO_ADMIN_PASSWORD env - A password used to administer zero-cache server, for example to access the - /statz endpoint. - - A password is optional in development mode but required in production mode. - - --websocket-compression boolean default: false - ZERO_WEBSOCKET_COMPRESSION env - Enable WebSocket per-message deflate compression. - - Compression can reduce bandwidth usage for sync traffic but - increases CPU usage on both client and server. Disabled by default. - - See: https://github.com/websockets/ws#websocket-compression - - --websocket-compression-options string optional - ZERO_WEBSOCKET_COMPRESSION_OPTIONS env - JSON string containing WebSocket compression options. - - Only used if websocketCompression is enabled. - - Example: {"zlibDeflateOptions":{"level":3},"threshold":1024} - - See https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback for available options. - - --websocket-max-payload-bytes number default: 10485760 - ZERO_WEBSOCKET_MAX_PAYLOAD_BYTES env - Maximum size of incoming WebSocket messages in bytes. - - Messages exceeding this limit are rejected before parsing. - Default: 10MB (10 * 1024 * 1024 = 10485760) - - --litestream-executable string optional - ZERO_LITESTREAM_EXECUTABLE env - Path to the litestream executable. - - --litestream-config-path string default: "./src/services/litestream/config.yml" - ZERO_LITESTREAM_CONFIG_PATH env - Path to the litestream yaml config file. zero-cache will run this with its - environment variables, which can be referenced in the file via \${ENV} - substitution, for example: - * ZERO_REPLICA_FILE for the db path - * ZERO_LITESTREAM_BACKUP_LOCATION for the db replica url - * ZERO_LITESTREAM_LOG_LEVEL for the log level - * ZERO_LOG_FORMAT for the log type - - --litestream-log-level debug,info,warn,error default: "warn" - ZERO_LITESTREAM_LOG_LEVEL env - - --litestream-backup-url string optional - ZERO_LITESTREAM_BACKUP_URL env - The location of the litestream backup, usually an s3:// URL. - This is only consulted by the replication-manager. - view-syncers receive this information from the replication-manager. - - --litestream-endpoint string optional - ZERO_LITESTREAM_ENDPOINT env - The S3-compatible endpoint URL to use for the litestream backup. Only required for non-AWS services. - The replication-manager and view-syncers must have the same endpoint. - - --litestream-port number optional - ZERO_LITESTREAM_PORT env - Port on which litestream exports metrics, used to determine the replication - watermark up to which it is safe to purge change log records. - - If unspecified, defaults to --port + 2. - - --litestream-checkpoint-threshold-mb number default: 40 - ZERO_LITESTREAM_CHECKPOINT_THRESHOLD_MB env - The size of the WAL file at which to perform an SQlite checkpoint to apply - the writes in the WAL to the main database file. Each checkpoint creates - a new WAL segment file that will be backed up by litestream. Smaller thresholds - may improve read performance, at the expense of creating more files to download - when restoring the replica from the backup. - - --litestream-min-checkpoint-page-count number optional - ZERO_LITESTREAM_MIN_CHECKPOINT_PAGE_COUNT env - The WAL page count at which SQLite attempts a PASSIVE checkpoint, which - transfers pages to the main database file without blocking writers. - Defaults to checkpointThresholdMB * 250 (since SQLite page size is 4KB). - - --litestream-max-checkpoint-page-count number optional - ZERO_LITESTREAM_MAX_CHECKPOINT_PAGE_COUNT env - The WAL page count at which SQLite performs a RESTART checkpoint, which - blocks writers until complete. Defaults to minCheckpointPageCount * 10. - Set to 0 to disable RESTART checkpoints entirely. - - --litestream-incremental-backup-interval-minutes number default: 15 - ZERO_LITESTREAM_INCREMENTAL_BACKUP_INTERVAL_MINUTES env - The interval between incremental backups of the replica. Shorter intervals - reduce the amount of change history that needs to be replayed when catching - up a new view-syncer, at the expense of increasing the number of files needed - to download for the initial litestream restore. - - --litestream-snapshot-backup-interval-hours number default: 12 - ZERO_LITESTREAM_SNAPSHOT_BACKUP_INTERVAL_HOURS env - The interval between snapshot backups of the replica. Snapshot backups - make a full copy of the database to a new litestream generation. This - improves restore time at the expense of bandwidth. Applications with a - large database and low write rate can increase this interval to reduce - network usage for backups (litestream defaults to 24 hours). - - --litestream-restore-parallelism number default: 48 - ZERO_LITESTREAM_RESTORE_PARALLELISM env - The number of WAL files to download in parallel when performing the - initial restore of the replica from the backup. - - --litestream-multipart-concurrency number default: 48 - ZERO_LITESTREAM_MULTIPART_CONCURRENCY env - The number of parts (of size --litestream-multipart-size bytes) - to upload or download in parallel when backing up or restoring the snapshot. - - --litestream-multipart-size number default: 16777216 - ZERO_LITESTREAM_MULTIPART_SIZE env - The size of each part when uploading or downloading the snapshot with - --multipart-concurrency. Note that up to concurrency * size - bytes of memory are used when backing up or restoring the snapshot. - - --storage-db-tmp-dir string optional - ZERO_STORAGE_DB_TMP_DIR env - tmp directory for IVM operator storage. Leave unset to use os.tmpdir() - - --initial-sync-table-copy-workers number default: 5 - ZERO_INITIAL_SYNC_TABLE_COPY_WORKERS env - The number of parallel workers used to copy tables during initial sync. - Each worker uses a database connection and will buffer up to (approximately) - 10 MB of table data in memory during initial sync. Increasing the number of - workers may improve initial sync speed; however, note that local disk throughput - (i.e. IOPS), upstream CPU, and network bandwidth may also be bottlenecks. - - --lazy-startup boolean default: false - ZERO_LAZY_STARTUP env - Delay starting the majority of zero-cache until first request. - - This is mainly intended to avoid connecting to Postgres replication stream - until the first request is received, which can be useful i.e., for preview instances. - - Currently only supported in single-node mode. - - --server-version string optional - ZERO_SERVER_VERSION env - The version string outputted to logs when the server starts up. - - --enable-telemetry boolean default: true - ZERO_ENABLE_TELEMETRY env - Set to false to opt out of telemetry collection. - - This helps us improve Zero by collecting anonymous usage data. - Setting the DO_NOT_TRACK environment variable also disables telemetry. - - --cloud-event-sink-env string optional - ZERO_CLOUD_EVENT_SINK_ENV env - ENV variable containing a URI to a CloudEvents sink. When set, ZeroEvents - will be published to the sink as the data field of CloudEvents. - The source field of the CloudEvents will be set to the ZERO_TASK_ID, - along with any extension attributes specified by the ZERO_CLOUD_EVENT_EXTENSION_OVERRIDES_ENV. - - This configuration is modeled to easily integrate with a knative K_SINK binding, - (i.e. https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding). - However, any CloudEvents sink can be used. - - --cloud-event-extension-overrides-env string optional - ZERO_CLOUD_EVENT_EXTENSION_OVERRIDES_ENV env - ENV variable containing a JSON stringified object with an extensions field - containing attributes that should be added or overridden on outbound CloudEvents. - - This configuration is modeled to easily integrate with a knative K_CE_OVERRIDES binding, - (i.e. https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding). - + --upstream-db string required + ZERO_UPSTREAM_DB env + The "upstream" authoritative postgres database. + In the future we will support other types of upstream besides PG. + + --upstream-max-conns number default: 20 + ZERO_UPSTREAM_MAX_CONNS env + The maximum number of connections to open to the upstream database + for committing mutations. This is divided evenly amongst sync workers. + In addition to this number, zero-cache uses one connection for the + replication stream. + + Note that this number must allow for at least one connection per + sync worker, or zero-cache will fail to start. See num-sync-workers + + --mutate-url string[] optional + ZERO_MUTATE_URL env + The URL of the API server to which zero-cache will push mutations. + + IMPORTANT: URLs are matched using URLPattern, a standard Web API. + + Pattern Syntax: + URLPattern uses a simple and intuitive syntax similar to Express routes. + Wildcards and named parameters make it easy to match multiple URLs. + + Basic Examples: + Exact URL match: + "https://api.example.com/mutate" + Any subdomain using wildcard: + "https://*.example.com/mutate" + Multiple subdomain levels: + "https://*.*.example.com/mutate" + Any path under a domain: + "https://api.example.com/*" + Named path parameters: + "https://api.example.com/:version/mutate" + ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. + + Advanced Patterns: + Optional path segments: + "https://api.example.com/:path?" + Regex in segments (for specific patterns): + "https://api.example.com/:version(v\\d+)/mutate" + ↳ Matches only "v" followed by digits + + Multiple patterns: + ["https://api1.example.com/mutate", "https://api2.example.com/mutate"] + + Note: Query parameters and URL fragments (#) are automatically ignored during matching. + + For full URLPattern syntax, see: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern + + --mutate-api-key string optional + ZERO_MUTATE_API_KEY env + An optional secret used to authorize zero-cache to call the API server handling writes. + + --mutate-forward-cookies boolean default: false + ZERO_MUTATE_FORWARD_COOKIES env + If true, zero-cache will forward cookies from the request. + This is useful for passing authentication cookies to the API server. + If false, cookies are not forwarded. + + --mutate-allowed-client-headers string[] optional + ZERO_MUTATE_ALLOWED_CLIENT_HEADERS env + A list of header names that clients are allowed to set via custom headers. + If specified, only headers in this list will be forwarded to the push URL. + Header names are case-insensitive. + If not specified, no client-provided headers are forwarded (secure by default). + Example: ZERO_MUTATE_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id + + --query-url string[] optional + ZERO_QUERY_URL env + The URL of the API server to which zero-cache will send synced queries. + + IMPORTANT: URLs are matched using URLPattern, a standard Web API. + + Pattern Syntax: + URLPattern uses a simple and intuitive syntax similar to Express routes. + Wildcards and named parameters make it easy to match multiple URLs. + + Basic Examples: + Exact URL match: + "https://api.example.com/mutate" + Any subdomain using wildcard: + "https://*.example.com/mutate" + Multiple subdomain levels: + "https://*.*.example.com/mutate" + Any path under a domain: + "https://api.example.com/*" + Named path parameters: + "https://api.example.com/:version/mutate" + ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. + + Advanced Patterns: + Optional path segments: + "https://api.example.com/:path?" + Regex in segments (for specific patterns): + "https://api.example.com/:version(v\\d+)/mutate" + ↳ Matches only "v" followed by digits + + Multiple patterns: + ["https://api1.example.com/mutate", "https://api2.example.com/mutate"] + + Note: Query parameters and URL fragments (#) are automatically ignored during matching. + + For full URLPattern syntax, see: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern + + --query-api-key string optional + ZERO_QUERY_API_KEY env + An optional secret used to authorize zero-cache to call the API server handling writes. + + --query-forward-cookies boolean default: false + ZERO_QUERY_FORWARD_COOKIES env + If true, zero-cache will forward cookies from the request. + This is useful for passing authentication cookies to the API server. + If false, cookies are not forwarded. + + --query-allowed-client-headers string[] optional + ZERO_QUERY_ALLOWED_CLIENT_HEADERS env + A list of header names that clients are allowed to set via custom headers. + If specified, only headers in this list will be forwarded to the query URL. + Header names are case-insensitive. + If not specified, no client-provided headers are forwarded (secure by default). + Example: ZERO_QUERY_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id + + --cvr-db string optional + ZERO_CVR_DB env + The Postgres database used to store CVRs. CVRs (client view records) keep track + of the data synced to clients in order to determine the diff to send on reconnect. + If unspecified, the upstream-db will be used. + + --cvr-max-conns number default: 30 + ZERO_CVR_MAX_CONNS env + The maximum number of connections to open to the CVR database. + This is divided evenly amongst sync workers. + + Note that this number must allow for at least one connection per + sync worker, or zero-cache will fail to start. See num-sync-workers + + --cvr-garbage-collection-inactivity-threshold-hours number default: 48 + ZERO_CVR_GARBAGE_COLLECTION_INACTIVITY_THRESHOLD_HOURS env + The duration after which an inactive CVR is eligible for garbage collection. + Note that garbage collection is an incremental, periodic process which does not + necessarily purge all eligible CVRs immediately. + + --cvr-garbage-collection-initial-interval-seconds number default: 60 + ZERO_CVR_GARBAGE_COLLECTION_INITIAL_INTERVAL_SECONDS env + The initial interval at which to check and garbage collect inactive CVRs. + This interval is increased exponentially (up to 16 minutes) when there is + nothing to purge. + + --cvr-garbage-collection-initial-batch-size number default: 25 + ZERO_CVR_GARBAGE_COLLECTION_INITIAL_BATCH_SIZE env + The initial number of CVRs to purge per garbage collection interval. + This number is increased linearly if the rate of new CVRs exceeds the rate of + purged CVRs, in order to reach a steady state. + + Setting this to 0 effectively disables CVR garbage collection. + + --query-hydration-stats boolean optional + ZERO_QUERY_HYDRATION_STATS env + Track and log the number of rows considered by query hydrations which + take longer than log-slow-hydrate-threshold milliseconds. + This is useful for debugging and performance tuning. + + --enable-query-planner boolean default: true + ZERO_ENABLE_QUERY_PLANNER env + Enable the query planner for optimizing ZQL queries. + + The query planner analyzes and optimizes query execution by determining + the most efficient join strategies. + + You can disable the planner if it is picking bad strategies. + + --yield-threshold-ms number default: 10 + ZERO_YIELD_THRESHOLD_MS env + The maximum amount of time in milliseconds that a sync worker will + spend in IVM (processing query hydration and advancement) before yielding + to the event loop. Lower values increase responsiveness and fairness at + the cost of reduced throughput. + + --change-db string optional + ZERO_CHANGE_DB env + The Postgres database used to store recent replication log entries, in order + to sync multiple view-syncers without requiring multiple replication slots on + the upstream database. If unspecified, the upstream-db will be used. + + --change-max-conns number default: 5 + ZERO_CHANGE_MAX_CONNS env + The maximum number of connections to open to the change database. + This is used by the change-streamer for catching up + zero-cache replication subscriptions. + + --replica-file string default: "zero.db" + ZERO_REPLICA_FILE env + File path to the SQLite replica that zero-cache maintains. + This can be lost, but if it is, zero-cache will have to re-replicate next + time it starts up. + + --replica-vacuum-interval-hours number optional + ZERO_REPLICA_VACUUM_INTERVAL_HOURS env + Performs a VACUUM at server startup if the specified number of hours has elapsed + since the last VACUUM (or initial-sync). The VACUUM operation is heavyweight + and requires double the size of the db in disk space. If unspecified, VACUUM + operations are not performed. + + --log-level debug,info,warn,error default: "info" + ZERO_LOG_LEVEL env + + --log-format text,json default: "text" + ZERO_LOG_FORMAT env + Use text for developer-friendly console logging + and json for consumption by structured-logging services + + --log-slow-row-threshold number default: 2 + ZERO_LOG_SLOW_ROW_THRESHOLD env + The number of ms a row must take to fetch from table-source before it is considered slow. + + --log-slow-hydrate-threshold number default: 100 + ZERO_LOG_SLOW_HYDRATE_THRESHOLD env + The number of milliseconds a query hydration must take to print a slow warning. + + --log-ivm-sampling number default: 5000 + ZERO_LOG_IVM_SAMPLING env + How often to collect IVM metrics. 1 out of N requests will be sampled where N is this value. + + --app-id string default: "zero" + ZERO_APP_ID env + Unique identifier for the app. + + Multiple zero-cache apps can run on a single upstream database, each of which + is isolated from the others, with its own permissions, sharding (future feature), + and change/cvr databases. + + The metadata of an app is stored in an upstream schema with the same name, + e.g. "zero", and the metadata for each app shard, e.g. client and mutation + ids, is stored in the "{app-id}_{#}" schema. (Currently there is only a single + "0" shard, but this will change with sharding). + + The CVR and Change data are managed in schemas named "{app-id}_{shard-num}/cvr" + and "{app-id}_{shard-num}/cdc", respectively, allowing multiple apps and shards + to share the same database instance (e.g. a Postgres "cluster") for CVR and Change management. + + Due to constraints on replication slot names, an App ID may only consist of + lower-case letters, numbers, and the underscore character. + + Note that this option is used by both zero-cache and zero-deploy-permissions. + + --app-publications string[] default: [] + ZERO_APP_PUBLICATIONS env + Postgres PUBLICATIONs that define the tables and columns to + replicate. Publication names may not begin with an underscore, + as zero reserves that prefix for internal use. + + If unspecified, zero-cache will create and use an internal publication that + publishes all tables in the public schema, i.e.: + + CREATE PUBLICATION _{app-id}_public_0 FOR TABLES IN SCHEMA public; + + Note that changing the set of publications will result in resyncing the replica, + which may involve downtime (replication lag) while the new replica is initializing. + To change the set of publications without disrupting an existing app, a new app + should be created. + + --port number default: 4848 + ZERO_PORT env + The port for sync connections. + + --change-streamer-uri string optional + ZERO_CHANGE_STREAMER_URI env + When set, connects to the change-streamer at the given URI. + In a multi-node setup, this should be specified in view-syncer options, + pointing to the replication-manager URI, which runs a change-streamer + on port 4849. + + --change-streamer-mode dedicated,discover default: "dedicated" + ZERO_CHANGE_STREAMER_MODE env + As an alternative to ZERO_CHANGE_STREAMER_URI, the ZERO_CHANGE_STREAMER_MODE + can be set to "discover" to instruct the view-syncer to connect to the + ip address registered by the replication-manager upon startup. + + This may not work in all networking configurations, e.g. certain private + networking or port forwarding configurations. Using the ZERO_CHANGE_STREAMER_URI + with an explicit routable hostname is recommended instead. + + Note: This option is ignored if the ZERO_CHANGE_STREAMER_URI is set. + + --change-streamer-port number optional + ZERO_CHANGE_STREAMER_PORT env + The port on which the change-streamer runs. This is an internal + protocol between the replication-manager and view-syncers, which + runs in the same process tree in local development or a single-node configuration. + + If unspecified, defaults to --port + 1. + + --change-streamer-startup-delay-ms number default: 15000 + ZERO_CHANGE_STREAMER_STARTUP_DELAY_MS env + The delay to wait before the change-streamer takes over the replication stream + (i.e. the handoff during replication-manager updates), to allow loadbalancers to register + the task as healthy based on healthcheck parameters. Note that if a change stream request + is received during this interval, the delay will be canceled and the takeover will happen + immediately, since the incoming request indicates that the task is registered as a target. + + --change-streamer-back-pressure-limit-heap-proportion number default: 0.04 + ZERO_CHANGE_STREAMER_BACK_PRESSURE_LIMIT_HEAP_PROPORTION env + The percentage of --max-old-space-size to use as a buffer for absorbing replication + stream spikes. When the estimated amount of queued data exceeds this threshold, back pressure + is applied to the replication stream, delaying downstream sync as a result. + + The threshold was determined empirically with load testing. Higher thresholds have resulted + in OOMs. Note also that the byte-counting logic in the queue is strictly an underestimate of + actual memory usage (but importantly, proportionally correct), so the queue is actually + using more than what this proportion suggests. + + This parameter is exported as an emergency knob to reduce the size of the buffer in the + event that the server OOMs from back pressure. Resist the urge to increase this + proportion, as it is mainly useful for absorbing periodic spikes and does not meaningfully + affect steady-state replication throughput; the latter is determined by other factors such + as object serialization and PG throughput + + In other words, the back pressure limit does not constrain replication throughput; + rather, it protects the system when the upstream throughput exceeds the downstream + throughput. + + --task-id string optional + ZERO_TASK_ID env + Globally unique identifier for the zero-cache instance. + + Setting this to a platform specific task identifier can be useful for debugging. + If unspecified, zero-cache will attempt to extract the TaskARN if run from within + an AWS ECS container, and otherwise use a random string. + + --per-user-mutation-limit-max number optional + ZERO_PER_USER_MUTATION_LIMIT_MAX env + The maximum mutations per user within the specified windowMs. + If unset, no rate limiting is enforced. + + --per-user-mutation-limit-window-ms number default: 60000 + ZERO_PER_USER_MUTATION_LIMIT_WINDOW_MS env + The sliding window over which the perUserMutationLimitMax is enforced. + + --num-sync-workers number optional + ZERO_NUM_SYNC_WORKERS env + The number of processes to use for view syncing. + Leave this unset to use the maximum available parallelism. + If set to 0, the server runs without sync workers, which is the + configuration for running the replication-manager. + + --auto-reset boolean default: true + ZERO_AUTO_RESET env + Automatically wipe and resync the replica when replication is halted. + This situation can occur for configurations in which the upstream database + provider prohibits event trigger creation, preventing the zero-cache from + being able to correctly replicate schema changes. For such configurations, + an upstream schema change will instead result in halting replication with an + error indicating that the replica needs to be reset. + + When auto-reset is enabled, zero-cache will respond to such situations + by shutting down, and when restarted, resetting the replica and all synced + clients. This is a heavy-weight operation and can result in user-visible + slowness or downtime if compute resources are scarce. + + --admin-password string optional + ZERO_ADMIN_PASSWORD env + A password used to administer zero-cache server, for example to access the + /statz endpoint. + + A password is optional in development mode but required in production mode. + + --websocket-compression boolean default: false + ZERO_WEBSOCKET_COMPRESSION env + Enable WebSocket per-message deflate compression. + + Compression can reduce bandwidth usage for sync traffic but + increases CPU usage on both client and server. Disabled by default. + + See: https://github.com/websockets/ws#websocket-compression + + --websocket-compression-options string optional + ZERO_WEBSOCKET_COMPRESSION_OPTIONS env + JSON string containing WebSocket compression options. + + Only used if websocketCompression is enabled. + + Example: {"zlibDeflateOptions":{"level":3},"threshold":1024} + + See https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback for available options. + + --websocket-max-payload-bytes number default: 10485760 + ZERO_WEBSOCKET_MAX_PAYLOAD_BYTES env + Maximum size of incoming WebSocket messages in bytes. + + Messages exceeding this limit are rejected before parsing. + Default: 10MB (10 * 1024 * 1024 = 10485760) + + --litestream-executable string optional + ZERO_LITESTREAM_EXECUTABLE env + Path to the litestream executable. + + --litestream-config-path string default: "./src/services/litestream/config.yml" + ZERO_LITESTREAM_CONFIG_PATH env + Path to the litestream yaml config file. zero-cache will run this with its + environment variables, which can be referenced in the file via \${ENV} + substitution, for example: + * ZERO_REPLICA_FILE for the db path + * ZERO_LITESTREAM_BACKUP_LOCATION for the db replica url + * ZERO_LITESTREAM_LOG_LEVEL for the log level + * ZERO_LOG_FORMAT for the log type + + --litestream-log-level debug,info,warn,error default: "warn" + ZERO_LITESTREAM_LOG_LEVEL env + + --litestream-backup-url string optional + ZERO_LITESTREAM_BACKUP_URL env + The location of the litestream backup, usually an s3:// URL. + This is only consulted by the replication-manager. + view-syncers receive this information from the replication-manager. + + --litestream-endpoint string optional + ZERO_LITESTREAM_ENDPOINT env + The S3-compatible endpoint URL to use for the litestream backup. Only required for non-AWS services. + The replication-manager and view-syncers must have the same endpoint. + + --litestream-port number optional + ZERO_LITESTREAM_PORT env + Port on which litestream exports metrics, used to determine the replication + watermark up to which it is safe to purge change log records. + + If unspecified, defaults to --port + 2. + + --litestream-checkpoint-threshold-mb number default: 40 + ZERO_LITESTREAM_CHECKPOINT_THRESHOLD_MB env + The size of the WAL file at which to perform an SQlite checkpoint to apply + the writes in the WAL to the main database file. Each checkpoint creates + a new WAL segment file that will be backed up by litestream. Smaller thresholds + may improve read performance, at the expense of creating more files to download + when restoring the replica from the backup. + + --litestream-min-checkpoint-page-count number optional + ZERO_LITESTREAM_MIN_CHECKPOINT_PAGE_COUNT env + The WAL page count at which SQLite attempts a PASSIVE checkpoint, which + transfers pages to the main database file without blocking writers. + Defaults to checkpointThresholdMB * 250 (since SQLite page size is 4KB). + + --litestream-max-checkpoint-page-count number optional + ZERO_LITESTREAM_MAX_CHECKPOINT_PAGE_COUNT env + The WAL page count at which SQLite performs a RESTART checkpoint, which + blocks writers until complete. Defaults to minCheckpointPageCount * 10. + Set to 0 to disable RESTART checkpoints entirely. + + --litestream-incremental-backup-interval-minutes number default: 15 + ZERO_LITESTREAM_INCREMENTAL_BACKUP_INTERVAL_MINUTES env + The interval between incremental backups of the replica. Shorter intervals + reduce the amount of change history that needs to be replayed when catching + up a new view-syncer, at the expense of increasing the number of files needed + to download for the initial litestream restore. + + --litestream-snapshot-backup-interval-hours number default: 12 + ZERO_LITESTREAM_SNAPSHOT_BACKUP_INTERVAL_HOURS env + The interval between snapshot backups of the replica. Snapshot backups + make a full copy of the database to a new litestream generation. This + improves restore time at the expense of bandwidth. Applications with a + large database and low write rate can increase this interval to reduce + network usage for backups (litestream defaults to 24 hours). + + --litestream-restore-parallelism number default: 48 + ZERO_LITESTREAM_RESTORE_PARALLELISM env + The number of WAL files to download in parallel when performing the + initial restore of the replica from the backup. + + --litestream-multipart-concurrency number default: 48 + ZERO_LITESTREAM_MULTIPART_CONCURRENCY env + The number of parts (of size --litestream-multipart-size bytes) + to upload or download in parallel when backing up or restoring the snapshot. + + --litestream-multipart-size number default: 16777216 + ZERO_LITESTREAM_MULTIPART_SIZE env + The size of each part when uploading or downloading the snapshot with + --multipart-concurrency. Note that up to concurrency * size + bytes of memory are used when backing up or restoring the snapshot. + + --storage-db-tmp-dir string optional + ZERO_STORAGE_DB_TMP_DIR env + tmp directory for IVM operator storage. Leave unset to use os.tmpdir() + + --initial-sync-table-copy-workers number default: 5 + ZERO_INITIAL_SYNC_TABLE_COPY_WORKERS env + The number of parallel workers used to copy tables during initial sync. + Each worker uses a database connection and will buffer up to (approximately) + 10 MB of table data in memory during initial sync. Increasing the number of + workers may improve initial sync speed; however, note that local disk throughput + (i.e. IOPS), upstream CPU, and network bandwidth may also be bottlenecks. + + --lazy-startup boolean default: false + ZERO_LAZY_STARTUP env + Delay starting the majority of zero-cache until first request. + + This is mainly intended to avoid connecting to Postgres replication stream + until the first request is received, which can be useful i.e., for preview instances. + + Currently only supported in single-node mode. + + --server-version string optional + ZERO_SERVER_VERSION env + The version string outputted to logs when the server starts up. + + --enable-telemetry boolean default: true + ZERO_ENABLE_TELEMETRY env + Set to false to opt out of telemetry collection. + + This helps us improve Zero by collecting anonymous usage data. + Setting the DO_NOT_TRACK environment variable also disables telemetry. + + --cloud-event-sink-env string optional + ZERO_CLOUD_EVENT_SINK_ENV env + ENV variable containing a URI to a CloudEvents sink. When set, ZeroEvents + will be published to the sink as the data field of CloudEvents. + The source field of the CloudEvents will be set to the ZERO_TASK_ID, + along with any extension attributes specified by the ZERO_CLOUD_EVENT_EXTENSION_OVERRIDES_ENV. + + This configuration is modeled to easily integrate with a knative K_SINK binding, + (i.e. https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding). + However, any CloudEvents sink can be used. + + --cloud-event-extension-overrides-env string optional + ZERO_CLOUD_EVENT_EXTENSION_OVERRIDES_ENV env + ENV variable containing a JSON stringified object with an extensions field + containing attributes that should be added or overridden on outbound CloudEvents. + + This configuration is modeled to easily integrate with a knative K_CE_OVERRIDES binding, + (i.e. https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding). + " `); }); diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index f5646ed75c..dac34ad9bb 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -554,6 +554,30 @@ export const zeroOptions = { `immediately, since the incoming request indicates that the task is registered as a target.`, ], }, + + backPressureLimitHeapProportion: { + type: v.number().default(0.04), + desc: [ + `The percentage of {bold --max-old-space-size} to use as a buffer for absorbing replication`, + `stream spikes. When the estimated amount of queued data exceeds this threshold, back pressure`, + `is applied to the replication stream, delaying downstream sync as a result.`, + ``, + `The threshold was determined empirically with load testing. Higher thresholds have resulted`, + `in OOMs. Note also that the byte-counting logic in the queue is strictly an underestimate of`, + `actual memory usage (but importantly, proportionally correct), so the queue is actually`, + `using more than what this proportion suggests.`, + ``, + `This parameter is exported as an emergency knob to reduce the size of the buffer in the`, + `event that the server OOMs from back pressure. Resist the urge to {italic increase} this`, + `proportion, as it is mainly useful for absorbing periodic spikes and does not meaningfully`, + `affect steady-state replication throughput; the latter is determined by other factors such`, + `as object serialization and PG throughput`, + ``, + `In other words, the back pressure limit does not constrain replication throughput;`, + `rather, it protects the system when the upstream throughput exceeds the downstream`, + `throughput.`, + ], + }, }, taskID: { diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index f626cac712..3550a2265a 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -36,7 +36,13 @@ export default async function runWorker( const config = getNormalizedZeroConfig({env, argv: args.slice(1)}); const { taskID, - changeStreamer: {port, address, protocol, startupDelayMs}, + changeStreamer: { + port, + address, + protocol, + startupDelayMs, + backPressureLimitHeapProportion, + }, upstream, change, replica, @@ -94,6 +100,7 @@ export default async function runWorker( changeSource, subscriptionState, autoReset ?? false, + backPressureLimitHeapProportion, setTimeout, ); break; diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index 0b15edaa3f..a4a017525a 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -78,6 +78,7 @@ describe('change-streamer/service', () => { }, replicaConfig, true, + 0.04, setTimeoutFn as unknown as typeof setTimeout, ); streamerDone = streamer.run(); @@ -863,6 +864,7 @@ describe('change-streamer/service', () => { source, replicaConfig, true, + 0.04, ); void streamer.run(); @@ -887,6 +889,7 @@ describe('change-streamer/service', () => { source, replicaConfig, true, + 0.04, ); void streamer.run(); @@ -908,6 +911,7 @@ describe('change-streamer/service', () => { source, replicaConfig, true, + 0.04, ); void streamer.run(); @@ -941,6 +945,7 @@ describe('change-streamer/service', () => { source, replicaConfig, true, + 0.04, ); void streamer.run(); @@ -977,6 +982,7 @@ describe('change-streamer/service', () => { source, replicaConfig, true, + 0.04, ); void streamer.run(); @@ -1047,6 +1053,7 @@ describe('change-streamer/service', () => { source, replicaConfig, true, + 0.04, ); void streamer.run(); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 947ec99672..d2747fcc9f 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -55,6 +55,7 @@ export async function initializeStreamer( changeSource: ChangeSource, subscriptionState: SubscriptionState, autoReset: boolean, + backPressureLimitHeapProportion: number, setTimeoutFn = setTimeout, ): Promise { // Make sure the ChangeLog DB is set up. @@ -78,6 +79,7 @@ export async function initializeStreamer( replicaVersion, changeSource, autoReset, + backPressureLimitHeapProportion, setTimeoutFn, ); } @@ -274,6 +276,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { replicaVersion: string, source: ChangeSource, autoReset: boolean, + backPressureLimitHeapProportion: number, setTimeoutFn = setTimeout, ) { this.id = `change-streamer`; @@ -292,6 +295,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { replicaVersion, consumed => this.#stream?.acks.push(['status', consumed[1], consumed[2]]), err => this.stop(err), + backPressureLimitHeapProportion, ); this.#forwarder = new Forwarder(); this.#autoReset = autoReset; diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 9121b191fe..547549baa0 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -98,6 +98,7 @@ describe('change-streamer/storer', () => { REPLICA_VERSION, msg => consumed.enqueue(msg), err => fatalErrors.enqueue(err), + 0.04, ); await storer.assumeOwnership(); done = storer.run(); @@ -1536,6 +1537,7 @@ describe('change-streamer/storer', () => { REPLICA_VERSION, msg => consumed.enqueue(msg), err => fatalErrors.enqueue(err), + 0.04, ); await storer.assumeOwnership(); done = storer.run(); diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 70b17f1f6e..cf44265694 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -129,6 +129,7 @@ export class Storer implements Service { replicaVersion: string, onConsumed: (c: Commit | StatusMessage) => void, onFatal: (err: Error) => void, + backPressureLimitHeapProportion: number, ) { this.#lc = lc.withContext('component', 'change-log'); this.#shard = shard; @@ -140,29 +141,10 @@ export class Storer implements Service { this.#onConsumed = onConsumed; this.#onFatal = onFatal; - // Use 5% of the available heap (--max-old-space-size) as the buffer size - // for absorbing replication stream spikes. When the amount of queued data - // exceeds this threshold, back pressure is applied to the replication - // stream, delaying downstream sync as a result. - // - // The threshold was determined empirically with load testing. Higher - // thresholds like 10% have resulted in OOMs. Note also that the - // byte-counting logic in the queue is certainly an underestimate of - // actual memory usage (but importantly, proportionally correct), so - // the queue is actually using more than 5% of the heap. - // - // Resist the urge to "tune" this number; the buffer is useful for - // absorbing periodic spikes to avoid delaying downstream sync, - // but it does not meaningfully affect steady-state replication - // throughput; the latter is determined by other factors such as - // object serialization and PG throughput. - // - // In other words, the back pressure limit is not what constrains - // replication throughput; rather, it protects the system when the - // upstream throughput exceeds the downstream throughput. const heapStats = getHeapStatistics(); this.#backPressureThresholdBytes = - (heapStats.heap_size_limit - heapStats.used_heap_size) * 0.05; + (heapStats.heap_size_limit - heapStats.used_heap_size) * + backPressureLimitHeapProportion; this.#lc.info?.( `Using up to ${(this.#backPressureThresholdBytes / 1024 ** 2).toFixed(2)} MB of ` + From b1bcf5a7370b60c40bfb8ddf14d0ee76afc36cb9 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 13 Feb 2026 09:17:27 +0100 Subject: [PATCH 058/495] chore(zql-integration-tests): Increase timeout for fuzz hydration test (#5553) It keeps timing out on CI. This increases the timeout from 15s to 30s. --- .../chinook/chinook-fuzz-hydration.pg.test.ts | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/zql-integration-tests/src/chinook/chinook-fuzz-hydration.pg.test.ts b/packages/zql-integration-tests/src/chinook/chinook-fuzz-hydration.pg.test.ts index 5d1da9ae5b..e6fbfc3157 100644 --- a/packages/zql-integration-tests/src/chinook/chinook-fuzz-hydration.pg.test.ts +++ b/packages/zql-integration-tests/src/chinook/chinook-fuzz-hydration.pg.test.ts @@ -24,8 +24,10 @@ const harness = await bootstrap({ pgContent, }); +const VITEST_TIMEOUT_MS = 60_000; // set via third argument to test() calls + // Internal timeout for graceful handling (shorter than vitest timeout) -const TEST_TIMEOUT_MS = 15_000; +const TEST_TIMEOUT_MS = VITEST_TIMEOUT_MS / 2; /** * Error thrown when a fuzz test query exceeds the time limit. @@ -60,7 +62,7 @@ function createCheckAbort( test.each(Array.from({length: 100}, () => createCase()))( 'fuzz-hydration $seed', runCase, - 60_000, // vitest timeout: longer than internal timeout to ensure we catch it ourselves + VITEST_TIMEOUT_MS, // vitest timeout: longer than internal timeout to ensure we catch it ourselves ); test('sentinel', () => { @@ -69,18 +71,22 @@ test('sentinel', () => { if (REPRO_SEED) { // oxlint-disable-next-line no-focused-tests - test.only('repro', async () => { - const tc = createCase(REPRO_SEED); - const {query} = tc; - console.log( - 'ZQL', - await formatOutput( - asQueryInternals(query[0]).ast.table + - astToZQL(asQueryInternals(query[0]).ast), - ), - ); - await runCase(tc); - }, 60_000); + test.only( + 'repro', + async () => { + const tc = createCase(REPRO_SEED); + const {query} = tc; + console.log( + 'ZQL', + await formatOutput( + asQueryInternals(query[0]).ast.table + + astToZQL(asQueryInternals(query[0]).ast), + ), + ); + await runCase(tc); + }, + VITEST_TIMEOUT_MS, + ); } function createCase(seed?: number) { From 8fa610468c5819a2da911ecde22f56b8f57482da Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 13 Feb 2026 10:22:09 +0100 Subject: [PATCH 059/495] chore(zero-cache): increase test timeouts for CI (#5554) --- packages/zero-cache/vitest.config.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/zero-cache/vitest.config.ts b/packages/zero-cache/vitest.config.ts index ed7776d727..c428125d04 100644 --- a/packages/zero-cache/vitest.config.ts +++ b/packages/zero-cache/vitest.config.ts @@ -7,6 +7,7 @@ function nameFromURL(url: string) { } export function configForVersion(version: number, url: string) { + const TIMEOUT = (CI ? 2 : 1) * 20_000; const name = nameFromURL(url); const merged = mergeConfig(config, { test: { @@ -19,8 +20,8 @@ export function configForVersion(version: number, url: string) { reporter: [['html'], ['clover', {file: 'coverage.xml'}]], include: ['src/**'], }, - testTimeout: 20000, - hookTimeout: 20000, + testTimeout: TIMEOUT, + hookTimeout: TIMEOUT, }, }); // Override include to only pg tests (mergeConfig merges arrays, we want to replace) From 639a7abb411bf6b7a43cff327764f8eaaf06d60f Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 13 Feb 2026 09:57:32 -0800 Subject: [PATCH 060/495] chore(zero-cache): lower the logging level in TransactionPool (#5558) The TransactionPool redundantly logs errors (that will be handled at the application level). This level of the code does not have the context for classifying errors, so just log them as information. The higher level code will need to handle the error anyway, at which point it can decide how to surface the error. Reference alert: * https://rocicorp.slack.com/archives/C0ABMK92H47/p1771001028991039 --- packages/zero-cache/src/db/transaction-pool.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/zero-cache/src/db/transaction-pool.ts b/packages/zero-cache/src/db/transaction-pool.ts index f304f487d3..699ab713dd 100644 --- a/packages/zero-cache/src/db/transaction-pool.ts +++ b/packages/zero-cache/src/db/transaction-pool.ts @@ -1,7 +1,6 @@ import type {LogContext} from '@rocicorp/logger'; import {type Resolver, resolver} from '@rocicorp/resolver'; import type postgres from 'postgres'; -import {AbortError} from '../../../shared/src/abort-error.ts'; import {assert} from '../../../shared/src/asserts.ts'; import type {Enum} from '../../../shared/src/enum.ts'; import {Queue} from '../../../shared/src/queue.ts'; @@ -467,12 +466,10 @@ export class TransactionPool { fail(err: unknown) { if (!this.#failure) { this.#failure = ensureError(err); // Fail fast: this is checked in the worker loop. + // Logged for informational purposes. It is the responsibility of + // higher level logic to classify and handle the exception. const level = - this.#failure instanceof ControlFlowError - ? 'debug' - : this.#failure instanceof AbortError - ? 'info' - : 'error'; + this.#failure instanceof ControlFlowError ? 'debug' : 'info'; this.#lc[level]?.(this.#failure); for (let i = 0; i < this.#numWorkers; i++) { From 7797295f95b5029f0beddab78def7d0bb5979a38 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 13 Feb 2026 11:14:10 -0800 Subject: [PATCH 061/495] chore(zero-cache): fix backfill batching logic (#5559) Fix the backfill row batching logic to flush at the right chunk sizes. Document that the code defaults to the same chunk size that the Postgres server sends for COPY chunks. (Experiments with increasing this size did not result in meaningful differences in throughput.) --- .../pg/backfill-stream.pg.test.ts | 81 ------------------- .../change-source/pg/backfill-stream.ts | 46 +++++++---- 2 files changed, 31 insertions(+), 96 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts index 6a9dce275b..83265afc38 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts @@ -147,87 +147,6 @@ describe('backfill-stream', () => { ]); }); - test(`column backfill: flushed in small batches`, async () => { - const stream = streamBackfill( - lc, - upstreamURI, - {slot: 'slot_name', publications: ['the_pub']}, - columnBackfillRequest, - {flushThresholdBytes: 1024}, // 1K flush threshold - ); - const results = []; - for await (const msg of stream) { - results.push(msg); - } - expect(results).toMatchObject([ - { - tag: 'backfill', - watermark: expect.any(String), - relation: { - schema: 'public', - name: 'foo', - rowKey: {columns: ['id1', 'id2']}, - }, - columns: ['c', 'b'], - rowValues: [ - [1n, 2, [1, 2, '3', {e: 4}], '{"d" : 1}'], - [2n, 3, [2, 3, '4', {e: 5}], '{"d" : 2}'], - [3n, 4, [3, 4, '5', {e: 6}], '{"d" : 3}'], - ], - }, - { - tag: 'backfill', - watermark: expect.any(String), - relation: { - schema: 'public', - name: 'foo', - rowKey: {columns: ['id1', 'id2']}, - }, - columns: ['c', 'b'], - rowValues: [ - [4n, 5, [4, 5, '6', {e: 7}], '{"d" : 4}'], - [5n, 6, [5, 6, '7', {e: 8}], '{"d" : 5}'], - [6n, 7, [6, 7, '8', {e: 9}], '{"d" : 6}'], - ], - }, - { - tag: 'backfill', - watermark: expect.any(String), - relation: { - schema: 'public', - name: 'foo', - rowKey: {columns: ['id1', 'id2']}, - }, - columns: ['c', 'b'], - rowValues: [ - [7n, 8, [7, 8, '9', {e: 10}], '{"d" : 7}'], - [8n, 9, [8, 9, '10', {e: 11}], '{"d" : 8}'], - [9n, 10, [9, 10, '11', {e: 12}], '{"d" : 9}'], - ], - }, - { - tag: 'backfill', - watermark: expect.any(String), - relation: { - schema: 'public', - name: 'foo', - rowKey: {columns: ['id1', 'id2']}, - }, - columns: ['c', 'b'], - rowValues: [[10n, 11, [10, 11, '12', {e: 13}], '{"d" : 10}']], - }, - { - tag: 'backfill-completed', - relation: { - schema: 'public', - name: 'foo', - rowKey: {columns: ['id1', 'id2']}, - }, - columns: ['c', 'b'], - }, - ]); - }); - test(`table backfill`, async () => { const stream = streamBackfill( lc, diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts index e1170657ce..2bf6b18775 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts @@ -3,7 +3,6 @@ import { PG_UNDEFINED_TABLE, } from '@drdgvhbh/postgres-error-codes'; import type {LogContext} from '@rocicorp/logger'; -import {getDefaultHighWaterMark} from 'node:stream'; import postgres from 'postgres'; import {equals} from '../../../../../shared/src/set-utils.ts'; import * as v from '../../../../../shared/src/valita.ts'; @@ -42,6 +41,11 @@ type StreamOptions = { flushThresholdBytes?: number; }; +// The size of chunks that Postgres sends on COPY stream. +// This happens to match NodeJS's getDefaultHighWatermark() +// (for Node v20+). +const POSTGRES_COPY_CHUNK_SIZE = 64 * 1024; + /** * Streams a series of `backfill` messages (ending with `backfill-complete`) * at a set watermark (i.e. LSN). The data is retrieved via a COPY stream @@ -59,7 +63,7 @@ export async function* streamBackfill( .withContext('component', 'backfill') .withContext('table', bf.table.name); - const {flushThresholdBytes = getDefaultHighWaterMark(false)} = opts; + const {flushThresholdBytes = POSTGRES_COPY_CHUNK_SIZE} = opts; const db = pgClient(lc, upstreamURI, { connection: {['application_name']: 'backfill-stream'}, }); @@ -125,9 +129,18 @@ async function* stream( const tsvParser = new TsvParser(); let totalRows = 0; + let totalBytes = 0; + let totalMsgs = 0; let rowValues: JSONValue[][] = []; let bufferedBytes = 0; + const logFlushed = () => { + lc.debug?.( + `Flushed ${rowValues.length} rows, ${bufferedBytes} bytes ` + + `(total: rows=${totalRows}, msgs=${totalMsgs}, bytes=${totalBytes})`, + ); + }; + // Tracks the row being parsed. let row: JSONValue[] = Array.from({length: colParsers.length}); let col = 0; @@ -140,32 +153,35 @@ async function* stream( if (++col === colParsers.length) { rowValues.push(row); totalRows++; - bufferedBytes += chunk.byteLength; - row = Array.from({length: colParsers.length}); col = 0; - - if (bufferedBytes >= flushThresholdBytes) { - yield {tag: 'backfill', ...backfill, watermark, rowValues}; - lc.debug?.( - `Flushed ${rowValues.length} rows (${bufferedBytes} bytes)`, - ); - rowValues = []; - bufferedBytes = 0; - } } } + bufferedBytes += chunk.byteLength; + totalBytes += chunk.byteLength; + + if (bufferedBytes >= flushThresholdBytes) { + yield {tag: 'backfill', ...backfill, watermark, rowValues}; + totalMsgs++; + logFlushed(); + rowValues = []; + bufferedBytes = 0; + } } // Flush the last batch of rows. if (rowValues.length > 0) { yield {tag: 'backfill', ...backfill, watermark, rowValues}; - lc.debug?.(`Flushed ${rowValues.length} rows (${bufferedBytes} bytes)`); + totalMsgs++; + logFlushed(); } yield {tag: 'backfill-completed', ...backfill}; const elapsed = performance.now() - start; - lc.info?.(`Finished streaming ${totalRows} rows (${elapsed.toFixed(3)} ms)`); + lc.info?.( + `Finished streaming ${totalRows} rows, ${totalMsgs} msgs, ${totalBytes} bytes ` + + `(${elapsed.toFixed(3)} ms)`, + ); } /** From af9211dec3189f171b3fb054b01c1b2d6d1fd8ec Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 13 Feb 2026 16:54:58 -0800 Subject: [PATCH 062/495] chore(zero-cache): improve replication throughput with websocket flow control (#5560) Wait for replication messages to be flushed to the websocket (of view-syncers and the backup-replicator) before pulling more data from upstream. This counterintuitively improves replication throughput and end-to-end responsiveness. Without this `await`: * data gets buffered on the I/O stream, causing memory pressure and slowing the system down due to garbage collection. * work gets queued in the replication-manager while view-syncers sit idle. Then the view-syncers get the work in a large batch which exacerbates the delay. Screenshot 2026-02-13 at 16 11 26 This flow control fix leads to a throughput increase of 6x ~ 15x, depending on the size of the data. ``` Replicating 240K rows (278 MB) ======================== Before: 98 seconds After: 16 seconds Replicating 2.5M rows (2.1GB) ====================== Before: 1700 seconds (~28 minutes) After: 110 seconds ``` --- .../zero-cache/src/db/transaction-pool.ts | 4 +- .../change-streamer-service.ts | 26 +++++++- .../change-streamer/forwarder.test.ts | 19 +++--- .../src/services/change-streamer/forwarder.ts | 7 +-- .../change-streamer/storer.pg.test.ts | 42 +++++++++---- .../src/services/change-streamer/storer.ts | 7 ++- .../change-streamer/subscriber.test.ts | 60 ++++++++++++------- .../services/change-streamer/subscriber.ts | 27 ++++----- 8 files changed, 128 insertions(+), 64 deletions(-) diff --git a/packages/zero-cache/src/db/transaction-pool.ts b/packages/zero-cache/src/db/transaction-pool.ts index 699ab713dd..bf2c8c354b 100644 --- a/packages/zero-cache/src/db/transaction-pool.ts +++ b/packages/zero-cache/src/db/transaction-pool.ts @@ -183,6 +183,7 @@ export class TransactionPool { const timeoutTask = tt.task === 'done' ? 'done' : this.#stmtRunner(tt.task); const worker = async (tx: PostgresTransaction) => { + const start = performance.now(); try { lc.debug?.('started transaction'); disableStatementTimeout(tx); @@ -220,7 +221,8 @@ export class TransactionPool { } } - lc.debug?.('closing transaction'); + const elapsed = performance.now() - start; + lc.debug?.(`closing transaction (${elapsed.toFixed(3)} ms)`); // Given the semantics of a Postgres transaction, the last statement // will only succeed if all of the preceding statements succeeded. return last; diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index d2747fcc9f..2ac251aaef 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -1,5 +1,6 @@ import type {LogContext} from '@rocicorp/logger'; import {resolver} from '@rocicorp/resolver'; +import {getDefaultHighWaterMark} from 'node:stream'; import {unreachable} from '../../../../shared/src/asserts.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import { @@ -315,9 +316,14 @@ class ChangeStreamerImpl implements ChangeStreamerService { .then(() => this.stop()) .catch(e => this.stop(e)); + // The threshold in (estimated number of) bytes to send() on subscriber + // websockets before `await`-ing the I/O buffers to be ready for more. + const flushBytesThreshold = getDefaultHighWaterMark(false); + while (this.#state.shouldRun()) { let err: unknown; let watermark: string | null = null; + let unflushedBytes = 0; try { const {lastWatermark, backfillRequests} = await this.#storer.getStartStreamInitializationParameters(); @@ -358,8 +364,19 @@ class ChangeStreamerImpl implements ChangeStreamerService { break; } - this.#storer.store([watermark, change]); - this.#forwarder.forward([watermark, change]); + unflushedBytes += this.#storer.store([watermark, change]); + const sent = this.#forwarder.forward([watermark, change]); + if (unflushedBytes >= flushBytesThreshold) { + // Wait for messages to clear socket buffers to ensure that they + // make their way to subscribers. Without this `await`, the + // messages end up being buffered in this process, which: + // (1) results in memory pressure and increased GC activity + // (2) prevents subscribers from processing the messages as they + // arrive, instead getting them in a large batch after being + // idle while they were queued (causing further delays). + await sent; + unflushedBytes = 0; + } if (type === 'commit' || type === 'rollback') { watermark = null; @@ -382,7 +399,10 @@ class ChangeStreamerImpl implements ChangeStreamerService { if (watermark) { this.#lc.warn?.(`aborting interrupted transaction ${watermark}`); this.#storer.abort(); - this.#forwarder.forward([watermark, ['rollback', {tag: 'rollback'}]]); + await this.#forwarder.forward([ + watermark, + ['rollback', {tag: 'rollback'}], + ]); } await this.#state.backoff(this.#lc, err); diff --git a/packages/zero-cache/src/services/change-streamer/forwarder.test.ts b/packages/zero-cache/src/services/change-streamer/forwarder.test.ts index 2fd0cdedbb..2ffad5a227 100644 --- a/packages/zero-cache/src/services/change-streamer/forwarder.test.ts +++ b/packages/zero-cache/src/services/change-streamer/forwarder.test.ts @@ -15,15 +15,18 @@ describe('change-streamer/forwarder', () => { const [sub4, stream4] = createSubscriber('00', true); forwarder.add(sub1); - forwarder.forward([ + void forwarder.forward([ '11', ['begin', messages.begin(), {commitWatermark: '13'}], ]); forwarder.add(sub2); - forwarder.forward(['12', ['data', messages.truncate('issues')]]); - forwarder.forward(['13', ['commit', messages.commit(), {watermark: '13'}]]); + void forwarder.forward(['12', ['data', messages.truncate('issues')]]); + void forwarder.forward([ + '13', + ['commit', messages.commit(), {watermark: '13'}], + ]); forwarder.add(sub3); - forwarder.forward([ + void forwarder.forward([ '14', ['begin', messages.begin(), {commitWatermark: '15'}], ]); @@ -154,15 +157,15 @@ describe('change-streamer/forwarder', () => { const [sub4, stream4] = createSubscriber('00', true); forwarder.add(sub1); - forwarder.forward([ + void forwarder.forward([ '11', ['begin', messages.begin(), {commitWatermark: '14'}], ]); forwarder.add(sub2); - forwarder.forward(['12', ['data', messages.truncate('issues')]]); - forwarder.forward(['13', ['rollback', messages.rollback()]]); + void forwarder.forward(['12', ['data', messages.truncate('issues')]]); + void forwarder.forward(['13', ['rollback', messages.rollback()]]); forwarder.add(sub3); - forwarder.forward([ + void forwarder.forward([ '14', ['begin', messages.begin(), {commitWatermark: '15'}], ]); diff --git a/packages/zero-cache/src/services/change-streamer/forwarder.ts b/packages/zero-cache/src/services/change-streamer/forwarder.ts index 1b90e0a90e..deeaac84d6 100644 --- a/packages/zero-cache/src/services/change-streamer/forwarder.ts +++ b/packages/zero-cache/src/services/change-streamer/forwarder.ts @@ -31,11 +31,9 @@ export class Forwarder { * two components have an equivalent interpretation of whether a Transaction is * currently being streamed. */ - forward(entry: WatermarkedChange) { + async forward(entry: WatermarkedChange) { const [type] = entry[1]; - for (const active of this.#active.values()) { - active.send(entry); - } + const results = [...this.#active.values()].map(sub => sub.send(entry)); switch (type) { case 'begin': // While in a Transaction, all added subscribers are "queued" so that no @@ -59,6 +57,7 @@ export class Forwarder { this.#queued.clear(); break; } + await Promise.all(results); } getAcks(): Set { diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 547549baa0..24b68829b5 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -861,8 +861,11 @@ describe('change-streamer/storer', () => { const [sub, _, stream] = createSubscriber('00'); // This should be buffered until catchup is complete. - sub.send(['07', ['begin', messages.begin(), {commitWatermark: '08'}]]); - sub.send(['08', ['commit', messages.commit(), {watermark: '08'}]]); + void sub.send([ + '07', + ['begin', messages.begin(), {commitWatermark: '08'}], + ]); + void sub.send(['08', ['commit', messages.commit(), {watermark: '08'}]]); // Catchup should start immediately since there are no txes in progress. storer.catchup(sub, 'backup'); @@ -980,13 +983,19 @@ describe('change-streamer/storer', () => { const [sub2, _1, stream2] = createSubscriber('06'); // This should be buffered until catchup is complete. - sub1.send(['09', ['begin', messages.begin(), {commitWatermark: '0a'}]]); - sub1.send([ + void sub1.send([ + '09', + ['begin', messages.begin(), {commitWatermark: '0a'}], + ]); + void sub1.send([ '0a', ['commit', messages.commit({buffer: 'me'}), {watermark: '0a'}], ]); - sub2.send(['09', ['begin', messages.begin(), {commitWatermark: '0a'}]]); - sub2.send([ + void sub2.send([ + '09', + ['begin', messages.begin(), {commitWatermark: '0a'}], + ]); + void sub2.send([ '0a', ['commit', messages.commit({buffer: 'me'}), {watermark: '0a'}], ]); @@ -1221,13 +1230,19 @@ describe('change-streamer/storer', () => { const [sub2, _1, stream2] = createSubscriber('06'); // This should be buffered until catchup is complete. - sub1.send(['09', ['begin', messages.begin(), {commitWatermark: '0a'}]]); - sub1.send([ + void sub1.send([ + '09', + ['begin', messages.begin(), {commitWatermark: '0a'}], + ]); + void sub1.send([ '0a', ['commit', messages.commit({buffer: 'me'}), {watermark: '0a'}], ]); - sub2.send(['09', ['begin', messages.begin(), {commitWatermark: '0a'}]]); - sub2.send([ + void sub2.send([ + '09', + ['begin', messages.begin(), {commitWatermark: '0a'}], + ]); + void sub2.send([ '0a', ['commit', messages.commit({buffer: 'me'}), {watermark: '0a'}], ]); @@ -1402,8 +1417,11 @@ describe('change-streamer/storer', () => { const [sub, _0, stream] = createSubscriber('03'); // This should be buffered until catchup is complete. - sub.send(['0b', ['begin', messages.begin(), {commitWatermark: '0c'}]]); - sub.send([ + void sub.send([ + '0b', + ['begin', messages.begin(), {commitWatermark: '0c'}], + ]); + void sub.send([ '0c', ['commit', messages.commit({waa: 'hoo'}), {watermark: '0c'}], ]); diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index cf44265694..5b386dc21f 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -246,6 +246,9 @@ export class Storer implements Service { }); } + /** + * @returns The size of the serialized entry, for memory / I/O estimations. + */ store(entry: WatermarkedChange) { const [watermark, [_tag, change]] = entry; // Eagerly stringify the JSON object so that the memory usage can be @@ -264,6 +267,8 @@ export class Storer implements Service { json, isDataChange(change) ? null : change, // drop DataChanges to save memory ]); + + return json.length; } abort() { @@ -532,7 +537,7 @@ export class Storer implements Service { // Catchup starts from *after* the watermark. watermarkFound = true; } else if (watermarkFound) { - lastBatchConsumed = sub.catchup(toDownstream(entry)).result; + lastBatchConsumed = sub.catchup(toDownstream(entry)); count++; } else if (mode === 'backup') { throw new AutoResetSignal( diff --git a/packages/zero-cache/src/services/change-streamer/subscriber.test.ts b/packages/zero-cache/src/services/change-streamer/subscriber.test.ts index 34056570c3..8c82ea82e5 100644 --- a/packages/zero-cache/src/services/change-streamer/subscriber.test.ts +++ b/packages/zero-cache/src/services/change-streamer/subscriber.test.ts @@ -9,18 +9,21 @@ describe('change-streamer/subscriber', () => { const [sub, stream] = createSubscriber('00'); // Send some messages while it is catching up. - sub.send(['11', ['begin', messages.begin(), {commitWatermark: '12'}]]); - sub.send(['12', ['commit', messages.commit(), {watermark: '12'}]]); + void sub.send(['11', ['begin', messages.begin(), {commitWatermark: '12'}]]); + void sub.send(['12', ['commit', messages.commit(), {watermark: '12'}]]); // Send catchup messages. - sub.catchup(['01', ['begin', messages.begin(), {commitWatermark: '02'}]]); - sub.catchup(['02', ['commit', messages.commit(), {watermark: '02'}]]); + void sub.catchup([ + '01', + ['begin', messages.begin(), {commitWatermark: '02'}], + ]); + void sub.catchup(['02', ['commit', messages.commit(), {watermark: '02'}]]); sub.setCaughtUp(); // Send some messages after catchup. - sub.send(['21', ['begin', messages.begin(), {commitWatermark: '22'}]]); - sub.send(['22', ['commit', messages.commit(), {watermark: '22'}]]); + void sub.send(['21', ['begin', messages.begin(), {commitWatermark: '22'}]]); + void sub.send(['22', ['commit', messages.commit(), {watermark: '22'}]]); sub.close(); @@ -96,21 +99,33 @@ describe('change-streamer/subscriber', () => { // Technically, catchup should never send any messages if the subscriber // is ahead, since the watermark query would return no results. But pretend it // does just to ensure that catchup messages are subject to the filter. - sub.catchup(['01', ['begin', messages.begin(), {commitWatermark: '02'}]]); - sub.catchup(['02', ['commit', messages.commit(), {watermark: '02'}]]); + void sub.catchup([ + '01', + ['begin', messages.begin(), {commitWatermark: '02'}], + ]); + void sub.catchup(['02', ['commit', messages.commit(), {watermark: '02'}]]); sub.setCaughtUp(); // Still lower than the watermark ... - sub.send(['121', ['begin', messages.begin(), {commitWatermark: '123'}]]); - sub.send(['123', ['commit', messages.commit(), {watermark: '123'}]]); + void sub.send([ + '121', + ['begin', messages.begin(), {commitWatermark: '123'}], + ]); + void sub.send(['123', ['commit', messages.commit(), {watermark: '123'}]]); // These should be sent. - sub.send(['124', ['begin', messages.begin(), {commitWatermark: '125'}]]); - sub.send(['125', ['commit', messages.commit(), {watermark: '125'}]]); + void sub.send([ + '124', + ['begin', messages.begin(), {commitWatermark: '125'}], + ]); + void sub.send(['125', ['commit', messages.commit(), {watermark: '125'}]]); // Replays should be ignored. - sub.send(['124', ['begin', messages.begin(), {commitWatermark: '125'}]]); - sub.send(['125', ['commit', messages.commit(), {watermark: '125'}]]); + void sub.send([ + '124', + ['begin', messages.begin(), {commitWatermark: '125'}], + ]); + void sub.send(['125', ['commit', messages.commit(), {watermark: '125'}]]); sub.close(); expect(stream).toMatchInlineSnapshot(` @@ -147,20 +162,23 @@ describe('change-streamer/subscriber', () => { const [sub, _, receiver] = createSubscriber('00'); // Send some messages while it is catching up. - sub.send(['11', ['begin', messages.begin(), {commitWatermark: '12'}]]); - sub.send(['12', ['commit', messages.commit(), {watermark: '12'}]]); + void sub.send(['11', ['begin', messages.begin(), {commitWatermark: '12'}]]); + void sub.send(['12', ['commit', messages.commit(), {watermark: '12'}]]); // Send catchup messages. - sub.catchup(['01', ['begin', messages.begin(), {commitWatermark: '02'}]]); - sub.catchup(['02', ['commit', messages.commit(), {watermark: '02'}]]); + void sub.catchup([ + '01', + ['begin', messages.begin(), {commitWatermark: '02'}], + ]); + void sub.catchup(['02', ['commit', messages.commit(), {watermark: '02'}]]); sub.setCaughtUp(); // Send some messages after catchup. - sub.send(['21', ['begin', messages.begin(), {commitWatermark: '22'}]]); - sub.send(['22', ['commit', messages.commit(), {watermark: '22'}]]); + void sub.send(['21', ['begin', messages.begin(), {commitWatermark: '22'}]]); + void sub.send(['22', ['commit', messages.commit(), {watermark: '22'}]]); - sub.send(['31', ['begin', messages.begin(), {commitWatermark: '31'}]]); + void sub.send(['31', ['begin', messages.begin(), {commitWatermark: '31'}]]); expect(sub.acked).toBe('00'); diff --git a/packages/zero-cache/src/services/change-streamer/subscriber.ts b/packages/zero-cache/src/services/change-streamer/subscriber.ts index 720c8bc348..d2cdf066b4 100644 --- a/packages/zero-cache/src/services/change-streamer/subscriber.ts +++ b/packages/zero-cache/src/services/change-streamer/subscriber.ts @@ -2,7 +2,6 @@ import {assert} from '../../../../shared/src/asserts.ts'; import type {Enum} from '../../../../shared/src/enum.ts'; import {max} from '../../types/lexi-version.ts'; import type {Subscription} from '../../types/subscription.ts'; -import {type PendingResult} from '../../types/subscription.ts'; import type {ChangeStreamData} from '../change-source/protocol/current.ts'; import type {WatermarkedChange} from './change-streamer-service.ts'; import {type Downstream} from './change-streamer.ts'; @@ -47,13 +46,13 @@ export class Subscriber { return this.#acked; } - send(change: WatermarkedChange) { + async send(change: WatermarkedChange) { const [watermark] = change; if (watermark > this.#watermark) { if (this.#backlog) { this.#backlog.push(change); } else { - this.#send(change); + await this.#send(change); } } } @@ -68,9 +67,9 @@ export class Subscriber { } /** catchup() is called on ChangeEntries loaded from the store. */ - catchup(change: WatermarkedChange): PendingResult { + async catchup(change: WatermarkedChange) { this.#ensureInitialStatusSent(); - return this.#send(change); + await this.#send(change); } /** @@ -83,19 +82,23 @@ export class Subscriber { this.#backlog, 'setCaughtUp() called but subscriber is not in catchup mode', ); + // Note that this method must be asynchronous in order for send() to + // interpret the #backlog variable correctly. This is the only place + // where I/O flow control is not heeded. However, it will be awaited + // by the next caller to send(). for (const change of this.#backlog) { - this.#send(change); + void this.#send(change); } this.#backlog = null; } - #send(change: WatermarkedChange): PendingResult { + async #send(change: WatermarkedChange) { const [watermark, downstream] = change; if (watermark <= this.watermark) { - return ALREADY_CONSUMED_RESULT; + return; } if (!this.supportsMessage(downstream[1])) { - return ALREADY_CONSUMED_RESULT; + return; } const pending = this.#downstream.push(downstream); if (downstream[0] === 'commit') { @@ -106,7 +109,7 @@ export class Subscriber { } }); } - return pending; + await pending.result; } supportsMessage(change: ChangeStreamData[1]) { @@ -132,7 +135,3 @@ export class Subscriber { } } } - -const ALREADY_CONSUMED_RESULT: PendingResult = { - result: Promise.resolve('consumed'), -}; From 9bcbd78a707cb8ac89f89f0ed4a8541b724c2fe2 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 14 Feb 2026 11:34:47 -0800 Subject: [PATCH 063/495] chore(zero-cache): add no-ack status messages to change protocol (#5564) Backwards compatible change to the `status` messages in the change-source protocol to allow the change-source to put no-ack-required status messages in the change stream. These correspond to status messages in the pg logical replication stream indicating an advancement in the LSN without a requirement for the client to respond back. To reduce churn in the change-streamer, these new messages are filtered out by the change stream multiplexer, but listeners are notified of them. LSN advancement information is needed for the backfill algorithm to know when the replication stream has exceeded the backfill snapshot LSN. --- .../common/change-stream-multiplexer.test.ts | 16 +++++++-- .../common/change-stream-multiplexer.ts | 15 ++++++-- .../pg/change-source.end-to-mid.pg.test.ts | 3 ++ .../change-source/pg/change-source.pg.test.ts | 12 +++++-- .../change-source/pg/change-source.ts | 2 +- .../pg/logical-replication/stream.pg.test.ts | 3 ++ .../pg/logical-replication/stream.ts | 13 +++---- .../protocol/current/downstream.ts | 4 +-- .../change-source/protocol/current/status.ts | 35 ++++++++++++++----- .../protocol/current/upstream.ts | 4 +-- .../change-source/protocol/version.test.ts | 4 +-- .../change-streamer-service.pg.test.ts | 13 +++---- .../change-streamer-service.ts | 4 ++- .../change-streamer/storer.pg.test.ts | 16 ++++----- .../src/services/change-streamer/storer.ts | 10 +++--- 15 files changed, 104 insertions(+), 50 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts index cde2fa69f6..55103fba04 100644 --- a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts +++ b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts @@ -7,7 +7,10 @@ import { vi, } from 'vitest'; import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; -import type {ChangeStreamMessage} from '../protocol/current.ts'; +import type { + ChangeStreamMessage, + DownstreamStatusMessage, +} from '../protocol/current.ts'; import {ChangeStreamMultiplexer} from './change-stream-multiplexer.ts'; type CancelFn = () => void; @@ -33,7 +36,7 @@ describe('change-stream-multiplexer', () => { test('reservations', async () => { // pushStatus() does not require a reservation. - stream.pushStatus(['status', {tag: 'status'}, {watermark: 'foo'}]); + stream.pushStatus(['status', {ack: true}, {watermark: 'foo'}]); // However, other pushes should fail with an assert. expect(() => @@ -110,5 +113,14 @@ describe('change-stream-multiplexer', () => { expect(listenFn1).toHaveBeenNthCalledWith(2, commit); expect(listenFn2).toHaveBeenNthCalledWith(2, commit); + + const status: DownstreamStatusMessage = [ + 'status', + {ack: false}, + {watermark: '124'}, + ]; + void stream.pushStatus(status); + expect(listenFn1).toHaveBeenNthCalledWith(3, status); + expect(listenFn2).toHaveBeenNthCalledWith(3, status); }); }); diff --git a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts index a6a806e618..4ad5cefff3 100644 --- a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts +++ b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts @@ -3,7 +3,10 @@ import {resolver} from '@rocicorp/resolver'; import {assert} from '../../../../../shared/src/asserts.ts'; import type {Source} from '../../../types/streams.ts'; import {Subscription} from '../../../types/subscription.ts'; -import type {ChangeStreamMessage, StatusMessage} from '../protocol/current.ts'; +import type { + ChangeStreamMessage, + DownstreamStatusMessage, +} from '../protocol/current.ts'; export type Cancelable = { cancel(): void; @@ -122,8 +125,14 @@ export class ChangeStreamMultiplexer { * does not constitute a data change and can appear anywhere * in the stream. */ - pushStatus(message: StatusMessage) { - this.#sub.push(message); + pushStatus(message: DownstreamStatusMessage) { + // Let listeners know about all status messages. + this.#listeners.forEach(l => l.onChange(message)); + // The ChangeStreamer only cares about status messages requiring an ack. + // To reduce churn, avoid sending other status messages. + if (message[1].ack) { + this.#sub.push(message); + } } /** diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index f324be84e3..46d8c9194e 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -102,6 +102,9 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { const queue = new Queue(); void (async () => { for await (const msg of sub) { + if (msg[0] === 'status' && !msg[1].ack) { + continue; // filter out keepalives + } queue.enqueue(msg); } })(); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index f0daccf343..d184cf6127 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -107,6 +107,9 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { void (async () => { try { for await (const msg of sub) { + if (msg[0] === 'status' && !msg[1].ack) { + continue; // filter out keepalives + } queue.enqueue(msg); } } catch (e) { @@ -277,7 +280,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { {tag: 'commit'}, {watermark: begin1[2]?.commitWatermark}, ]); - acks.push(['status', {}, commit1[2]]); + acks.push(['status', {ack: true}, commit1[2]]); // Write more upstream changes. await upstream.begin(async tx => { @@ -404,7 +407,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { {tag: 'commit'}, {watermark: begin1[2]?.commitWatermark}, ]); - acks.push(['status', {}, commit1[2]]); + acks.push(['status', {ack: true}, commit1[2]]); }); test.each([ @@ -815,7 +818,10 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { let err; try { - for await (const _ of changes) { + for await (const msg of changes) { + if (msg[0] === 'status') { + continue; + } throw new Error('DatabaseError was not thrown'); } } catch (e) { diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 892d00a463..9e38cef0d7 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -304,7 +304,7 @@ class PostgresChangeSource implements ChangeSource { if (msg.tag === 'keepalive') { changes.pushStatus([ 'status', - msg, + {ack: msg.shouldRespond}, {watermark: majorVersionToString(lsn)}, ]); continue; diff --git a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.pg.test.ts index 14a20fbbd4..ed34d14c03 100644 --- a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.pg.test.ts @@ -57,6 +57,9 @@ describe('pg/logic-replication', {timeout: 30000}, () => { void (async () => { try { for await (const msg of sub) { + if (msg[1].tag === 'keepalive') { + continue; // filter out keepalives + } queue.enqueue(msg[1]); } } catch (e) { diff --git a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts index 8bf254b23a..87b67de0ec 100644 --- a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts @@ -19,7 +19,10 @@ import type {Message} from './pgoutput.types.ts'; const DEFAULT_RETRIES_IF_REPLICATION_SLOT_ACTIVE = 5; -export type StreamMessage = [lsn: bigint, Message | {tag: 'keepalive'}]; +export type StreamMessage = [ + lsn: bigint, + Message | {tag: 'keepalive'; shouldRespond: boolean}, +]; // Expose the `queued` variable of the Subscription to allow // the change-source to determine if there are more messages @@ -218,11 +221,9 @@ function parseStreamMessage( // XLogData return [lsn, parser.parse(buffer.subarray(25))]; } - if (buffer.readInt8(17)) { - // Primary keepalive message: shouldRespond - return [lsn, {tag: 'keepalive'}]; - } - return null; + // Primary keepalive message: shouldRespond + const shouldRespond = buffer.readInt8(17) !== 0; + return [lsn, {tag: 'keepalive', shouldRespond}]; } // https://www.postgresql.org/docs/current/protocol-replication.html#PROTOCOL-REPLICATION-STANDBY-STATUS-UPDATE diff --git a/packages/zero-cache/src/services/change-source/protocol/current/downstream.ts b/packages/zero-cache/src/services/change-source/protocol/current/downstream.ts index a944ad9a08..c2139dee8b 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/downstream.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/downstream.ts @@ -7,7 +7,7 @@ import { rollbackSchema, schemaChangeSchema, } from './data.ts'; -import {statusMessageSchema} from './status.ts'; +import {downstreamStatusMessageSchema} from './status.ts'; const begin = v.tuple([ v.literal('begin'), @@ -43,7 +43,7 @@ export type ChangeStreamControl = v.Infer; export const changeStreamMessageSchema = v.union( changeStreamDataSchema, changeStreamControlSchema, - statusMessageSchema, + downstreamStatusMessageSchema, ); export type ChangeStreamMessage = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/protocol/current/status.ts b/packages/zero-cache/src/services/change-source/protocol/current/status.ts index 58a4b85851..3337a037ff 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/status.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/status.ts @@ -1,21 +1,35 @@ import * as v from '../../../../../../shared/src/valita.ts'; +import {commitSchema} from './data.ts'; /** - * The StatusMessage payload itself is unspecified. The `zero-cache` will - * send the Commit payload when acknowledging a completed transaction, and - * will echo back whatever message was sent from the ChangeSource when - * acknowledging a downstream StatusMessage. + * The downstream status message indicates whether it should be echoed + * back in an upstream status message. */ -export const statusSchema = v.object({}); +export const downstreamStatusSchema = v.object({ + ack: v.boolean().optional(() => true), +}); -export const statusMessageSchema = v.tuple([ +export type DownstreamStatus = v.Infer; + +export const downstreamStatusMessageSchema = v.tuple([ + v.literal('status'), + downstreamStatusSchema, + v.object({watermark: v.string()}), +]); + +/** + * The `zero-cache` will send the Commit payload when acknowledging a + * completed transaction, and will echo back the downstreamStatus message + * if `ack` is true. + */ +export const upstreamStatusMessageSchema = v.tuple([ v.literal('status'), - statusSchema, + v.union(downstreamStatusSchema, commitSchema), v.object({watermark: v.string()}), ]); /** - * A StatusMessage conveys positional information from both the ChangeSource + * Status messages convey positional information from both the ChangeSource * and the `zero-cache`. * * A StatusMessage from the ChangeSource indicates a position in its change @@ -39,4 +53,7 @@ export const statusMessageSchema = v.tuple([ * its change log purely from Commit-driven StatusMessages there is no need * for the ChangeSource to send StatusMessages. */ -export type StatusMessage = v.Infer; +export type DownstreamStatusMessage = v.Infer< + typeof downstreamStatusMessageSchema +>; +export type UpstreamStatusMessage = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/protocol/current/upstream.ts b/packages/zero-cache/src/services/change-source/protocol/current/upstream.ts index 293c580e17..8d81a611dd 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/upstream.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/upstream.ts @@ -4,10 +4,10 @@ import { identifierSchema, tableMetadataSchema, } from './data.ts'; -import {statusMessageSchema} from './status.ts'; +import {upstreamStatusMessageSchema} from './status.ts'; /** At the moment, the only upstream messages are status messages. */ -export const changeSourceUpstreamSchema = statusMessageSchema; +export const changeSourceUpstreamSchema = upstreamStatusMessageSchema; export type ChangeSourceUpstream = v.Infer; /** diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index 630e899822..2cef9b9ae5 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '35xbr3b3bx7j5', '/changes/v0/stream'); + t(current, '41i4ql7mf1at', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '35xbr3b3bx7j5', '/changes/v0/stream'); + t(v0, '41i4ql7mf1at', '/changes/v0/stream'); }); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index a4a017525a..23e5081722 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -14,7 +14,7 @@ import type {PostgresDB} from '../../types/pg.ts'; import type {Source} from '../../types/streams.ts'; import {Subscription, type Result} from '../../types/subscription.ts'; import {type ChangeStreamMessage} from '../change-source/protocol/current/downstream.ts'; -import type {StatusMessage} from '../change-source/protocol/current/status.ts'; +import type {UpstreamStatusMessage} from '../change-source/protocol/current/status.ts'; import { getSubscriptionState, initReplicationState, @@ -36,7 +36,7 @@ describe('change-streamer/service', () => { let sql: PostgresDB; let streamer: ChangeStreamerService; let changes: Subscription; - let acks: Queue; + let acks: Queue; let streamerDone: Promise; // vi.useFakeTimers() does not play well with the postgres client. @@ -149,7 +149,8 @@ describe('change-streamer/service', () => { {watermark: '09'}, ]); - changes.push(['status', {}, {watermark: '0b'}]); + changes.push(['status', {ack: false}, {watermark: '0a'}]); + changes.push(['status', {ack: true}, {watermark: '0b'}]); expect(await nextChange(downstream)).toMatchObject({tag: 'status'}); expect(await nextChange(downstream)).toMatchObject({tag: 'begin'}); @@ -225,7 +226,7 @@ describe('change-streamer/service', () => { initial: true, }); - changes.push(['status', {}, {watermark: '0a'}]); + changes.push(['status', {ack: true}, {watermark: '0a'}]); // Process more upstream changes. changes.push(['begin', messages.begin(), {commitWatermark: '0b'}]); @@ -236,7 +237,7 @@ describe('change-streamer/service', () => { {watermark: '0b'}, ]); - changes.push(['status', {}, {watermark: '0d'}]); + changes.push(['status', {ack: true}, {watermark: '0d'}]); // Verify that all changes were sent to the subscriber ... const downstream = drainToQueue(sub); @@ -340,7 +341,7 @@ describe('change-streamer/service', () => { changes.push(['data', messages.delete('foo', {id: 'world'})]); changes.push(['rollback', messages.rollback()]); - changes.push(['status', {}, {watermark: '0d'}]); + changes.push(['status', {ack: true}, {watermark: '0d'}]); // Verify that all changes were sent to the subscriber ... const downstream = drainToQueue(sub); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 2ac251aaef..10a45b00d0 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -339,7 +339,9 @@ class ChangeStreamerImpl implements ChangeStreamerService { const [type, msg] = change; switch (type) { case 'status': - this.#storer.status(change); // storer acks once it gets through its queue + if (msg.ack) { + this.#storer.status(change); // storer acks once it gets through its queue + } continue; case 'control': await this.#handleControlMessage(msg); diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 24b68829b5..3db98d04ad 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -6,7 +6,7 @@ import {type PgTest, test} from '../../test/db.ts'; import type {PostgresDB} from '../../types/pg.ts'; import type {Subscription} from '../../types/subscription.ts'; import {type Commit} from '../change-source/protocol/current/downstream.ts'; -import type {StatusMessage} from '../change-source/protocol/current/status.ts'; +import type {UpstreamStatusMessage} from '../change-source/protocol/current/status.ts'; import {ReplicationMessages} from '../replicator/test-utils.ts'; import {type Downstream} from './change-streamer.ts'; import * as ErrorType from './error-type-enum.ts'; @@ -19,7 +19,7 @@ describe('change-streamer/storer', () => { let db: PostgresDB; let storer: Storer; let done: Promise; - let consumed: Queue; + let consumed: Queue; let fatalErrors: Queue; let shard: {appID: string; shardNum: number}; @@ -1014,8 +1014,8 @@ describe('change-streamer/storer', () => { ['commit', messages.commit({extra: 'stuff'}), {watermark: '08'}], ]); - storer.status(['status', {}, {watermark: '0e'}]); - storer.status(['status', {}, {watermark: '0f'}]); + storer.status(['status', {ack: true}, {watermark: '0e'}]); + storer.status(['status', {ack: true}, {watermark: '0f'}]); // Catchup should wait for the transaction to complete before querying // the database, and start after watermark '03'. @@ -1258,8 +1258,8 @@ describe('change-streamer/storer', () => { // Rollback the transaction. storer.store(['08', ['rollback', messages.rollback()]]); - storer.status(['status', {}, {watermark: '0a'}]); - storer.status(['status', {}, {watermark: '0c'}]); + storer.status(['status', {ack: true}, {watermark: '0a'}]); + storer.status(['status', {ack: true}, {watermark: '0c'}]); // Catchup should wait for the transaction to complete before querying // the database, and start after watermark '03'. @@ -1448,8 +1448,8 @@ describe('change-streamer/storer', () => { ]); storer.store(['0a', ['commit', messages.commit(), {watermark: '0a'}]]); - storer.status(['status', {}, {watermark: '0d'}]); - storer.status(['status', {}, {watermark: '0e'}]); + storer.status(['status', {ack: true}, {watermark: '0d'}]); + storer.status(['status', {ack: true}, {watermark: '0e'}]); // Wait for the storer to commit that transaction. for (let i = 0; i < 10; i++) { diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 5b386dc21f..ba595fedde 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -30,7 +30,7 @@ import { type TableMetadata, } from '../change-source/protocol/current.ts'; import {type Commit} from '../change-source/protocol/current/downstream.ts'; -import type {StatusMessage} from '../change-source/protocol/current/status.ts'; +import type {UpstreamStatusMessage} from '../change-source/protocol/current/status.ts'; import type {ReplicatorMode} from '../replicator/replicator.ts'; import type {Service} from '../service.ts'; import type {WatermarkedChange} from './change-streamer-service.ts'; @@ -59,7 +59,7 @@ type QueueEntry = ] | ['ready', callback: () => void] | ['subscriber', SubscriberAndMode] - | StatusMessage + | UpstreamStatusMessage | ['abort'] | 'stop'; @@ -111,7 +111,7 @@ export class Storer implements Service { readonly #discoveryProtocol: string; readonly #db: PostgresDB; readonly #replicaVersion: string; - readonly #onConsumed: (c: Commit | StatusMessage) => void; + readonly #onConsumed: (c: Commit | UpstreamStatusMessage) => void; readonly #onFatal: (err: Error) => void; readonly #queue = new Queue(); readonly #backPressureThresholdBytes: number; @@ -127,7 +127,7 @@ export class Storer implements Service { discoveryProtocol: string, db: PostgresDB, replicaVersion: string, - onConsumed: (c: Commit | StatusMessage) => void, + onConsumed: (c: Commit | UpstreamStatusMessage) => void, onFatal: (err: Error) => void, backPressureLimitHeapProportion: number, ) { @@ -275,7 +275,7 @@ export class Storer implements Service { this.#queue.enqueue(['abort']); } - status(s: StatusMessage) { + status(s: UpstreamStatusMessage) { this.#queue.enqueue(s); } From 13b2cc71e5580a10228c80c42fb5dd8ab1f21254 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 14 Feb 2026 12:13:31 -0800 Subject: [PATCH 064/495] chore(zero-cache): include the watermark in backfill-completed (#5565) Include the watermark (i.e. LSN) of the backfill snapshot in the `backfill-completed` message as well. The replication logic does not need this information, but the backfill manager will need it to correctly determine the second condition of backfill completeness; namely, that the replication stream has caught up to the backfill snapshot ([reference](https://www.notion.so/replicache/Auto-backfill-Schema-Change-Replication-2cb3bed8954580ee8c92e3a730c38772?source=copy_link#2cc3bed8954580518b34cb8c67b048f5)). Although the information is available in the `backfill` messages containing row data, those will not be produced for empty tables, and the condition applies to empty tables as well. Upcoming: condition the emission of `backfill-complete` on the replication stream catching up to its LSN. --- .../common/backfill-manager.test.ts | 33 +++++++++++++++++++ .../change-source/pg/backfill-stream.ts | 15 ++++++--- .../change-source/protocol/current/data.ts | 6 ++++ .../change-source/protocol/version.test.ts | 4 +-- .../change-streamer/storer.pg.test.ts | 1 + .../replicator/change-processor.test.ts | 3 ++ .../replicator/incremental-sync.test.ts | 1 + 7 files changed, 56 insertions(+), 7 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts index 9600cbe1f3..17676f5867 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts @@ -103,6 +103,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['b'], + watermark: '130', }, ]); @@ -151,6 +152,7 @@ describe('backfill-manager', () => { columns: ['b'], relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, tag: 'backfill-completed', + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '123.01'}], @@ -194,6 +196,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['b'], + watermark: '130', }, ]); void backfillManager.run('123', []); @@ -278,6 +281,7 @@ describe('backfill-manager', () => { columns: ['b'], relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, tag: 'backfill-completed', + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '125.01'}], @@ -321,6 +325,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['b'], + watermark: '130', }, ]); void backfillManager.run('123', []); @@ -396,6 +401,7 @@ describe('backfill-manager', () => { columns: ['b'], relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, tag: 'backfill-completed', + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '130.01'}], @@ -419,6 +425,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'boo', name: 'far', rowKey: {columns: ['z']}}, columns: ['d', 'c'], + watermark: '130', }, ]); void backfillManager.run('123', []); @@ -552,6 +559,7 @@ describe('backfill-manager', () => { schema: 'boo', }, tag: 'backfill-completed', + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '125.01'}], @@ -580,6 +588,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['b'], + watermark: '120', }, ], [ @@ -587,6 +596,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: [], + watermark: '130', }, ], ); @@ -646,6 +656,7 @@ describe('backfill-manager', () => { rowKey: {columns: ['a']}, }, columns: [], + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '125.01'}], @@ -680,6 +691,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['a', 'b'], + watermark: '120', }, ], [ @@ -687,6 +699,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'boo', name: 'far', rowKey: {columns: ['a']}}, columns: ['a', 'b'], + watermark: '130', }, ], ); @@ -746,6 +759,7 @@ describe('backfill-manager', () => { name: 'far', rowKey: {columns: ['a']}, }, + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '125.01'}], @@ -780,6 +794,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['a', 'b'], + watermark: '120', }, ], [ @@ -787,6 +802,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['b']}}, columns: ['a', 'b'], + watermark: '130', }, ], ); @@ -849,6 +865,7 @@ describe('backfill-manager', () => { name: 'bar', rowKey: {columns: ['b']}, }, + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '125.01'}], @@ -895,6 +912,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['a', 'b'], + watermark: '120', }, ], [ @@ -914,6 +932,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['a', 'b'], + watermark: '130', }, ], ); @@ -994,6 +1013,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', columns: ['a', 'b'], relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '140.01'}], @@ -1027,6 +1047,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['a', 'b'], + watermark: '120', }, ]); await changeStream.reserve('main'); @@ -1092,6 +1113,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['b'], + watermark: '120', }, ]); await changeStream.reserve('main'); @@ -1172,6 +1194,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['a', 'b'], + watermark: '130', }, ], [ @@ -1191,6 +1214,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['c', 'd'], + watermark: '150', }, ], ); @@ -1283,6 +1307,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', columns: ['a', 'b'], relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '140.01'}], @@ -1308,6 +1333,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', columns: ['c', 'd'], relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '150', }, ], ['commit', {tag: 'commit'}, {watermark: '140.02'}], @@ -1345,6 +1371,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['b'], + watermark: '130', }, ], ); @@ -1368,6 +1395,7 @@ describe('backfill-manager', () => { columns: ['b'], relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, tag: 'backfill-completed', + watermark: '130', }, ], ['commit', {tag: 'commit'}, {watermark: '123.01'}], @@ -1423,6 +1451,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: []}}, columns: ['id'], + watermark: '150', }, ], [ @@ -1437,6 +1466,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: []}}, columns: ['id'], + watermark: '150', }, ], // This time the table has a row key. @@ -1452,6 +1482,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['id']}}, columns: [], + watermark: '188', }, ], ); @@ -1485,6 +1516,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['id']}}, columns: [], + watermark: '188', }, ], ['commit', {tag: 'commit'}, {watermark: '123.01'}], @@ -1552,6 +1584,7 @@ describe('backfill-manager', () => { tag: 'backfill-completed', relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, columns: ['b'], + watermark: '130', }, ]); await changeStream.reserve('main'); diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts index 2bf6b18775..590d91ff65 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts @@ -70,7 +70,12 @@ export async function* streamBackfill( const tx = new TransactionPool(lc, READONLY).run(db); try { const watermark = await setSnapshot(lc, upstreamURI, tx, slot); - const {tableSpec, backfill} = await validateSchema(tx, publications, bf); + const {tableSpec, backfill} = await validateSchema( + tx, + publications, + bf, + watermark, + ); const types = await getTypeParsers(db, {returnJsonAsString: true}); // Note: validateSchema ensures that the rowKey and columns are disjoint @@ -81,7 +86,6 @@ export async function* streamBackfill( lc, tx, backfill, - watermark, makeSelectPublishedStmt(tableSpec, cols), cols.map(col => types.getTypeParser(tableSpec.columns[col].typeOID)), flushThresholdBytes, @@ -116,7 +120,6 @@ async function* stream( lc: LogContext, tx: TransactionPool, backfill: BackfillParams, - watermark: string, selectStmt: string, colParsers: TypeParser[], flushThresholdBytes: number, @@ -161,7 +164,7 @@ async function* stream( totalBytes += chunk.byteLength; if (bufferedBytes >= flushThresholdBytes) { - yield {tag: 'backfill', ...backfill, watermark, rowValues}; + yield {tag: 'backfill', ...backfill, rowValues}; totalMsgs++; logFlushed(); rowValues = []; @@ -171,7 +174,7 @@ async function* stream( // Flush the last batch of rows. if (rowValues.length > 0) { - yield {tag: 'backfill', ...backfill, watermark, rowValues}; + yield {tag: 'backfill', ...backfill, rowValues}; totalMsgs++; logFlushed(); } @@ -236,6 +239,7 @@ function validateSchema( tx: TransactionPool, publications: string[], bf: BackfillRequest, + watermark: string, ): Promise<{ tableSpec: PublishedTableSpec; backfill: BackfillParams; @@ -304,6 +308,7 @@ function validateSchema( columns: Object.keys(bf.columns).filter( col => !(col in tableMeta.rowKey), ), + watermark, }; return {tableSpec: spec, backfill}; }); diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.ts index b7e79de5ec..db76fd4045 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/data.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.ts @@ -282,6 +282,12 @@ export const backfillCompletedSchema = v.object({ // The columns to be backfilled. `rowKey` columns are automatically excluded, // which means that this field may be empty. columns: v.array(v.string()), + + // The watermark at which the backfill data was queried. Note that this + // generally will be different from the commit watermarks of the main change + // stream, and in particular, the commit watermark of the backfill change's + // enclosing transaction. + watermark: v.string(), }); export type MessageBegin = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index 2cef9b9ae5..a5fc0f80b5 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '41i4ql7mf1at', '/changes/v0/stream'); + t(current, '1zl8ygis5w4j0', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '41i4ql7mf1at', '/changes/v0/stream'); + t(v0, '1zl8ygis5w4j0', '/changes/v0/stream'); }); diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 3db98d04ad..2ad8c495b7 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -662,6 +662,7 @@ describe('change-streamer/storer', () => { rowKey: {columns: ['a']}, }, columns: [], + watermark: '0f', }, ], ]); diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index efebbb4410..345859f74d 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -3059,6 +3059,7 @@ describe('replicator/change-processor', () => { rowKey: {columns: ['b', 'a', 'c']}, }, columns: ['d', 'e'], + watermark: '115', }, ], ['commit', fooBarBaz.commit(), {watermark: '123.02'}], @@ -3263,6 +3264,7 @@ describe('replicator/change-processor', () => { rowKey: {columns: ['b', 'a', 'c']}, }, columns: ['d', 'e'], + watermark: '115', }, ], ['commit', fooBarBaz.commit(), {watermark: '123.02'}], @@ -3427,6 +3429,7 @@ describe('replicator/change-processor', () => { rowKey: {columns: ['b', 'a', 'c']}, }, columns: ['d', 'e'], + watermark: '115', }, ], ['commit', fooBarBaz.commit(), {watermark: '123.01'}], diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index 96bca0a470..bf0cf75df4 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -637,6 +637,7 @@ describe('replicator/incremental-sync', () => { rowKey: {columns: ['issueID']}, }, columns: ['new_column'], + watermark: '110', }, ], ['commit', issues.commit(), {watermark: '110.02'}], From eea13457367eae0198393bbc52a1ef8648feea2c Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 14 Feb 2026 13:25:36 -0800 Subject: [PATCH 065/495] chore(zero-cache): release reservations kept for keepalive (#5566) Release the replication stream reservation if it was kept because of keepalives in the queue. This isn't expected to happen in practice but it is theoretically possible for upstreams with a lot of outside-of-publication activity. --- .../change-source/pg/change-source.ts | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 9e38cef0d7..cb254b1b5e 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -208,6 +208,10 @@ async function checkAndUpdateUpstream( // Parameterize this if necessary. In practice starvation may never happen. const MAX_LOW_PRIORITY_DELAY_MS = 1000; +type ReservationState = { + lastWatermark?: string; +}; + /** * Postgres implementation of a {@link ChangeSource} backed by a logical * replication stream. @@ -297,7 +301,8 @@ class PostgresChangeSource implements ChangeSource { void (async function () { try { - let reserved = false; + let reservation: ReservationState | null = null; + let inTransaction = false; for await (const [lsn, msg] of messages) { // Note: no reservation is needed for pushStatus(). @@ -307,13 +312,21 @@ class PostgresChangeSource implements ChangeSource { {ack: msg.shouldRespond}, {watermark: majorVersionToString(lsn)}, ]); + + // If we're not in a transaction but the last reservation was kept + // because of pending keepalives in the queue, release the + // reservation. + if (!inTransaction && reservation?.lastWatermark) { + changes.release(reservation.lastWatermark); + reservation = null; + } continue; } - if (!reserved) { + if (!reservation) { const res = changes.reserve('replication'); typeof res === 'string' || (await res); // awaits should be uncommon - reserved = true; + reservation = {}; } let lastChange: ChangeStreamMessage | undefined; @@ -322,18 +335,26 @@ class PostgresChangeSource implements ChangeSource { lastChange = change; } - if ( - lastChange?.[0] === 'commit' && - (messages.queued === 0 || - changes.waiterDelay() > MAX_LOW_PRIORITY_DELAY_MS) - ) { - // After each transaction, release the reservation: - // - if there are no pending upstream messages - // - or if a low priority request has been waiting for longer - // than MAX_LOW_PRIORITY_DELAY_MS. This is to prevent - // (backfill) starvation on very active upstreams. - changes.release(lastChange[2].watermark); - reserved = false; + switch (lastChange?.[0]) { + case 'begin': + inTransaction = true; + break; + case 'commit': + inTransaction = false; + reservation.lastWatermark = lastChange[2].watermark; + if ( + messages.queued === 0 || + changes.waiterDelay() > MAX_LOW_PRIORITY_DELAY_MS + ) { + // After each transaction, release the reservation: + // - if there are no pending upstream messages + // - or if a low priority request has been waiting for longer + // than MAX_LOW_PRIORITY_DELAY_MS. This is to prevent + // (backfill) starvation on very active upstreams. + changes.release(reservation.lastWatermark); + reservation = null; + } + break; } } } catch (e) { From 9b181011e6b6ee79bbfc492e2ff2e661dd2595a1 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 14 Feb 2026 14:27:46 -0800 Subject: [PATCH 066/495] chore(zero-cache): wait for change-stream to reach backfill LSN (#5567) Wait for the change-stream LSN to reach or exceed the backfill LSN before sending the `backfill-complete` message. This is required by the [backfill algorithm](https://www.notion.so/replicache/Auto-backfill-Schema-Change-Replication-2cb3bed8954580ee8c92e3a730c38772?source=copy_link#2cc3bed8954580518b34cb8c67b048f5) in order to guarantee that the replica data is consistent before publishing the backfilled columns. --- .../common/backfill-manager.test.ts | 45 +++++++---- .../change-source/common/backfill-manager.ts | 74 +++++++++++++++---- 2 files changed, 91 insertions(+), 28 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts index 17676f5867..b57a8c670e 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts @@ -107,7 +107,7 @@ describe('backfill-manager', () => { }, ]); - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -118,6 +118,8 @@ describe('backfill-manager', () => { }, ]); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); + expect(await drainChanges(5)).toMatchObject([ ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], [ @@ -199,7 +201,8 @@ describe('backfill-manager', () => { watermark: '130', }, ]); - void backfillManager.run('123', []); + + backfillManager.run('123', []); await changeStream.reserve('main'); for (const msg of [ @@ -229,6 +232,8 @@ describe('backfill-manager', () => { } changeStream.release('125'); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); + expect(await drainChanges(8)).toMatchObject([ ['begin', {tag: 'begin'}, {commitWatermark: '125'}], [ @@ -328,7 +333,8 @@ describe('backfill-manager', () => { watermark: '130', }, ]); - void backfillManager.run('123', []); + + backfillManager.run('123', []); await changeStream.reserve('main'); for (const msg of [ @@ -428,7 +434,7 @@ describe('backfill-manager', () => { watermark: '130', }, ]); - void backfillManager.run('123', []); + backfillManager.run('123', []); await changeStream.reserve('main'); for (const msg of [ @@ -546,6 +552,7 @@ describe('backfill-manager', () => { void changeStream.push(msg); } changeStream.release('125'); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); expect((await drainChanges(15)).slice(-3)).toMatchObject([ ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], @@ -604,7 +611,7 @@ describe('backfill-manager', () => { // Backfill manager will start the first request and block on the // 'main' change-stream reservation. - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -631,6 +638,7 @@ describe('backfill-manager', () => { void changeStream.push(msg); } changeStream.release('125'); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); // The first request is canceled and only the changes from // the updated request are streamed. @@ -707,7 +715,7 @@ describe('backfill-manager', () => { // Backfill manager will start the first request and block on the // 'main' change-stream reservation. - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -734,6 +742,7 @@ describe('backfill-manager', () => { void changeStream.push(msg); } changeStream.release('125'); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); // The first request is canceled and only the changes from // the updated request are streamed. @@ -810,7 +819,7 @@ describe('backfill-manager', () => { // Backfill manager will start the first request and block on the // 'main' change-stream reservation. - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -839,6 +848,7 @@ describe('backfill-manager', () => { void changeStream.push(msg); } changeStream.release('125'); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); // The first request is canceled and only the changes from // the updated request are streamed. @@ -940,7 +950,7 @@ describe('backfill-manager', () => { // Backfill manager will start the first request block on the // 'main' change-stream reservation. - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -1054,7 +1064,7 @@ describe('backfill-manager', () => { // Backfill manager will start the first request and block on the // 'main' change-stream reservation. - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -1120,7 +1130,7 @@ describe('backfill-manager', () => { // Backfill manager will start the first request and block on the // 'main' change-stream reservation. - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {b: {id: '234'}}, table: { @@ -1222,7 +1232,7 @@ describe('backfill-manager', () => { // Backfill manager will start the first request block on the // 'main' change-stream reservation. - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -1261,6 +1271,7 @@ describe('backfill-manager', () => { void changeStream.push(msg); } changeStream.release('140'); + changeStream.pushStatus(['status', {ack: false}, {watermark: '150'}]); expect(await drainChanges(12)).toMatchObject([ ['begin', {tag: 'begin'}, {commitWatermark: '140'}], @@ -1376,7 +1387,7 @@ describe('backfill-manager', () => { ], ); - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -1387,6 +1398,8 @@ describe('backfill-manager', () => { }, ]); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); + expect(await drainChanges(3)).toMatchObject([ ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], [ @@ -1487,7 +1500,7 @@ describe('backfill-manager', () => { ], ); - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {id: {id: '123'}}, table: { @@ -1498,6 +1511,8 @@ describe('backfill-manager', () => { }, ]); + changeStream.pushStatus(['status', {ack: false}, {watermark: '188'}]); + expect(await drainChanges(4)).toMatchObject([ ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], [ @@ -1590,7 +1605,7 @@ describe('backfill-manager', () => { await changeStream.reserve('main'); // Start the backfill with the table already reserved. - void backfillManager.run('123', [ + backfillManager.run('123', [ { columns: {a: {id: '123'}, b: {id: '234'}}, table: { @@ -1601,6 +1616,8 @@ describe('backfill-manager', () => { }, ]); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); + // Repeatedly reserve and hold the reservation for 2 ms. void (async function () { let ver = majorVersionFromString('140'); diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts index 1bccc26bb1..b97c1541e5 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -1,4 +1,5 @@ import type {LogContext} from '@rocicorp/logger'; +import {resolver} from '@rocicorp/resolver'; import {assert} from '../../../../../shared/src/asserts.ts'; import {stringify} from '../../../../../shared/src/bigint-json.ts'; import {CustomKeyMap} from '../../../../../shared/src/custom-key-map.ts'; @@ -6,10 +7,8 @@ import {must} from '../../../../../shared/src/must.ts'; import {randInt} from '../../../../../shared/src/rand.ts'; import {JSON_STRINGIFIED, type JSONFormat} from '../../../types/lite.ts'; import { - majorVersionToString, stateVersionFromString, stateVersionToString, - type StateVersion, } from '../../../types/state-version.ts'; import type { BackfillCompleted, @@ -35,12 +34,17 @@ type BackfillStreamer = ( type RunningBackfillState = { request: BackfillRequest; canceledReason?: string | undefined; - minMajorVersion: string; + minWatermark: string; }; const MIN_BACKOFF_INTERVAL_MS = 2_000; const MAX_BACKOFF_INTERVAL_MS = 60_000; +type AwaitingStatusWatermark = { + watermark: string; + reached: () => void; +}; + /** * The BackfillManager initiates backfills for BackfillRequests from the * change-streamer (i.e. unfinished backfills from previous sessions) @@ -80,7 +84,12 @@ export class BackfillManager implements Cancelable, Listener { #runningBackfill: RunningBackfillState | null = null; /** The last seen watermark in the change stream. */ - #changeStreamWatermark: StateVersion | null = null; + #lastStatusWatermark: string | null = null; + + readonly #awaitingStatusWatermarks: AwaitingStatusWatermark[] = []; + + /** The watermark of the current transaction in the change stream. */ + #currentTxWatermark: string | null = null; constructor( lc: LogContext, @@ -104,13 +113,40 @@ export class BackfillManager implements Cancelable, Listener { `starting backfill manager with ${initialRequests.length} initial requests`, {requests: initialRequests}, ); - this.#changeStreamWatermark = stateVersionFromString(lastWatermark); + this.#lastStatusWatermark = lastWatermark; initialRequests.forEach(req => this.#setRequiredBackfill('initial-request', req), ); this.#checkAndStartBackfill(); } + #setLastStatusWatermark({watermark}: {watermark: string}) { + // Only allow the watermark to move forward. This prevents a backfill + // transaction (whose watermark is unrelated to change-stream state) + // from moving the watermark backwards. + if ((this.#lastStatusWatermark ?? '') < watermark) { + this.#lastStatusWatermark = watermark; + for (let i = this.#awaitingStatusWatermarks.length - 1; i >= 0; i--) { + const awaiting = this.#awaitingStatusWatermarks[i]; + if (watermark >= awaiting.watermark) { + awaiting.reached(); + this.#awaitingStatusWatermarks.splice(i, 1); + } + } + } + } + + async #changeStreamReached(lc: LogContext, watermark: string) { + if ((this.#lastStatusWatermark ?? '') < watermark) { + const {promise, resolve: reached} = resolver(); + this.#awaitingStatusWatermarks.push({watermark, reached}); + lc.info?.( + `waiting for change stream (at ${this.#lastStatusWatermark}) to reach ${watermark}`, + ); + await promise; + } + } + readonly #minBackoffMs: number; readonly #maxBackoffMs: number; #retryDelayMs: number; @@ -128,7 +164,7 @@ export class BackfillManager implements Cancelable, Listener { // problematic backfills. const candidates = [...this.#requiredBackfills.values()]; const request = candidates[randInt(0, candidates.length - 1)]; - const state = {request, minMajorVersion: ''}; + const state = {request, minWatermark: ''}; const lc = this.#lc.withContext('table', request.table.name); this.#runningBackfill = state; @@ -180,12 +216,12 @@ export class BackfillManager implements Cancelable, Listener { // had changes that resulted in invalidating / canceling this backfill. if ( state.canceledReason || - (msg.tag === 'backfill' && msg.watermark < state.minMajorVersion) + (msg.tag === 'backfill' && msg.watermark < state.minWatermark) ) { if (state.canceledReason === undefined) { assert(msg.tag === 'backfill'); // TypeScript should have figured this out. this.#stopRunningBackfill( - `row key change at ${state.minMajorVersion} ` + + `row key change at ${state.minWatermark} ` + `postdates backfill watermark at ${msg.watermark}`, state, ); @@ -242,6 +278,12 @@ export class BackfillManager implements Cancelable, Listener { return; // this backfill is canceled } + if (msg.tag === 'backfill-completed') { + // The change stream must reach or exceed the backfill snapshot before + // the backfill is considered complete. + await this.#changeStreamReached(lc, msg.watermark); + } + // `await` to allow the change streamer to exert back pressure // on backfills. await changeStream.push(['data', msg]); @@ -296,17 +338,21 @@ export class BackfillManager implements Cancelable, Listener { */ onChange(message: ChangeStreamMessage): void { if (message[0] === 'begin') { - this.#changeStreamWatermark = stateVersionFromString( - message[2].commitWatermark, - ); + this.#currentTxWatermark = message[2].commitWatermark; return; } if (message[0] === 'commit') { + this.#currentTxWatermark = null; + this.#setLastStatusWatermark(message[2]); // Every commit is a candidate for starting the next backfill // (if one is not currently running). this.#checkAndStartBackfill(); return; } + if (message[0] === 'status') { + this.#setLastStatusWatermark(message[2]); + return; + } if (message[0] !== 'data') { return; } @@ -444,7 +490,7 @@ export class BackfillManager implements Cancelable, Listener { case 'update': { const {relation, key, new: row} = change; const backfill = this.#backfillRunningFor(relation); - const {major} = must(this.#changeStreamWatermark, `not in a tx`); + const txWatermark = must(this.#currentTxWatermark, `not in a tx`); if (backfill?.request.table.metadata && key !== null) { // A corner case that backfill is unable to correctly handle is // when a row's key changes; this is decomposed into a delete @@ -457,10 +503,10 @@ export class BackfillManager implements Cancelable, Listener { backfill.request.table.metadata.rowKey, )) { if (key[col] !== row[col]) { - backfill.minMajorVersion = majorVersionToString(major); + backfill.minWatermark = txWatermark; this.#lc.info?.( `key for row as changed (col: ${col}). ` + - `backfill data must not predate ${backfill.minMajorVersion}`, + `backfill data must not predate ${backfill.minWatermark}`, ); break; } From 59aa88f1288dc632cefd105b013413fcca17a2ed Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 14 Feb 2026 18:19:33 -0800 Subject: [PATCH 067/495] feat: auto-backfill table/column data for schema changes (#5570) Automatically backfill table/column data for schema changes where the data does not come through the postgres logical replication stream. This includes: * Adding a table to the zero publication via `ALTER PUBLICATION` or `ALTER SCHEMA` statements * Adding a column with an expression as the `DEFAULT` value, including `current_time`, `now()`, `random()`, etc. * Adding a generated column (for PG 18+ publications with `publish_generated_columns=true`) Previously these schema changes were either unsupported or required user workarounds involving an `UPDATE` statement to pipe all of the rows in the table through the replication stream. This has the downside of delaying other upstream changes (such as user mutations) while the table data is occupies the replication stream. With auto-backfill, these workarounds are no longer required (and in fact, should _not_ be employed). Instead, the zero-cache will create empty, initially unsynced tables/columns (i.e. not visible to clients) and backfill the data in the background, allowing normal replicated changes to flow through the system while it is happening. When the backfill is complete, the new data will be published / synced to clients. Design: https://www.notion.so/replicache/Auto-backfill-Schema-Change-Replication-2cb3bed8954580ee8c92e3a730c38772 --- .../src/integration/integration.pg.test.ts | 34 + .../pg/change-source.backfill.pg.test.ts | 624 ++++++++++++++++++ .../pg/change-source.end-to-mid.pg.test.ts | 558 +++++++++------- .../change-source/pg/change-source.pg.test.ts | 8 - .../change-source/pg/change-source.ts | 50 +- 5 files changed, 1007 insertions(+), 267 deletions(-) create mode 100644 packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts diff --git a/packages/zero-cache/src/integration/integration.pg.test.ts b/packages/zero-cache/src/integration/integration.pg.test.ts index 279429cbb8..f1c6dd6c76 100644 --- a/packages/zero-cache/src/integration/integration.pg.test.ts +++ b/packages/zero-cache/src/integration/integration.pg.test.ts @@ -544,6 +544,7 @@ describe('integration', {timeout: 30000}, () => { } const WATERMARK_REGEX = /[0-9a-z]{4,}/; + const BACKFILL_WATERMARK_REGEX = /[0-9a-z]{4,}\.[0-9a-z]{2,}/; test.for([ ['single-node', 'pg', () => [env], undefined], @@ -878,6 +879,39 @@ describe('integration', {timeout: 30000}, () => { {pokeID: WATERMARK_REGEX}, ]); + // Test backfill of a new column + if (backend === 'pg') { + await upDB.unsafe(/*sql*/ ` + ALTER TABLE foo ADD COLUMN espresso INT DEFAULT (1 + 2 + 3) * 6; + `); + expect(await downstream.dequeue()).toMatchObject([ + 'pokeStart', + {pokeID: BACKFILL_WATERMARK_REGEX}, + ]); + expect(await downstream.dequeue()).toMatchObject([ + 'pokePart', + { + pokeID: BACKFILL_WATERMARK_REGEX, + rowsPatch: [ + { + op: 'put', + tableName: 'foo', + value: {id: 'bar', espresso: 36}, + }, + { + op: 'put', + tableName: 'foo', + value: {id: 'voo', espresso: 36}, + }, + ], + }, + ]); + expect(await downstream.dequeue()).toMatchObject([ + 'pokeEnd', + {pokeID: BACKFILL_WATERMARK_REGEX}, + ]); + } + // Test TRUNCATE if (backend === 'pg') { await upDB`TRUNCATE TABLE foo RESTART IDENTITY`; diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts new file mode 100644 index 0000000000..84c926fc14 --- /dev/null +++ b/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts @@ -0,0 +1,624 @@ +import type {LogContext} from '@rocicorp/logger'; +import {beforeEach, describe, expect, test} from 'vitest'; +import { + BigIntJSON, + type JSONValue, +} from '../../../../../shared/src/bigint-json.ts'; +import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import {Queue} from '../../../../../shared/src/queue.ts'; +import {randInt} from '../../../../../shared/src/rand.ts'; +import {sleep} from '../../../../../shared/src/sleep.ts'; +import type {Database} from '../../../../../zqlite/src/db.ts'; +import {computeZqlSpecs} from '../../../db/lite-tables.ts'; +import type {LiteTableSpec} from '../../../db/specs.ts'; +import {getConnectionURI, testDBs} from '../../../test/db.ts'; +import {DbFile, expectMatchingObjectsInTables} from '../../../test/lite.ts'; +import type {PostgresDB} from '../../../types/pg.ts'; +import type {Source} from '../../../types/streams.ts'; +import type {ChangeProcessor} from '../../replicator/change-processor.ts'; +import {createChangeProcessor} from '../../replicator/test-utils.ts'; +import type {DataOrSchemaChange} from '../protocol/current/data.ts'; +import type { + ChangeStreamData, + ChangeStreamMessage, +} from '../protocol/current/downstream.ts'; +import {initializePostgresChangeSource} from './change-source.ts'; + +const APP_ID = 'bf'; +const PG_15_UP = 150000; +const PG_18_UP = 180000; + +describe('change-source/pg/backfill-test', {timeout: 30000}, () => { + let lc: LogContext; + let upstream: PostgresDB; + let pgVersion: number; + let replicaDbFile: DbFile; + let replica: Database; + let changes: Source; + let downstream: Queue; + let replicator: ChangeProcessor; + + beforeEach(async () => { + lc = createSilentLogContext(); + upstream = await testDBs.create('change_source_backfill_test_upstream'); + [{pgVersion}] = + await upstream`SELECT current_setting('server_version_num')::int as "pgVersion"`; + replicaDbFile = new DbFile('change_source_backfill_test_replica'); + replica = replicaDbFile.connect(lc); + + const upstreamURI = getConnectionURI(upstream); + + await upstream.unsafe(/*sql */ ` + + -- Initially unpublished + CREATE TABLE foo( + id INT PRIMARY KEY, + num INT, + big TEXT, + json JSON, + jsons JSON[] + ); + + CREATE SCHEMA IF NOT EXISTS published; + + CREATE TABLE published.bar( + id INT PRIMARY KEY, + num INT + ); + + -- Seed the published.bar table with toastable values. + DO $$ + BEGIN + FOR i IN 1..3 LOOP + INSERT INTO published.bar (id, num) VALUES(i, i); + END LOOP; + END $$; + + CREATE PUBLICATION zero_published FOR TABLES IN SCHEMA published; + `); + + const source = ( + await initializePostgresChangeSource( + lc, + upstreamURI, + {appID: APP_ID, publications: ['zero_published'], shardNum: 0}, + replicaDbFile.path, + {tableCopyWorkers: 5}, + ) + ).changeSource; + const stream = await source.startStream('00'); + + changes = stream.changes; + downstream = drainToQueue(changes); + replicator = createChangeProcessor(replica); + + return async () => { + changes?.cancel(); + await testDBs.drop(upstream); + replicaDbFile.delete(); + }; + }, 30000); + + function drainToQueue( + sub: Source, + ): Queue { + const queue = new Queue(); + void (async () => { + for await (const msg of sub) { + queue.enqueue(msg); + } + })(); + return queue; + } + + const BIG_TOASTABLE_VALUE = 'a'.repeat(1_000_000); + + async function nextTransaction(): Promise { + const data: DataOrSchemaChange[] = []; + for (;;) { + const change = await downstream.dequeue('timeout', 5000); + if (change === 'timeout') { + throw new Error('timed out waiting for change'); + } + const [type] = change; + if (type !== 'control' && type !== 'status') { + replicator.processMessage( + lc, + // To properly simulate the changes being passed over the wire, + // serialize and parse the messages. This has the side effect of + // removing `undefined` values from UPDATEs with omitted toasted + // values. + BigIntJSON.parse(BigIntJSON.stringify(change)) as ChangeStreamData, + ); + } + + switch (type) { + case 'begin': + break; + case 'data': + data.push(change[1]); + break; + case 'commit': + case 'rollback': + case 'control': + case 'status': + return data; + default: + change satisfies never; + } + } + } + + test.for([ + [ + 'table added to published schema', + PG_15_UP, + /*sql*/ ` + DO $$ + BEGIN + FOR i IN 1..3 LOOP + INSERT INTO foo (id, num, big, json, jsons) + VALUES(i, i, + REPEAT('a', 10), + json_build_object('d', i), + ARRAY[to_json(i), to_json(i+1), to_json((i+2)::text), json_build_object('e', i+3)] + ); + END LOOP; + END $$; + + ALTER TABLE foo SET SCHEMA published; + `, + null, + { + ['published.foo']: [ + { + big: 'aaaaaaaaaa', + id: 1n, + json: '{"d" : 1}', + jsons: '[1,2,"3",{"e":4}]', + num: 1n, + }, + { + big: 'aaaaaaaaaa', + id: 2n, + json: '{"d" : 2}', + jsons: '[2,3,"4",{"e":5}]', + num: 2n, + }, + { + big: 'aaaaaaaaaa', + id: 3n, + json: '{"d" : 3}', + jsons: '[3,4,"5",{"e":6}]', + num: 3n, + }, + ], + }, + [ + { + name: 'published.foo', + columns: { + id: {dataType: 'int4|NOT_NULL', pos: 1}, + num: {dataType: 'int4', pos: 2}, + big: {dataType: 'text', pos: 3}, + json: {dataType: 'json', pos: 4}, + jsons: {dataType: 'json[]|TEXT_ARRAY', pos: 5}, + }, + }, + ], + ], + [ + 'table added to publication with row filter', + PG_15_UP, + /*sql*/ ` + DO $$ + BEGIN + FOR i IN 1..6 LOOP + INSERT INTO foo (id, num, big, json, jsons) + VALUES(i, i, + REPEAT('a', 10), + json_build_object('d', i), + ARRAY[to_json(i), to_json(i+1), to_json((i+2)::text), json_build_object('e', i+3)] + ); + END LOOP; + END $$; + + ALTER PUBLICATION zero_published + ADD TABLE foo WHERE (id % 2 = 0); + `, + null, + { + ['foo']: [ + { + big: 'aaaaaaaaaa', + id: 2n, + json: '{"d" : 2}', + jsons: '[2,3,"4",{"e":5}]', + num: 2n, + }, + { + big: 'aaaaaaaaaa', + id: 4n, + json: '{"d" : 4}', + jsons: '[4,5,"6",{"e":7}]', + num: 4n, + }, + { + big: 'aaaaaaaaaa', + id: 6n, + json: '{"d" : 6}', + jsons: '[6,7,"8",{"e":9}]', + num: 6n, + }, + ], + }, + [ + { + name: 'foo', + columns: { + id: {dataType: 'int4|NOT_NULL', pos: 1}, + num: {dataType: 'int4', pos: 2}, + big: {dataType: 'text', pos: 3}, + json: {dataType: 'json', pos: 4}, + jsons: {dataType: 'json[]|TEXT_ARRAY', pos: 5}, + }, + }, + ], + ], + [ + 'toasted values with updates during backfill', + PG_15_UP, + /*sql*/ ` + DO $$ + BEGIN + FOR i IN 1..9 LOOP + INSERT INTO foo (id, num, big) + VALUES(i, i, REPEAT('a', 1000000)); -- BIG_TOASTABLE_VALUE + END LOOP; + END $$; + + ALTER TABLE foo SET SCHEMA published; + `, + // Then UPDATE non-toasted values during the backfill + /*sql*/ ` + DO $$ + BEGIN + FOR i IN 1..9 LOOP + UPDATE published.foo SET num = i+1 WHERE id = i; + END LOOP; + END $$; + `, + { + ['published.foo']: [ + { + big: BIG_TOASTABLE_VALUE, + id: 1n, + num: 2n, + }, + { + big: BIG_TOASTABLE_VALUE, + id: 2n, + num: 3n, + }, + { + big: BIG_TOASTABLE_VALUE, + id: 3n, + num: 4n, + }, + { + big: BIG_TOASTABLE_VALUE, + id: 4n, + num: 5n, + }, + { + big: BIG_TOASTABLE_VALUE, + id: 5n, + num: 6n, + }, + { + big: BIG_TOASTABLE_VALUE, + id: 6n, + num: 7n, + }, + { + big: BIG_TOASTABLE_VALUE, + id: 7n, + num: 8n, + }, + { + big: BIG_TOASTABLE_VALUE, + id: 8n, + num: 9n, + }, + { + big: BIG_TOASTABLE_VALUE, + id: 9n, + num: 10n, + }, + ], + }, + [ + { + name: 'published.foo', + columns: { + id: {dataType: 'int4|NOT_NULL', pos: 1}, + num: {dataType: 'int4', pos: 2}, + big: {dataType: 'text', pos: 3}, + json: {dataType: 'json', pos: 4}, + jsons: {dataType: 'json[]|TEXT_ARRAY', pos: 5}, + }, + }, + ], + ], + [ + 'table added, then column and table renamed', + PG_15_UP, + /*sql*/ ` + DO $$ + BEGIN + FOR i IN 1..3 LOOP + INSERT INTO foo (id, num, big, json, jsons) + VALUES(i, i, + REPEAT('a', 10), + json_build_object('d', i), + ARRAY[to_json(i), to_json(i+1), to_json((i+2)::text), json_build_object('e', i+3)] + ); + END LOOP; + END $$; + + -- Kick off the backfill + ALTER TABLE foo SET SCHEMA published; + `, + // And then rename some of the backfilling stuff. + /*sql*/ ` + ALTER TABLE published.foo RENAME big to bigz; + ALTER TABLE published.foo RENAME to zoo; + `, + { + ['published.zoo']: [ + { + bigz: 'aaaaaaaaaa', + id: 1n, + json: '{"d" : 1}', + jsons: '[1,2,"3",{"e":4}]', + num: 1n, + }, + { + bigz: 'aaaaaaaaaa', + id: 2n, + json: '{"d" : 2}', + jsons: '[2,3,"4",{"e":5}]', + num: 2n, + }, + { + bigz: 'aaaaaaaaaa', + id: 3n, + json: '{"d" : 3}', + jsons: '[3,4,"5",{"e":6}]', + num: 3n, + }, + ], + }, + [ + { + name: 'published.zoo', + columns: { + id: {dataType: 'int4|NOT_NULL', pos: 1}, + num: {dataType: 'int4', pos: 2}, + bigz: {dataType: 'text', pos: 3}, + json: {dataType: 'json', pos: 4}, + jsons: {dataType: 'json[]|TEXT_ARRAY', pos: 5}, + }, + }, + ], + ], + [ + 'column with default expression added', + PG_15_UP, + /*sql*/ ` + ALTER TABLE published.bar ADD COLUMN expr INT DEFAULT (2 + 18) / 4; + `, + null, + { + ['published.bar']: [ + { + id: 1n, + num: 1n, + expr: 5n, + }, + { + id: 2n, + num: 2n, + expr: 5n, + }, + { + id: 3n, + num: 3n, + expr: 5n, + }, + ], + }, + [ + { + name: 'published.bar', + columns: { + id: {dataType: 'int4|NOT_NULL', pos: 1}, + num: {dataType: 'int4', pos: 2}, + expr: {dataType: 'int4', pos: 4}, + }, + }, + ], + ], + [ + 'column renamed while being backfilled', + PG_15_UP, + /*sql*/ ` + ALTER TABLE published.bar ADD COLUMN expr INT DEFAULT 3 * 8 + 21; + `, + /*sql*/ ` + ALTER TABLE published.bar RENAME expr TO expression; + `, + { + ['published.bar']: [ + { + id: 1n, + num: 1n, + expression: 45n, + }, + { + id: 2n, + num: 2n, + expression: 45n, + }, + { + id: 3n, + num: 3n, + expression: 45n, + }, + ], + }, + [ + { + name: 'published.bar', + columns: { + id: {dataType: 'int4|NOT_NULL', pos: 1}, + num: {dataType: 'int4', pos: 2}, + expression: {dataType: 'int4', pos: 4}, + }, + }, + ], + ], + [ + 'add generated column', + PG_18_UP, + /*sql*/ ` + ALTER PUBLICATION zero_published SET (publish_generated_columns=stored); + + ALTER TABLE published.bar ADD COLUMN "genNum2" INT + GENERATED ALWAYS AS (num * 2) STORED; + `, + null, + { + ['published.bar']: [ + { + id: 1n, + num: 1n, + genNum2: 2n, + }, + { + id: 2n, + num: 2n, + genNum2: 4n, + }, + { + id: 3n, + num: 3n, + genNum2: 6n, + }, + ], + }, + [ + { + name: 'published.bar', + columns: { + id: {dataType: 'int4|NOT_NULL', pos: 1}, + num: {dataType: 'int4', pos: 2}, + genNum2: {dataType: 'int4', pos: 4}, + }, + }, + ], + ], + [ + 'empty table with no primary key', + PG_15_UP, + /*sql*/ ` + CREATE TABLE no_pk (id TEXT NOT NULL); + + ALTER TABLE no_pk SET SCHEMA published; + `, + null, + { + ['published.no_pk']: [], + }, + [ + // The table will not show up in the synced tables because + // it has no primary key. + ], + ], + [ + 'non-empty table that eventually gets a primary key', + PG_15_UP, + /*sql*/ ` + CREATE TABLE late_pk (id TEXT NOT NULL); + INSERT INTO late_pk (id) VALUES ('foo'), ('bar'); + + ALTER TABLE late_pk SET SCHEMA published; + `, + /*sql*/ ` + ALTER TABLE published.late_pk ADD PRIMARY KEY (id); + `, + { + ['published.late_pk']: [{id: 'foo'}, {id: 'bar'}], + }, + [ + { + name: 'published.late_pk', + columns: { + id: {dataType: 'text|NOT_NULL', pos: 1}, + }, + }, + ], + ], + ] satisfies [ + name: string, + minPgVersion: number, + statements: string, + statementsAfterDelay: string | null, + expectedData: Record, + expectedLiteTables: LiteTableSpec[], + ][])( + '%s', + async ( + [ + _name, + minPgVersion, + stmts, + stmtsAfterDelay, + expectedData, + expectedTables, + ], + {skip}, + ) => { + if (pgVersion < minPgVersion) { + skip(); + } + await upstream.unsafe(stmts); + const [{lsn}] = await upstream`SELECT pg_current_wal_lsn() as lsn`; + lc.debug?.(`Executed initial statements: ${lsn}`); + + if (stmtsAfterDelay) { + await sleep(randInt(1, 5)); + await upstream.unsafe(stmtsAfterDelay); + const [{lsn}] = await upstream`SELECT pg_current_wal_lsn() as lsn`; + lc.debug?.(`Executed subsequent statements: ${lsn}`); + } + + for (let i = 0; i < 2000; i++) { + const transaction = await nextTransaction(); + if (transaction.at(-1)?.tag === 'backfill-completed') { + break; + } + } + + expectMatchingObjectsInTables(replica, expectedData, 'bigint'); + + const tables = computeZqlSpecs(lc, replica, { + includeBackfillingColumns: false, + }); + for (const t of expectedTables) { + const found = tables.get(t.name); + expect(found?.tableSpec).toMatchObject(t); + } + }, + ); +}); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index 46d8c9194e..df431e1ddc 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -114,7 +114,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { async function nextTransaction(): Promise { const data: DataOrSchemaChange[] = []; for (;;) { - const change = await downstream.dequeue('timeout', 2000); + const change = await downstream.dequeue('timeout', 5000); if (change === 'timeout') { throw new Error('timed out waiting for change'); } @@ -148,15 +148,17 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { gen INT8 GENERATED ALWAYS AS (id + 1) STORED -- Should be excluded );`, [ - { - tag: 'create-table', - metadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {id: {attNum: 1}}, + [ + { + tag: 'create-table', + metadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, }, - }, - {tag: 'create-index'}, + {tag: 'create-index'}, + ], ], {['my.baz']: []}, [ @@ -193,7 +195,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'rename table', 'ALTER TABLE my.baz RENAME TO bar;', - [{tag: 'rename-table'}], + [[{tag: 'rename-table'}]], {['my.bar']: []}, [ { @@ -230,14 +232,16 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'add column', 'ALTER TABLE my.bar ADD name INT8;', [ - { - tag: 'add-column', - tableMetadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {id: {attNum: 1}}, + [ + { + tag: 'add-column', + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, }, - }, + ], ], {['my.bar']: []}, [ @@ -275,7 +279,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'rename column', 'ALTER TABLE my.bar RENAME name TO handle;', - [{tag: 'update-column'}], + [[{tag: 'update-column'}]], {['my.bar']: []}, [ { @@ -312,7 +316,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'change column data type', 'ALTER TABLE my.bar ALTER handle TYPE TEXT;', - [{tag: 'update-column'}], + [[{tag: 'update-column'}]], {['my.bar']: []}, [ { @@ -353,47 +357,49 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ALTER TABLE my.bar ADD PRIMARY KEY (handle); `, [ - {tag: 'drop-index'}, - { - tag: 'update-table-metadata', - table: {schema: 'my', name: 'bar'}, - old: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {id: {attNum: 1}}, - }, - new: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {}, - }, - }, - { - tag: 'update-table-metadata', - table: {schema: 'my', name: 'bar'}, - old: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {}, - }, - new: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {handle: {attNum: 3}}, + [ + {tag: 'drop-index'}, + { + tag: 'update-table-metadata', + table: {schema: 'my', name: 'bar'}, + old: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, + new: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {}, + }, }, - }, - { - tag: 'update-column', - old: { - name: 'handle', - spec: {dataType: 'text', notNull: false, pos: expect.any(Number)}, + { + tag: 'update-table-metadata', + table: {schema: 'my', name: 'bar'}, + old: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {}, + }, + new: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, + }, }, - new: { - name: 'handle', - spec: {dataType: 'text', notNull: true, pos: expect.any(Number)}, + { + tag: 'update-column', + old: { + name: 'handle', + spec: {dataType: 'text', notNull: false, pos: expect.any(Number)}, + }, + new: { + name: 'handle', + spec: {dataType: 'text', notNull: true, pos: expect.any(Number)}, + }, }, - }, - {tag: 'create-index'}, + {tag: 'create-index'}, + ], ], {['my.bar']: []}, [ @@ -439,15 +445,17 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'add unique column to automatically generate index', 'ALTER TABLE my.bar ADD username TEXT UNIQUE;', [ - { - tag: 'add-column', - tableMetadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {handle: {attNum: 3}}, + [ + { + tag: 'add-column', + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, + }, }, - }, - {tag: 'create-index'}, + {tag: 'create-index'}, + ], ], {['my.bar']: []}, [ @@ -500,7 +508,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'rename unique column with associated index', 'ALTER TABLE my.bar RENAME username TO login;', - [{tag: 'update-column'}], + [[{tag: 'update-column'}]], {['my.bar']: []}, [ { @@ -552,7 +560,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'retype unique column with associated index', 'ALTER TABLE my.bar ALTER login TYPE VARCHAR(180);', - [{tag: 'update-column'}], + [[{tag: 'update-column'}]], {['my.bar']: []}, [ { @@ -606,7 +614,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ` ALTER TABLE my.bar ALTER login SET DEFAULT floor(10000 * random())::text; ALTER TABLE my.bar ALTER login SET NOT NULL;`, - [{tag: 'update-column'}], + [[{tag: 'update-column'}]], {['my.bar']: []}, [ { @@ -658,7 +666,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'drop column with index', 'ALTER TABLE my.bar DROP login;', - [{tag: 'drop-index'}, {tag: 'drop-column'}], + [[{tag: 'drop-index'}, {tag: 'drop-column'}]], {['my.bar']: []}, [ { @@ -696,22 +704,24 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'add multiple columns', 'ALTER TABLE my.bar ADD foo TEXT, ADD bar TEXT;', [ - { - tag: 'add-column', - tableMetadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {handle: {attNum: 3}}, + [ + { + tag: 'add-column', + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, + }, }, - }, - { - tag: 'add-column', - tableMetadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {handle: {attNum: 3}}, + { + tag: 'add-column', + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, + }, }, - }, + ], ], {['my.bar']: []}, [ @@ -766,16 +776,18 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'alter, add, and drop columns', 'ALTER TABLE my.bar ALTER foo SET NOT NULL, ADD boo TEXT, DROP bar;', [ - {tag: 'drop-column'}, - {tag: 'update-column'}, - { - tag: 'add-column', - tableMetadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {handle: {attNum: 3}}, + [ + {tag: 'drop-column'}, + {tag: 'update-column'}, + { + tag: 'add-column', + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {handle: {attNum: 3}}, + }, }, - }, + ], ], {['my.bar']: []}, [ @@ -829,7 +841,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'rename schema', 'ALTER SCHEMA my RENAME TO your;', - [{tag: 'drop-index'}, {tag: 'rename-table'}, {tag: 'create-index'}], + [[{tag: 'drop-index'}, {tag: 'rename-table'}, {tag: 'create-index'}]], {['your.bar']: []}, [ { @@ -889,7 +901,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'add unpublished column', 'ALTER TABLE foo ADD "newInt" INT4;', - [], // no DDL event published + [[]], // no DDL event published {}, [ // the view of "foo" is unchanged. @@ -928,22 +940,24 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'alter publication add and drop column', 'ALTER PUBLICATION zero_some_public SET TABLE foo (id, "newInt");', [ - // Since it is an ALTER PUBLICATION command, we should correctly get - // a drop and an add, and not a rename. - { - tag: 'drop-column', - table: {schema: 'public', name: 'foo'}, - column: 'int', - }, - { - tag: 'add-column', - table: {schema: 'public', name: 'foo'}, - tableMetadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {id: {attNum: 1}}, + [ + // Since it is an ALTER PUBLICATION command, we should correctly get + // a drop and an add, and not a rename. + { + tag: 'drop-column', + table: {schema: 'public', name: 'foo'}, + column: 'int', }, - }, + { + tag: 'add-column', + table: {schema: 'public', name: 'foo'}, + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, + }, + ], ], {foo: []}, [ @@ -982,24 +996,26 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'alter publication add multiple columns', 'ALTER PUBLICATION zero_some_public SET TABLE foo (id, "newInt", int, flt);', [ - { - tag: 'add-column', - table: {schema: 'public', name: 'foo'}, - tableMetadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {id: {attNum: 1}}, + [ + { + tag: 'add-column', + table: {schema: 'public', name: 'foo'}, + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, }, - }, - { - tag: 'add-column', - table: {schema: 'public', name: 'foo'}, - tableMetadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {id: {attNum: 1}}, + { + tag: 'add-column', + table: {schema: 'public', name: 'foo'}, + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, }, - }, + ], ], {foo: []}, [ @@ -1053,7 +1069,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'create unpublished table with indexes', 'CREATE TABLE public.boo (id INT8 PRIMARY KEY, name TEXT UNIQUE);', - [], + [[]], {}, [], [], @@ -1062,18 +1078,25 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'alter publication introduces table with indexes and changes columns', 'ALTER PUBLICATION zero_some_public SET TABLE foo (id, flt), boo;', [ - {tag: 'drop-column'}, - {tag: 'drop-column'}, - { - tag: 'create-table', - metadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {id: {attNum: 1}}, + [ + {tag: 'drop-column'}, + {tag: 'drop-column'}, + { + tag: 'create-table', + metadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, + backfill: { + id: {}, + name: {}, + }, }, - }, - {tag: 'create-index'}, - {tag: 'create-index'}, + {tag: 'create-index'}, + {tag: 'create-index'}, + ], + [{tag: 'backfill-completed'}], ], {foo: []}, [ @@ -1155,7 +1178,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { CREATE INDEX foo_flt1 ON foo (flt DESC, id ASC); CREATE INDEX foo_flt2 ON foo (id DESC, flt DESC); `, - [{tag: 'create-index'}, {tag: 'create-index'}], + [[{tag: 'create-index'}, {tag: 'create-index'}]], {foo: []}, [], [ @@ -1177,10 +1200,12 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'drop index', 'DROP INDEX foo_flt1;', [ - { - tag: 'drop-index', - id: {schema: 'public', name: 'foo_flt1'}, - }, + [ + { + tag: 'drop-index', + id: {schema: 'public', name: 'foo_flt1'}, + }, + ], ], {foo: []}, [], @@ -1190,18 +1215,20 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'remove table (with indexes) from publication', `ALTER PUBLICATION zero_some_public DROP TABLE boo`, [ - { - tag: 'drop-index', - id: {schema: 'public', name: 'boo_name_key'}, - }, - { - tag: 'drop-index', - id: {schema: 'public', name: 'boo_pkey'}, - }, - { - tag: 'drop-table', - id: {schema: 'public', name: 'boo'}, - }, + [ + { + tag: 'drop-index', + id: {schema: 'public', name: 'boo_name_key'}, + }, + { + tag: 'drop-index', + id: {schema: 'public', name: 'boo_pkey'}, + }, + { + tag: 'drop-table', + id: {schema: 'public', name: 'boo'}, + }, + ], ], {}, [], @@ -1232,36 +1259,38 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ); `, [ - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - { - tag: 'insert', - new: { - id: 'abc', - int: -2, - big: 9007199254740993n, - bool: true, - timea: 1547253035381.101, - date: 1050105600000, - json: '[{"foo":"bar","bar":"foo"},123]', - jsonb: '{"boo": {"baz": 123}, "far": 456}', - numz: '2', - uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', - intarr: [1, 2, 3, 4, 5], - jsons: [1, '2', {a: 123}], - jsonbs: [4, '5', {b: 678}], + [ + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + {tag: 'add-column'}, + { + tag: 'insert', + new: { + id: 'abc', + int: -2, + big: 9007199254740993n, + bool: true, + timea: 1547253035381.101, + date: 1050105600000, + json: '[{"foo":"bar","bar":"foo"},123]', + jsonb: '{"boo": {"baz": 123}, "far": 456}', + numz: '2', + uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', + intarr: [1, 2, 3, 4, 5], + jsons: [1, '2', {a: 123}], + jsonbs: [4, '5', {b: 678}], + }, }, - }, + ], ], { foo: [ @@ -1416,39 +1445,40 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'no primary key', ` - CREATE TABLE nopk (a TEXT NOT NULL, b TEXT); - ALTER PUBLICATION zero_some_public ADD TABLE nopk; + CREATE TABLE your.nopk (a TEXT NOT NULL, b TEXT); - INSERT INTO nopk (a, b) VALUES ('foo', 'bar'); + INSERT INTO your.nopk (a, b) VALUES ('foo', 'bar'); `, [ - { - tag: 'create-table', - metadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - // Note: This means is will be replicated to SQLite but not synced to clients. - rowKey: {}, + [ + { + tag: 'create-table', + metadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + // Note: This means is will be replicated to SQLite but not synced to clients. + rowKey: {}, + }, }, - }, - { - tag: 'insert', - relation: { - schema: 'public', - name: 'nopk', - replicaIdentity: 'default', - keyColumns: [], // Note: This means is will be replicated to SQLite but not synced to clients. - rowKey: { - columns: [], // Note: This means is will be replicated to SQLite but not synced to clients. - type: 'default', + { + tag: 'insert', + relation: { + schema: 'your', + name: 'nopk', + replicaIdentity: 'default', + keyColumns: [], // Note: This means is will be replicated to SQLite but not synced to clients. + rowKey: { + columns: [], // Note: This means is will be replicated to SQLite but not synced to clients. + type: 'default', + }, }, }, - }, + ], ], - {nopk: [{a: 'foo', b: 'bar'}]}, + {['your.nopk']: [{a: 'foo', b: 'bar'}]}, [ { - name: 'nopk', + name: 'your.nopk', columns: { a: { characterMaximumLength: null, @@ -1503,34 +1533,56 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { UPDATE existing_full SET a = a; `, [ - { - tag: 'create-table', - metadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: { - a: {attNum: 1}, - b: {attNum: 2}, + [ + { + tag: 'create-table', + metadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: { + a: {attNum: 1}, + b: {attNum: 2}, + }, }, }, - }, - {tag: 'create-index'}, - {tag: 'create-index'}, - {tag: 'update-table-metadata'}, - {tag: 'update'}, - {tag: 'update'}, - {tag: 'update-table-metadata'}, - { - tag: 'create-table', - metadata: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {a: {attNum: 1}}, // computes the shortest eligible key + {tag: 'create-index'}, + {tag: 'create-index'}, + {tag: 'update-table-metadata'}, + {tag: 'update'}, + {tag: 'update'}, + {tag: 'update-table-metadata'}, + { + tag: 'create-table', + metadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {a: {attNum: 1}}, // computes the shortest eligible key + }, }, - }, - {tag: 'create-index'}, - {tag: 'update'}, - {tag: 'update'}, + {tag: 'create-index'}, + {tag: 'update'}, + {tag: 'update'}, + ], + [ + { + tag: 'backfill', + rowValues: [ + ['c', 'd'], + ['e', 'f'], + ], + }, + {tag: 'backfill-completed'}, + ], + [ + { + tag: 'backfill', + rowValues: [ + ['c', 'd'], + ['e', 'f'], + ], + }, + {tag: 'backfill-completed'}, + ], ], { existing: [ @@ -1621,23 +1673,25 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ALTER TABLE existing REPLICA IDENTITY FULL; `, [ - { - tag: 'update-table-metadata', - table: {schema: 'public', name: 'existing'}, - old: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: { - a: {attNum: 1}, - b: {attNum: 2}, + [ + { + tag: 'update-table-metadata', + table: {schema: 'public', name: 'existing'}, + old: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: { + a: {attNum: 1}, + b: {attNum: 2}, + }, + }, + new: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {a: {attNum: 1}}, // computes the shortest eligible key }, }, - new: { - schemaOID: expect.any(Number), - relationOID: expect.any(Number), - rowKey: {a: {attNum: 1}}, // computes the shortest eligible key - }, - }, + ], ], {}, [], @@ -1646,7 +1700,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ] satisfies [ name: string, statements: string, - changes: Partial[], + transactions: Partial[][], expectedData: Record, expectedTables: LiteTableSpec[], expectedIndexes: LiteIndexSpec[], @@ -1655,14 +1709,16 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { async ( _name, stmts, - changes, + transactions, expectedData, expectedTables, expectedIndexes, ) => { await upstream.unsafe(stmts); - const transaction = await nextTransaction(); - expect(transaction).toMatchObject(changes); + for (const changes of transactions) { + const transaction = await nextTransaction(); + expect(transaction).toMatchObject(changes); + } expectMatchingObjectsInTables(replica, expectedData, 'bigint'); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index d184cf6127..2190bf4922 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -578,14 +578,6 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { INSERT INTO "invalid/character$"(id) VALUES('world'); `, ], - [ - 'UnsupportedColumnDefaultError: Cannot ADD a column with CURRENT_TIME, CURRENT_DATE, or CURRENT_TIMESTAMP', - `ALTER TABLE foo ADD bar TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP`, - ], - [ - 'UnsupportedColumnDefaultError: Unsupported default value for foo.pubid: random()', - `ALTER TABLE foo ADD pubid INT DEFAULT random()`, - ], [ 'UnsupportedTableSchemaError: Table "bar" is missing its REPLICA IDENTITY INDEX', `DROP INDEX my.bar_idx`, diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index cb254b1b5e..65ea85337b 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -8,6 +8,7 @@ import {AbortError} from '../../../../../shared/src/abort-error.ts'; import {stringify} from '../../../../../shared/src/bigint-json.ts'; import {deepEqual} from '../../../../../shared/src/json.ts'; import {must} from '../../../../../shared/src/must.ts'; +import {mapValues} from '../../../../../shared/src/objects.ts'; import {promiseVoid} from '../../../../../shared/src/resolved-promises.ts'; import { equals, @@ -17,7 +18,10 @@ import { import {sleep} from '../../../../../shared/src/sleep.ts'; import * as v from '../../../../../shared/src/valita.ts'; import {Database} from '../../../../../zqlite/src/db.ts'; -import {mapPostgresToLiteColumn} from '../../../db/pg-to-lite.ts'; +import { + mapPostgresToLiteColumn, + UnsupportedColumnDefaultError, +} from '../../../db/pg-to-lite.ts'; import type {ColumnSpec, PublishedTableSpec} from '../../../db/specs.ts'; import {StatementRunner} from '../../../db/statements.ts'; import {type LexiVersion} from '../../../types/lexi-version.ts'; @@ -42,16 +46,18 @@ import {BackfillManager} from '../common/backfill-manager.ts'; import {ChangeStreamMultiplexer} from '../common/change-stream-multiplexer.ts'; import type {BackfillRequest, JSONObject} from '../protocol/current.ts'; import type { + ColumnAdd, Identifier, MessageRelation, SchemaChange, + TableCreate, } from '../protocol/current/data.ts'; import type { ChangeStreamData, ChangeStreamMessage, Data, } from '../protocol/current/downstream.ts'; -import type {TableMetadata} from './backfill-metadata.ts'; +import type {ColumnMetadata, TableMetadata} from './backfill-metadata.ts'; import {streamBackfill} from './backfill-stream.ts'; import {type InitialSyncOptions} from './initial-sync.ts'; import type { @@ -767,11 +773,19 @@ class ChangeMaker { // CREATE for (const id of createdTbl) { const spec = must(nextTbl.get(id)); - changes.push({ + const createTable: TableCreate = { tag: 'create-table', spec, metadata: getMetadata(spec), - }); + }; + if (!update.event.tag.startsWith('CREATE')) { + // Tables introduced to the publication via ALTER statements + // must be backfilled. + createTable.backfill = mapValues(spec.columns, ({pos: attNum}) => ({ + attNum, + })) satisfies Record; + } + changes.push(createTable); } // Add indexes last since they may reference tables / columns that need @@ -849,14 +863,34 @@ class ChangeMaker { for (const id of added) { const {name, ...spec} = must(newColumns.get(id)); const column = {name, spec}; - // Validate that the ChangeProcessor will accept the column change. - mapPostgresToLiteColumn(table.name, column); - changes.push({ + const addColumn: ColumnAdd = { tag: 'add-column', table, column, tableMetadata: getMetadata(newTable), - }); + }; + // Determine if the ChangeProcessor will accept the column change as is. + try { + mapPostgresToLiteColumn(table.name, column); + } catch (e) { + if (!(e instanceof UnsupportedColumnDefaultError)) { + // Note: mapPostgresToLiteColumn is not expected to throw any other + // types of errors. + throw e; + } + // If the column has an unsupported default (e.g. an expression or a + // generated value), create the column as initially hidden with a + // `null` default, and publish it after backfilling the values from + // upstream. Note that this does require that the table have a valid + // REPLICA IDENTITY, since backfill relies on merging new data with + // an existing row. + this.#lc.info?.( + `Backfilling column ${table.name}.${name}: ${String(e)}`, + ); + addColumn.column.spec.dflt = null; + addColumn.backfill = {attNum: spec.pos} satisfies ColumnMetadata; + } + changes.push(addColumn); } return changes; } From 066876cd1089deeba4d797d2f63ce9b166bc8cb9 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sun, 15 Feb 2026 12:25:06 -0800 Subject: [PATCH 068/495] chore(zero-cache): release reservation before waiting for stream to catch up (#5571) Before waiting for the main replication stream to catch up to the backfill watermark, release the stream reservation. --- .../common/backfill-manager.test.ts | 169 ++++++++++++++++++ .../change-source/common/backfill-manager.ts | 29 ++- .../zero-cache/test/pg-container-setup.ts | 2 + 3 files changed, 191 insertions(+), 9 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts index b57a8c670e..593c5a6ad2 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts @@ -1711,4 +1711,173 @@ describe('backfill-manager', () => { ['commit', {tag: 'commit'}, {watermark: '145.01'}], ]); }); + + test('backfill-completed waits for commit to exceed backfill watermark', async () => { + testStreams.push([ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [ + [5, 6], + [7, 8], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + watermark: '130', + }, + ]); + + backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + + // Let the backfill start streaming before acquiring a reservation + // for the main stream. + await sleep(100); + + // Move the main replication stream past the backfill LSN + await changeStream.reserve('main'); + for (const msg of [ + ['begin', {tag: 'begin'}, {commitWatermark: '131'}], + ['commit', {tag: 'commit'}, {watermark: '131'}], + ] satisfies ChangeStreamMessage[]) { + void changeStream.push(msg); + } + changeStream.release('131'); + + expect(await drainChanges(8)).toMatchObject([ + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + rowValues: [ + [5, 6], + [7, 8], + ], + tag: 'backfill', + watermark: '130', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '123.01'}], + + ['begin', {tag: 'begin'}, {commitWatermark: '131'}], + ['commit', {tag: 'commit'}, {watermark: '131'}], + + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '131.01'}], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + tag: 'backfill-completed', + watermark: '130', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '131.01'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + }); + + test('backfill-completed waits for stream status to reach backfill watermark', async () => { + testStreams.push([ + { + tag: 'backfill', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + watermark: '130', + columns: ['b'], + rowValues: [ + [1, 2], + [3, 4], + ], + }, + { + tag: 'backfill-completed', + relation: {schema: 'foo', name: 'bar', rowKey: {columns: ['a']}}, + columns: ['b'], + watermark: '130', + }, + ]); + + backfillManager.run('123', [ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + + // Let the backfill start streaming before acquiring a reservation + // for the main stream. It should end its transaction and release + // the reservation before flushing the backfill-completed message. + await sleep(100); + changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); + + expect(await drainChanges(6)).toMatchObject([ + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + rowValues: [ + [1, 2], + [3, 4], + ], + tag: 'backfill', + watermark: '130', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '123.01'}], + + ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.02'}], + [ + 'data', + { + columns: ['b'], + relation: {name: 'bar', rowKey: {columns: ['a']}, schema: 'foo'}, + tag: 'backfill-completed', + watermark: '130', + }, + ], + ['commit', {tag: 'commit'}, {watermark: '123.02'}], + ] satisfies ChangeStreamMessage[]); + + expect(backfillRequests).toMatchObject([ + { + columns: {a: {id: '123'}, b: {id: '234'}}, + table: { + metadata: {rowKey: {a: 123}}, + name: 'bar', + schema: 'foo', + }, + }, + ]); + }); }); diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts index b97c1541e5..b3e97bb92f 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -136,15 +136,19 @@ export class BackfillManager implements Cancelable, Listener { } } - async #changeStreamReached(lc: LogContext, watermark: string) { + #changeStreamReached( + lc: LogContext, + watermark: string, + ): Promise | null { if ((this.#lastStatusWatermark ?? '') < watermark) { const {promise, resolve: reached} = resolver(); this.#awaitingStatusWatermarks.push({watermark, reached}); lc.info?.( `waiting for change stream (at ${this.#lastStatusWatermark}) to reach ${watermark}`, ); - await promise; + return promise; } + return null; } readonly #minBackoffMs: number; @@ -257,8 +261,21 @@ export class BackfillManager implements Cancelable, Listener { }; for await (const msg of this.#backfillStreamer(state.request)) { + // Before sending `backfill-completed`, the main replication stream + // may need to catch up. + const mustWaitBeforeFlush = + msg.tag === 'backfill-completed' && + this.#changeStreamReached(lc, msg.watermark); + // If necessary, yield the reservation to the main stream. - backfillTx && changeStream.waiterDelay() > 0 && commitTx(); + if ( + backfillTx && + (changeStream.waiterDelay() > 0 || mustWaitBeforeFlush) + ) { + commitTx(); + } + + await mustWaitBeforeFlush; if ( msg.tag === 'backfill' && @@ -278,12 +295,6 @@ export class BackfillManager implements Cancelable, Listener { return; // this backfill is canceled } - if (msg.tag === 'backfill-completed') { - // The change stream must reach or exceed the backfill snapshot before - // the backfill is considered complete. - await this.#changeStreamReached(lc, msg.watermark); - } - // `await` to allow the change streamer to exert back pressure // on backfills. await changeStream.push(['data', msg]); diff --git a/packages/zero-cache/test/pg-container-setup.ts b/packages/zero-cache/test/pg-container-setup.ts index 7d7d5363d1..ff29d07e1d 100644 --- a/packages/zero-cache/test/pg-container-setup.ts +++ b/packages/zero-cache/test/pg-container-setup.ts @@ -8,6 +8,8 @@ export function runPostgresContainer(image: string, timezone: string) { '-c', 'wal_level=logical', '-c', + 'max_replication_slots=100', + '-c', `timezone=${timezone}`, ]) .start(); From 34f9f8ea991835796375a00122534307b6145fa0 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sun, 15 Feb 2026 13:45:34 -0800 Subject: [PATCH 069/495] chore(zero-cache): backfill columns added to publications (#5572) --- .../pg/change-source.backfill.pg.test.ts | 61 ++++++++- .../pg/change-source.end-to-mid.pg.test.ts | 123 ++++++++++-------- .../change-source/pg/change-source.ts | 50 ++++--- 3 files changed, 157 insertions(+), 77 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts index 84c926fc14..53b152467a 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts @@ -66,7 +66,6 @@ describe('change-source/pg/backfill-test', {timeout: 30000}, () => { num INT ); - -- Seed the published.bar table with toastable values. DO $$ BEGIN FOR i IN 1..3 LOOP @@ -74,14 +73,33 @@ describe('change-source/pg/backfill-test', {timeout: 30000}, () => { END LOOP; END $$; - CREATE PUBLICATION zero_published FOR TABLES IN SCHEMA published; + CREATE TABLE baz( + id INT PRIMARY KEY, + num INT, + ooka TEXT + ); + + DO $$ + BEGIN + FOR i IN 1..3 LOOP + INSERT INTO baz (id, num, ooka) VALUES(i, i, 'aaa'); + END LOOP; + END $$; + + + CREATE PUBLICATION published_schema FOR TABLES IN SCHEMA published; + CREATE PUBLICATION published_tables FOR TABLE baz(id, num); -- ooka is excluded `); const source = ( await initializePostgresChangeSource( lc, upstreamURI, - {appID: APP_ID, publications: ['zero_published'], shardNum: 0}, + { + appID: APP_ID, + publications: ['published_schema', 'published_tables'], + shardNum: 0, + }, replicaDbFile.path, {tableCopyWorkers: 5}, ) @@ -223,7 +241,7 @@ describe('change-source/pg/backfill-test', {timeout: 30000}, () => { END LOOP; END $$; - ALTER PUBLICATION zero_published + ALTER PUBLICATION published_schema ADD TABLE foo WHERE (id % 2 = 0); `, null, @@ -449,6 +467,39 @@ describe('change-source/pg/backfill-test', {timeout: 30000}, () => { }, ], ], + [ + 'published column change', + PG_15_UP, + /*sql*/ ` + ALTER PUBLICATION published_tables SET TABLE baz (id, ooka); + `, + null, + { + ['baz']: [ + { + id: 1n, + ooka: 'aaa', + }, + { + id: 2n, + ooka: 'aaa', + }, + { + id: 3n, + ooka: 'aaa', + }, + ], + }, + [ + { + name: 'baz', + columns: { + id: {dataType: 'int4|NOT_NULL', pos: 1}, + ooka: {dataType: 'text', pos: 3}, + }, + }, + ], + ], [ 'column renamed while being backfilled', PG_15_UP, @@ -492,7 +543,7 @@ describe('change-source/pg/backfill-test', {timeout: 30000}, () => { 'add generated column', PG_18_UP, /*sql*/ ` - ALTER PUBLICATION zero_published SET (publish_generated_columns=stored); + ALTER PUBLICATION published_schema SET (publish_generated_columns=stored); ALTER TABLE published.bar ADD COLUMN "genNum2" INT GENERATED ALWAYS AS (num * 2) STORED; diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index df431e1ddc..a015656e29 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -941,8 +941,6 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { 'ALTER PUBLICATION zero_some_public SET TABLE foo (id, "newInt");', [ [ - // Since it is an ALTER PUBLICATION command, we should correctly get - // a drop and an add, and not a rename. { tag: 'drop-column', table: {schema: 'public', name: 'foo'}, @@ -956,8 +954,12 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { relationOID: expect.any(Number), rowKey: {id: {attNum: 1}}, }, + // For an ALTER PUBLICATION command, a backfill should happen + // for the introduced column. + backfill: {attNum: expect.any(Number)}, }, ], + [{tag: 'backfill-completed'}], ], {foo: []}, [ @@ -1005,6 +1007,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { relationOID: expect.any(Number), rowKey: {id: {attNum: 1}}, }, + backfill: {attNum: expect.any(Number)}, }, { tag: 'add-column', @@ -1014,8 +1017,10 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { relationOID: expect.any(Number), rowKey: {id: {attNum: 1}}, }, + backfill: {attNum: expect.any(Number)}, }, ], + [{tag: 'backfill-completed'}], ], {foo: []}, [ @@ -1237,10 +1242,26 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [ 'data types', ` - ALTER PUBLICATION zero_some_public SET TABLE foo ( - id, int, big, flt, bool, timea, date, json, jsonb, numz, uuid, intarr, jsons, jsonbs); + CREATE TABLE your.zoo( + id TEXT NOT NULL, + int INT4, + big BIGINT, + flt FLOAT8, + bool BOOLEAN, + timea TIMESTAMPTZ, + timeb TIMESTAMPTZ, + date DATE, + time TIME, + json JSON, + jsonb JSONB, + numz ENUMZ, + uuid UUID, + intarr INT4[], + jsons JSON[], + jsonbs JSONB[] + ); - INSERT INTO foo (id, int, big, flt, bool, timea, date, json, jsonb, numz, uuid, intarr, jsons, jsonbs) + INSERT INTO your.zoo (id, int, big, flt, bool, timea, date, json, jsonb, numz, uuid, intarr, jsons, jsonbs) VALUES ( 'abc', -2, @@ -1260,18 +1281,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { `, [ [ - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, - {tag: 'add-column'}, + {tag: 'create-table'}, { tag: 'insert', new: { @@ -1293,7 +1303,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ], ], { - foo: [ + ['your.zoo']: [ { id: 'abc', int: -2n, @@ -1315,7 +1325,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { }, [ { - name: 'foo', + name: 'your.zoo', columns: { id: { characterMaximumLength: null, @@ -1325,13 +1335,13 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { notNull: false, pos: 1, }, - flt: { + int: { characterMaximumLength: null, - dataType: 'float8', + dataType: 'int4', dflt: null, elemPgTypeClass: null, notNull: false, - pos: 3, + pos: 2, }, big: { characterMaximumLength: null, @@ -1339,6 +1349,14 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { dflt: null, elemPgTypeClass: null, notNull: false, + pos: 3, + }, + flt: { + characterMaximumLength: null, + dataType: 'float8', + dflt: null, + elemPgTypeClass: null, + notNull: false, pos: 4, }, bool: { @@ -1349,27 +1367,27 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { notNull: false, pos: 5, }, - date: { + timea: { characterMaximumLength: null, - dataType: 'date', - dflt: null, + dataType: 'timestamptz', elemPgTypeClass: null, + dflt: null, notNull: false, pos: 6, }, - int: { + timeb: { characterMaximumLength: null, - dataType: 'int4', - dflt: null, + dataType: 'timestamptz', elemPgTypeClass: null, + dflt: null, notNull: false, pos: 7, }, - intarr: { + date: { characterMaximumLength: null, - dataType: 'int4[]|TEXT_ARRAY', + dataType: 'date', dflt: null, - elemPgTypeClass: 'b', + elemPgTypeClass: null, notNull: false, pos: 8, }, @@ -1379,7 +1397,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { elemPgTypeClass: null, dflt: null, notNull: false, - pos: 9, + pos: 10, }, jsonb: { characterMaximumLength: null, @@ -1387,55 +1405,54 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { elemPgTypeClass: null, dflt: null, notNull: false, - pos: 10, - }, - jsonbs: { - characterMaximumLength: null, - dataType: 'jsonb[]|TEXT_ARRAY', - elemPgTypeClass: 'b', - dflt: null, - notNull: false, pos: 11, }, - jsons: { + numz: { characterMaximumLength: null, - dataType: 'json[]|TEXT_ARRAY', - elemPgTypeClass: 'b', + dataType: 'enumz|TEXT_ENUM', + elemPgTypeClass: null, dflt: null, notNull: false, pos: 12, }, - numz: { + uuid: { characterMaximumLength: null, - dataType: 'enumz|TEXT_ENUM', + dataType: 'uuid', elemPgTypeClass: null, dflt: null, notNull: false, pos: 13, }, - timea: { + intarr: { characterMaximumLength: null, - dataType: 'timestamptz', - elemPgTypeClass: null, + dataType: 'int4[]|TEXT_ARRAY', dflt: null, + elemPgTypeClass: 'b', notNull: false, pos: 14, }, - uuid: { + jsons: { characterMaximumLength: null, - dataType: 'uuid', - elemPgTypeClass: null, + dataType: 'json[]|TEXT_ARRAY', + elemPgTypeClass: 'b', dflt: null, notNull: false, pos: 15, }, - + jsonbs: { + characterMaximumLength: null, + dataType: 'jsonb[]|TEXT_ARRAY', + elemPgTypeClass: 'b', + dflt: null, + notNull: false, + pos: 16, + }, ['_0_version']: { characterMaximumLength: null, dataType: 'TEXT', elemPgTypeClass: null, notNull: false, - pos: 2, + pos: 17, }, }, }, diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 65ea85337b..3fd926940f 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -760,13 +760,14 @@ class ChangeMaker { const {schema, name} = must(prevTbl.get(id)); changes.push({tag: 'drop-table', id: {schema, name}}); } - // ALTER + // ALTER TABLE | ALTER PUBLICATION const tables = intersection(prevTbl, nextTbl); for (const id of tables) { changes.push( ...this.#getTableChanges( must(prevTbl.get(id)), must(nextTbl.get(id)), + update.event.tag, ), ); } @@ -803,6 +804,7 @@ class ChangeMaker { #getTableChanges( oldTable: PublishedTableWithReplicaIdentity, newTable: PublishedTableWithReplicaIdentity, + ddlTag: string, ): SchemaChange[] { const changes: SchemaChange[] = []; if ( @@ -859,6 +861,11 @@ class ChangeMaker { } } + // All columns introduced by a publication change require backfill. + // Columns created by ALTER TABLE, on the other hand, only require + // backfill if they have non-constant defaults. + const alwaysBackfill = ddlTag === 'ALTER PUBLICATION'; + // ADD for (const id of added) { const {name, ...spec} = must(newColumns.get(id)); @@ -869,26 +876,31 @@ class ChangeMaker { column, tableMetadata: getMetadata(newTable), }; - // Determine if the ChangeProcessor will accept the column change as is. - try { - mapPostgresToLiteColumn(table.name, column); - } catch (e) { - if (!(e instanceof UnsupportedColumnDefaultError)) { - // Note: mapPostgresToLiteColumn is not expected to throw any other - // types of errors. - throw e; - } - // If the column has an unsupported default (e.g. an expression or a - // generated value), create the column as initially hidden with a - // `null` default, and publish it after backfilling the values from - // upstream. Note that this does require that the table have a valid - // REPLICA IDENTITY, since backfill relies on merging new data with - // an existing row. - this.#lc.info?.( - `Backfilling column ${table.name}.${name}: ${String(e)}`, - ); + if (alwaysBackfill) { addColumn.column.spec.dflt = null; addColumn.backfill = {attNum: spec.pos} satisfies ColumnMetadata; + } else { + // Determine if the ChangeProcessor will accept the column add as is. + try { + mapPostgresToLiteColumn(table.name, column); + } catch (e) { + if (!(e instanceof UnsupportedColumnDefaultError)) { + // Note: mapPostgresToLiteColumn is not expected to throw any other + // types of errors. + throw e; + } + // If the column has an unsupported default (e.g. an expression or a + // generated value), create the column as initially hidden with a + // `null` default, and publish it after backfilling the values from + // upstream. Note that this does require that the table have a valid + // REPLICA IDENTITY, since backfill relies on merging new data with + // an existing row. + this.#lc.info?.( + `Backfilling column ${table.name}.${name}: ${String(e)}`, + ); + addColumn.column.spec.dflt = null; + addColumn.backfill = {attNum: spec.pos} satisfies ColumnMetadata; + } } changes.push(addColumn); } From 58ef59aa58c9e9dde570fe2f476bc82f820e21b4 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:37:21 +0100 Subject: [PATCH 070/495] Use setTimeout instead of requestAnimationFrame in poke handler (#5548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Fix: Use setTimeout instead of requestAnimationFrame in zero poke handler ### Problem - Zero uses `requestAnimationFrame` in poke handler for data delivery - Chrome freezes `requestAnimationFrame` in background tabs - This prevents notifications (sounds, favicon badges) from working when tab is in background ### Solution Replace `requestAnimationFrame` with `setTimeout` in `zero-poke-handler.ts` to enable background tab notifications ### Changes Made 1. **Source file** (`zero-poke-handler.ts`): - Removed `requestAnimationFrame` usage and `getBrowserGlobalMethod` import - Replaced `#raf` field with direct `setTimeout(callback, 0)` calls - Renamed `#rafCallback` → `#scheduledCallback` and `#lastRafPerfTimestamp` → `#lastScheduledTimestamp` - Removed `rafFallback` function (no longer needed) - Updated documentation to explain setTimeout usage and background tab support 2. **Test file** (`zero-poke-handler.test.ts`): - Updated mocks to spy on `setTimeout` instead of `requestAnimationFrame` - Updated all test descriptions to use "scheduled callback" terminology - Fixed callback extraction and invocation to work with setTimeout's signature - Fixed async callback types: `() => void` → `() => Promise` - Improved type safety by replacing `as any` with proper type assertions ### Verification - [x] All 19 tests passing - [x] Type checking passes - [x] Lint errors fixed (only 2 pre-existing errors remain) - [x] Code review: no issues found - [x] Security scan: no issues found - [x] No package-lock.json changes --- 💬 We'd love your input! Share your thoughts on Copilot coding agent in our [2 minute survey](https://gh.io/copilot-coding-agent-survey). --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arv <45845+arv@users.noreply.github.com> Co-authored-by: Erik Arvidsson --- package-lock.json | 1454 ++++------------- packages/zero-client/.gitignore | 1 + .../src/client/zero-poke-handler.test.ts | 229 +-- .../src/client/zero-poke-handler.ts | 49 +- 4 files changed, 498 insertions(+), 1235 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71a36da753..25e6e872be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -196,6 +196,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -223,6 +224,7 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -382,6 +384,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -484,7 +487,6 @@ "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -700,6 +702,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -1763,6 +1766,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2116,7 +2120,6 @@ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -2133,7 +2136,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2147,7 +2149,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2163,7 +2164,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2173,8 +2173,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -2182,7 +2181,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -2193,7 +2191,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -2204,7 +2201,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2312,7 +2308,6 @@ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2331,7 +2326,6 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2360,7 +2354,6 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2374,7 +2367,6 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2388,7 +2380,6 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2402,7 +2393,6 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2419,7 +2409,6 @@ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2448,7 +2437,6 @@ "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2465,7 +2453,6 @@ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2512,7 +2499,6 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2526,7 +2512,6 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2555,7 +2540,6 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2569,7 +2553,6 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2583,7 +2566,6 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2597,7 +2579,6 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2611,7 +2592,6 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2625,7 +2605,6 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2639,7 +2618,6 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2656,7 +2634,6 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2975,7 +2952,6 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -3903,7 +3879,6 @@ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -4130,6 +4105,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -4152,6 +4128,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -6668,6 +6645,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6883,6 +6861,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7395,6 +7374,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7496,7 +7476,8 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.6", @@ -8410,7 +8391,6 @@ "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -8422,7 +8402,6 @@ "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -8445,7 +8424,6 @@ "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -8469,7 +8447,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8488,7 +8465,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -8499,7 +8475,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8516,7 +8491,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8533,8 +8507,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/config/node_modules/@babel/code-frame": { "version": "7.10.4", @@ -8542,7 +8515,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8553,7 +8525,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8572,7 +8543,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -8583,7 +8553,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8600,7 +8569,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8618,7 +8586,6 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8630,7 +8597,6 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8641,7 +8607,6 @@ "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8656,7 +8621,6 @@ "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -8679,8 +8643,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/fingerprint/node_modules/brace-expansion": { "version": "2.0.2", @@ -8688,7 +8651,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8699,7 +8661,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8716,7 +8677,6 @@ "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8736,7 +8696,6 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8747,7 +8706,6 @@ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -8761,7 +8719,6 @@ "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -8773,7 +8730,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8784,7 +8740,6 @@ "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -8805,7 +8760,6 @@ "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -8827,7 +8781,6 @@ "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -8842,7 +8795,6 @@ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -8858,7 +8810,6 @@ "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -8870,16 +8821,14 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8887,7 +8836,6 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8900,16 +8848,14 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/xcpretty": { "version": "4.3.2", @@ -8917,7 +8863,6 @@ "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -8934,7 +8879,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8945,7 +8889,6 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8963,7 +8906,6 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8980,7 +8922,6 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9631,7 +9572,6 @@ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -9645,7 +9585,6 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -9656,7 +9595,6 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9674,7 +9612,6 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -9685,7 +9622,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9696,7 +9632,6 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9711,7 +9646,6 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9726,7 +9660,6 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9740,7 +9673,6 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9757,7 +9689,6 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9770,7 +9701,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -9781,7 +9711,6 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9795,7 +9724,6 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9812,7 +9740,6 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9843,7 +9770,6 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9871,7 +9797,6 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10200,6 +10125,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10322,6 +10248,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10555,6 +10482,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -10651,6 +10579,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12579,6 +12508,7 @@ "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.2.0" }, @@ -12966,7 +12896,6 @@ "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -12977,7 +12906,6 @@ "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -12992,7 +12920,6 @@ "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -13053,7 +12980,6 @@ "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -13077,7 +13003,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13099,7 +13024,6 @@ "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -13131,7 +13055,6 @@ "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13142,7 +13065,6 @@ "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -13167,7 +13089,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13185,7 +13106,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13196,7 +13116,6 @@ "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13207,7 +13126,6 @@ "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -13222,7 +13140,6 @@ "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -13246,7 +13163,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13264,7 +13180,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13275,7 +13190,6 @@ "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13286,7 +13200,6 @@ "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13296,8 +13209,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-stately/utils": { "version": "3.10.4", @@ -13712,6 +13624,7 @@ "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -13934,7 +13847,6 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -13945,7 +13857,6 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -14942,6 +14853,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15075,6 +14987,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/virtual-core": "3.10.9" }, @@ -15193,6 +15106,7 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15592,7 +15506,6 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*" } @@ -15733,6 +15646,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15766,6 +15680,7 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -15823,6 +15738,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -15973,8 +15889,7 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -16046,7 +15961,6 @@ "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -16058,7 +15972,6 @@ "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -16338,6 +16251,7 @@ "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -16361,6 +16275,7 @@ "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -16716,7 +16631,6 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -16837,6 +16751,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16922,6 +16837,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16983,6 +16899,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -17024,8 +16941,7 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", @@ -17318,8 +17234,7 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", @@ -17422,8 +17337,7 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/async-listen": { "version": "3.0.0", @@ -17565,7 +17479,6 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -17614,7 +17527,6 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -17633,7 +17545,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17655,7 +17566,6 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17671,7 +17581,6 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -17774,7 +17683,6 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -17784,8 +17692,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.29.1", @@ -17793,7 +17700,6 @@ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.29.1" } @@ -17804,7 +17710,6 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -17815,7 +17720,6 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -17843,7 +17747,6 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -18075,7 +17978,6 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -18089,7 +17991,6 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -18356,7 +18257,6 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -18367,7 +18267,6 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -18426,6 +18325,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -18446,7 +18346,6 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -18624,7 +18523,6 @@ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -18638,7 +18536,6 @@ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -18649,7 +18546,6 @@ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -18902,7 +18798,6 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -18931,7 +18826,6 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19030,7 +18924,6 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -19043,7 +18936,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "peer": true, "engines": { "node": ">=6" }, @@ -19089,7 +18981,6 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -20350,6 +20241,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -20589,7 +20481,6 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -21013,7 +20904,6 @@ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "dotenv": "^16.4.5" }, @@ -21392,7 +21282,6 @@ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -21411,7 +21300,6 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -21490,6 +21378,7 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22189,8 +22078,7 @@ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/execa": { "version": "5.1.1", @@ -22239,7 +22127,6 @@ "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -22258,7 +22145,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -22269,7 +22155,6 @@ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=20.16.0" } @@ -22279,8 +22164,7 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/express": { "version": "4.22.1", @@ -22639,7 +22523,6 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", - "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -22653,7 +22536,6 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bser": "2.1.1" } @@ -22937,8 +22819,7 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -22965,8 +22846,7 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/for-each": { "version": "0.3.5", @@ -23063,7 +22943,6 @@ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -23282,7 +23161,6 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -23364,7 +23242,6 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -24000,16 +23877,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.29.1", @@ -24017,7 +23892,6 @@ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.29.1" } @@ -24057,6 +23931,7 @@ "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -24502,7 +24377,6 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -24748,7 +24622,6 @@ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -25123,7 +24996,6 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -25141,7 +25013,6 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -25217,7 +25088,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -25236,7 +25106,6 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25247,7 +25116,6 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -25274,7 +25142,6 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -25296,7 +25163,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25310,7 +25176,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25325,8 +25190,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-mock": { "version": "29.7.0", @@ -25334,7 +25198,6 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -25350,7 +25213,6 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25378,7 +25240,6 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -25397,7 +25258,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25411,7 +25271,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25426,8 +25285,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-worker": { "version": "29.7.0", @@ -25464,8 +25322,7 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jiti": { "version": "1.21.0", @@ -25544,8 +25401,7 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/jsdom": { "version": "26.1.0", @@ -25674,8 +25530,7 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -25779,7 +25634,6 @@ "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -25903,7 +25757,6 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -25915,7 +25768,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -25925,8 +25777,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lightningcss": { "version": "1.30.2", @@ -25972,7 +25823,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25994,7 +25844,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26016,7 +25865,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26038,7 +25886,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26060,7 +25907,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26082,7 +25928,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26104,7 +25949,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26126,7 +25970,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26148,7 +25991,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26170,7 +26012,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26192,7 +26033,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26295,8 +26135,7 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -26310,7 +26149,6 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -26324,7 +26162,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -26338,7 +26175,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26354,7 +26190,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -26364,8 +26199,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -26373,7 +26207,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -26384,7 +26217,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -26395,7 +26227,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -26532,6 +26363,7 @@ "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -26565,7 +26397,6 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -26626,8 +26457,7 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -27016,8 +26846,7 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge-anything": { "version": "5.1.7", @@ -27073,7 +26902,6 @@ "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -27129,7 +26957,6 @@ "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -27146,7 +26973,6 @@ "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -27163,7 +26989,6 @@ "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27177,7 +27002,6 @@ "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -27198,7 +27022,6 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -27209,7 +27032,6 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -27226,7 +27048,6 @@ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -27241,7 +27062,6 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -27256,7 +27076,6 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -27271,7 +27090,6 @@ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -27282,7 +27100,6 @@ "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27298,7 +27115,6 @@ "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27320,7 +27136,6 @@ "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27335,7 +27150,6 @@ "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27349,7 +27163,6 @@ "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27364,7 +27177,6 @@ "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27387,7 +27199,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27398,7 +27209,6 @@ "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27420,7 +27230,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27431,7 +27240,6 @@ "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27450,7 +27258,6 @@ "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27475,8 +27282,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", @@ -27484,7 +27290,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -27495,7 +27300,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -27509,7 +27313,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27520,7 +27323,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28537,6 +28339,7 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.x" } @@ -28594,7 +28397,8 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/mri": { "version": "1.2.0", @@ -28639,6 +28443,7 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -28752,8 +28557,7 @@ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", @@ -28884,8 +28688,7 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.27", @@ -28934,7 +28737,6 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -28951,7 +28753,6 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -28964,8 +28765,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -29053,8 +28853,7 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nwsapi": { "version": "2.2.22", @@ -29089,7 +28888,6 @@ "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29276,7 +29074,6 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -29295,7 +29092,6 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -29306,7 +29102,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -29320,7 +29115,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29336,7 +29130,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -29346,8 +29139,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -29355,7 +29147,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -29366,7 +29157,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -29377,7 +29167,6 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -29391,7 +29180,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -29487,6 +29275,7 @@ "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -29522,7 +29311,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -29647,7 +29435,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -29832,7 +29619,6 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -29904,7 +29690,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -29995,6 +29780,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -30225,6 +30011,7 @@ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "playwright-core": "1.53.2" }, @@ -30256,7 +30043,6 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -30272,7 +30058,6 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } @@ -30319,6 +30104,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31455,6 +31241,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31624,7 +31411,6 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -31714,6 +31500,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -31756,7 +31543,6 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -31804,7 +31590,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -31815,7 +31600,6 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -32049,7 +31833,6 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -32075,7 +31858,6 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -32225,6 +32007,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32238,7 +32021,6 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -32250,7 +32032,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -32272,6 +32053,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32346,6 +32128,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -32420,6 +32203,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -33136,7 +32920,6 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, - "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -33152,7 +32935,6 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-parse": "^1.0.5" } @@ -33204,7 +32986,6 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "global-dirs": "^0.1.1" }, @@ -33218,7 +32999,6 @@ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -33245,8 +33025,7 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/resolve.exports": { "version": "2.0.3", @@ -33254,7 +33033,6 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -33280,7 +33058,6 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -33295,7 +33072,6 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -33306,7 +33082,6 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -33385,6 +33160,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33593,6 +33369,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -33790,7 +33567,6 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -33809,6 +33585,7 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -34176,7 +33953,6 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -34266,7 +34042,6 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -34351,6 +34126,7 @@ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -34556,7 +34332,6 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -34570,7 +34345,6 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -34587,8 +34361,7 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -34596,7 +34369,6 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34610,7 +34382,6 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -34641,7 +34412,6 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -34813,8 +34583,7 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/style-to-js": { "version": "1.1.21", @@ -34900,7 +34669,6 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -35011,6 +34779,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35157,7 +34926,6 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -35168,7 +34936,6 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -35185,6 +34952,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -35391,8 +35159,7 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/throttleit": { "version": "2.1.0", @@ -35494,6 +35261,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -35555,8 +35323,7 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -35733,13 +35500,15 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.20.5", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -35913,7 +35682,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -36025,6 +35793,7 @@ "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 18" }, @@ -36729,7 +36498,6 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -36808,6 +36576,7 @@ "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -37053,8 +36822,7 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -37075,7 +36843,6 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -37108,7 +36875,6 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -37124,6 +36890,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -37542,8 +37309,7 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "4.0.0", @@ -37571,7 +37337,6 @@ "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -37587,7 +37352,6 @@ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=8" } @@ -37729,8 +37493,7 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/wordwrapjs": { "version": "5.1.0", @@ -37811,6 +37574,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -37871,7 +37635,6 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -37886,7 +37649,6 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -37931,7 +37693,6 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -37946,7 +37707,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" } @@ -37957,7 +37717,6 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -38046,7 +37805,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -38185,7 +37943,6 @@ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", - "peer": true, "peerDependencies": { "zod": "^3.24.1" } @@ -38517,6 +38274,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -38617,7 +38375,6 @@ "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -38706,7 +38463,6 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -38717,7 +38473,6 @@ "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -38740,7 +38495,6 @@ "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -38764,7 +38518,6 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -38788,7 +38541,6 @@ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -38827,7 +38579,6 @@ "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -38850,7 +38601,6 @@ "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -38877,7 +38627,6 @@ "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -38888,7 +38637,6 @@ "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -38903,7 +38651,6 @@ "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -38964,7 +38711,6 @@ "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -38987,7 +38733,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -39000,7 +38745,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -39022,7 +38766,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39036,7 +38779,6 @@ "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -39068,7 +38810,6 @@ "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39079,7 +38820,6 @@ "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -39104,7 +38844,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39127,7 +38866,6 @@ "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39138,7 +38876,6 @@ "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -39153,7 +38890,6 @@ "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -39177,7 +38913,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -39188,7 +38923,6 @@ "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39199,7 +38933,6 @@ "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39209,8 +38942,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/@react-native/virtualized-lists": { "version": "0.83.1", @@ -39218,7 +38950,6 @@ "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -39243,7 +38974,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -39256,8 +38986,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/babel-preset-expo": { "version": "54.0.10", @@ -39265,7 +38994,6 @@ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -39310,7 +39038,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -39321,7 +39048,6 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -39332,7 +39058,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -39397,7 +39122,6 @@ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -39414,7 +39138,6 @@ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -39430,7 +39153,6 @@ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -39458,7 +39180,6 @@ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -39470,7 +39191,6 @@ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -39488,7 +39208,6 @@ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -39518,7 +39237,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -39537,7 +39255,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -39553,16 +39270,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/lru-cache": { "version": "11.2.4", @@ -39570,7 +39285,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -39581,7 +39295,6 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -39637,7 +39350,6 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -39654,7 +39366,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -39665,7 +39376,6 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -39682,7 +39392,6 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39696,7 +39405,6 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -39717,7 +39425,6 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -39733,7 +39440,6 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -39755,7 +39461,6 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -39770,7 +39475,6 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39784,7 +39488,6 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -39799,7 +39502,6 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -39822,7 +39524,6 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -39844,7 +39545,6 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -39863,7 +39563,6 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -39888,8 +39587,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/metro/node_modules/hermes-parser": { "version": "0.32.0", @@ -39897,7 +39595,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -39908,7 +39605,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39931,7 +39627,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -39942,7 +39637,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -39956,7 +39650,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -39973,7 +39666,6 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -39987,7 +39679,6 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40001,7 +39692,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -40019,7 +39709,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -40037,7 +39726,6 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -40065,7 +39753,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -40081,7 +39768,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -40107,8 +39793,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native": { "version": "0.83.1", @@ -40176,7 +39861,6 @@ "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -40198,8 +39882,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -40207,7 +39890,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -40218,7 +39900,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -40230,7 +39911,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -40242,7 +39922,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40264,7 +39943,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40275,7 +39953,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -40289,7 +39966,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40311,16 +39987,14 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/source-map": { "version": "0.5.7", @@ -40328,7 +40002,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -40339,7 +40012,6 @@ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -40371,7 +40043,6 @@ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -40382,7 +40053,6 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -40914,7 +40584,6 @@ "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -41004,7 +40673,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41022,7 +40690,6 @@ "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -41045,7 +40712,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41063,7 +40729,6 @@ "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -41102,7 +40767,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41120,7 +40784,6 @@ "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -41143,7 +40806,6 @@ "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -41170,7 +40832,6 @@ "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -41193,7 +40854,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41206,7 +40866,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41228,7 +40887,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41239,7 +40897,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41253,7 +40910,6 @@ "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -41277,8 +40933,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/babel-preset-expo": { "version": "54.0.4", @@ -41286,7 +40941,6 @@ "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -41331,7 +40985,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -41382,7 +41035,6 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -41393,7 +41045,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -41458,7 +41109,6 @@ "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -41475,7 +41125,6 @@ "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -41491,7 +41140,6 @@ "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -41519,7 +41167,6 @@ "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -41531,7 +41178,6 @@ "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -41593,8 +41239,7 @@ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/minimatch": { "version": "9.0.5", @@ -41602,7 +41247,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -41619,7 +41263,6 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -41651,7 +41294,6 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -41679,7 +41321,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -41701,7 +41342,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -41715,7 +41355,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -41731,7 +41370,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -41755,8 +41393,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native": { "version": "0.82.0", @@ -41823,8 +41460,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -41832,7 +41468,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -41843,7 +41478,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41856,7 +41490,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41878,7 +41511,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41889,7 +41521,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41903,7 +41534,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -41925,16 +41555,14 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/tar": { "version": "7.5.1", @@ -41942,7 +41570,6 @@ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -41974,7 +41601,6 @@ "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -42121,7 +41747,6 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -42492,7 +42117,6 @@ "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, - "peer": true, "requires": {} }, "@ai-sdk/gateway": { @@ -42632,6 +42256,7 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", + "peer": true, "requires": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -43466,6 +43091,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -43707,7 +43333,6 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, - "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -43720,7 +43345,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -43730,7 +43354,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -43742,7 +43365,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -43751,29 +43373,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -43837,7 +43455,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, - "peer": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -43849,7 +43466,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43865,7 +43481,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43875,7 +43490,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43885,7 +43499,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -43895,7 +43508,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -43905,7 +43517,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43923,7 +43534,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43933,7 +43543,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43959,7 +43568,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -43969,7 +43577,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43987,7 +43594,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -43997,7 +43603,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44007,7 +43612,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44017,7 +43621,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44027,7 +43630,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44037,7 +43639,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44047,7 +43648,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44057,7 +43657,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44236,7 +43835,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -44806,7 +44404,6 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -44931,12 +44528,14 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "peer": true }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -45970,6 +45569,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -46134,6 +45734,7 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", + "peer": true, "requires": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -46492,7 +46093,8 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "peer": true }, "which": { "version": "4.0.0", @@ -46553,7 +46155,8 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true + "dev": true, + "peer": true }, "@electric-sql/pglite-socket": { "version": "0.0.6", @@ -46964,7 +46567,6 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, - "peer": true, "requires": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -46975,7 +46577,6 @@ "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -46997,7 +46598,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47007,7 +46607,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47018,15 +46617,13 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47036,7 +46633,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47049,7 +46645,6 @@ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, - "peer": true, "requires": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -47072,7 +46667,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47083,15 +46677,13 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47101,7 +46693,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47113,15 +46704,13 @@ "version": "54.0.10", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true, - "peer": true + "dev": true }, "@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, - "peer": true, "requires": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -47132,7 +46721,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "peer": true, "requires": { "ms": "^2.1.1" } @@ -47144,7 +46732,6 @@ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, - "peer": true, "requires": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -47158,7 +46745,6 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -47177,15 +46763,13 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -47195,7 +46779,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -47207,7 +46790,6 @@ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -47225,15 +46807,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "peer": true + "dev": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, - "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -47245,7 +46825,6 @@ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -47256,7 +46835,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47268,7 +46846,6 @@ "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, - "peer": true, "requires": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -47280,7 +46857,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, - "peer": true, "requires": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -47301,7 +46877,6 @@ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -47312,7 +46887,6 @@ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, - "peer": true, "requires": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -47327,7 +46901,6 @@ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, - "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -47338,22 +46911,19 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true, - "peer": true + "dev": true }, "@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true, - "peer": true + "dev": true }, "@expo/spawn-async": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.3" } @@ -47362,22 +46932,19 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true, - "peer": true + "dev": true }, "@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true, - "peer": true + "dev": true }, "@expo/xcpretty": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -47390,7 +46957,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47400,7 +46966,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -47411,7 +46976,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -47421,7 +46985,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -47925,7 +47488,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "peer": true, "requires": { "minipass": "^7.0.4" } @@ -47934,15 +47496,13 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true, - "peer": true + "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "peer": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -47956,7 +47516,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -47965,15 +47524,13 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true + "dev": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -47984,7 +47541,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -47995,7 +47551,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -48005,7 +47560,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "peer": true, "requires": { "p-try": "^2.0.0" } @@ -48015,7 +47569,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -48026,15 +47579,13 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "peer": true + "dev": true }, "@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3" } @@ -48044,7 +47595,6 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "peer": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -48057,7 +47607,6 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -48080,7 +47629,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -48104,7 +47652,6 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -48328,6 +47875,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "peer": true, "requires": { "@types/mdx": "^2.0.0" } @@ -48421,7 +47969,8 @@ "@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "peer": true }, "@noble/curves": { "version": "1.8.1", @@ -48600,7 +48149,8 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "peer": true }, "@opentelemetry/api-logs": { "version": "0.203.0", @@ -48675,6 +48225,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -49815,6 +49366,7 @@ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, + "peer": true, "requires": { "@prisma/client-runtime-utils": "7.2.0" } @@ -50116,15 +49668,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -50135,7 +49685,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -50189,7 +49738,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50205,7 +49753,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50222,7 +49769,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, - "peer": true, "requires": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -50237,15 +49783,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true, - "peer": true + "dev": true }, "@react-native/dev-middleware": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -50266,7 +49810,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50277,7 +49820,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50288,15 +49830,13 @@ "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true, - "peer": true + "dev": true }, "@react-native/debugger-shell": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -50307,7 +49847,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -50327,7 +49866,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50338,7 +49876,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50349,22 +49886,19 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/js-polyfills": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/normalize-colors": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true, - "peer": true + "dev": true }, "@react-stately/utils": { "version": "3.10.4", @@ -50485,7 +50019,6 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -50558,7 +50091,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50571,7 +50103,6 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, - "peer": true, "requires": { "chalk": "^4.1.2" }, @@ -50581,7 +50112,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50594,7 +50124,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -50624,7 +50153,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50637,7 +50165,6 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -50656,7 +50183,6 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, - "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -50671,7 +50197,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50687,7 +50212,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -50698,7 +50222,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50713,7 +50236,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -50723,7 +50245,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -50735,7 +50256,6 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -50745,15 +50265,13 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "babel-preset-expo": { "version": "54.0.4", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, - "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -50784,7 +50302,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -50814,15 +50331,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true + "dev": true }, "commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true + "dev": true }, "expo": { "version": "54.0.13", @@ -50859,7 +50374,6 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, - "peer": true, "requires": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -50870,7 +50384,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -50881,7 +50394,6 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, - "peer": true, "requires": {} }, "expo-font": { @@ -50899,7 +50411,6 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, - "peer": true, "requires": {} }, "expo-modules-core": { @@ -50907,7 +50418,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4" } @@ -50939,15 +50449,13 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -50957,7 +50465,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "peer": true, "requires": { "minipass": "^7.1.2" } @@ -50971,15 +50478,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true + "dev": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -50990,8 +50495,7 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51000,7 +50504,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -51011,8 +50514,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51027,8 +50529,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true }, "react-native": { "version": "0.82.0", @@ -51078,15 +50579,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -51096,7 +50595,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51107,7 +50605,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51122,7 +50619,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51132,7 +50628,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51142,7 +50637,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51158,22 +50652,19 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true + "dev": true }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true, - "peer": true + "dev": true }, "tar": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, - "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -51192,8 +50683,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true, - "peer": true + "dev": true }, "vite": { "version": "7.2.7", @@ -51239,8 +50729,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51435,6 +50924,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -51610,7 +51100,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "peer": true, "requires": { "type-detect": "4.0.8" } @@ -51620,7 +51109,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "peer": true, "requires": { "@sinonjs/commons": "^3.0.0" } @@ -52272,6 +51760,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "requires": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -52354,6 +51843,7 @@ "version": "3.10.9", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", + "peer": true, "requires": { "@tanstack/virtual-core": "3.10.9" } @@ -52430,6 +51920,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -52774,7 +52265,6 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "peer": true, "requires": { "@types/node": "*" } @@ -52901,6 +52391,7 @@ "version": "22.18.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "peer": true, "requires": { "undici-types": "~6.21.0" }, @@ -52932,6 +52423,7 @@ "version": "8.15.4", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", + "peer": true, "requires": { "@types/node": "*", "pg-protocol": "*", @@ -52982,6 +52474,7 @@ "version": "18.3.23", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -53120,8 +52613,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true + "dev": true }, "@types/strip-ansi": { "version": "3.0.0", @@ -53184,7 +52676,6 @@ "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -53195,7 +52686,6 @@ "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, - "peer": true, "requires": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -53403,6 +52893,7 @@ "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, + "peer": true, "requires": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -53427,6 +52918,7 @@ "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, + "peer": true, "requires": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -53684,8 +53176,7 @@ "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "peer": true + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -53774,7 +53265,8 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "peer": true }, "acorn-import-attributes": { "version": "1.9.5", @@ -53827,6 +53319,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -53870,6 +53363,7 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", + "peer": true, "requires": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -53924,8 +53418,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "peer": true + "dev": true }, "ansi-align": { "version": "3.0.1", @@ -54126,8 +53619,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true + "dev": true }, "asn1": { "version": "0.2.6", @@ -54220,8 +53712,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "peer": true + "dev": true }, "async-listen": { "version": "3.0.0", @@ -54305,7 +53796,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "peer": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -54338,7 +53828,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -54352,7 +53841,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -54367,7 +53855,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "peer": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -54381,7 +53868,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -54459,7 +53945,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, - "peer": true, "requires": { "@babel/types": "^7.26.0" } @@ -54468,15 +53953,13 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.29.1" } @@ -54486,7 +53969,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, - "peer": true, "requires": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -54496,7 +53978,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, - "peer": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -54520,7 +54001,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "peer": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -54670,7 +54150,6 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, - "peer": true, "requires": { "open": "^8.0.4" } @@ -54679,8 +54158,7 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "peer": true + "dev": true }, "big.js": { "version": "5.2.2", @@ -54860,7 +54338,6 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, - "peer": true, "requires": { "stream-buffers": "2.2.x" } @@ -54870,7 +54347,6 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, - "peer": true, "requires": { "big-integer": "1.6.x" } @@ -54902,6 +54378,7 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "peer": true, "requires": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -54915,7 +54392,6 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "peer": true, "requires": { "node-int64": "^0.4.0" } @@ -55026,7 +54502,6 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, - "peer": true, "requires": { "callsites": "^2.0.0" }, @@ -55035,8 +54510,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -55045,7 +54519,6 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, - "peer": true, "requires": { "caller-callsite": "^2.0.0" } @@ -55205,7 +54678,6 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, - "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55223,7 +54695,6 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, - "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55292,7 +54763,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, - "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -55301,8 +54771,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "peer": true + "dev": true }, "cli-table3": { "version": "0.6.5", @@ -55346,8 +54815,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "peer": true + "dev": true }, "clone-deep": { "version": "4.0.1", @@ -56147,7 +55615,8 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "peer": true }, "d3-timer": { "version": "3.0.1", @@ -56318,7 +55787,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "peer": true, "requires": { "clone": "^1.0.2" } @@ -56604,7 +56072,6 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, - "peer": true, "requires": { "dotenv": "^16.4.5" } @@ -56790,8 +56257,7 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true, - "peer": true + "dev": true }, "error-ex": { "version": "1.3.2", @@ -56806,7 +56272,6 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, - "peer": true, "requires": { "stackframe": "^1.3.4" } @@ -56860,6 +56325,7 @@ "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "peer": true, "requires": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", @@ -57232,8 +56698,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true, - "peer": true + "dev": true }, "execa": { "version": "5.1.1", @@ -57267,7 +56732,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -57281,8 +56745,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -57290,15 +56753,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true, - "peer": true + "dev": true }, "exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "peer": true + "dev": true }, "express": { "version": "4.22.1", @@ -57568,15 +57029,13 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true, - "peer": true + "dev": true }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "peer": true, "requires": { "bser": "2.1.1" } @@ -57765,8 +57224,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true, - "peer": true + "dev": true }, "follow-redirects": { "version": "1.15.11", @@ -57777,8 +57235,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true, - "peer": true + "dev": true }, "for-each": { "version": "0.3.5", @@ -57835,8 +57292,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true, - "peer": true + "dev": true }, "fresh": { "version": "0.5.2", @@ -57989,8 +57445,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "peer": true + "dev": true }, "get-port": { "version": "7.1.0", @@ -58040,8 +57495,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true, - "peer": true + "dev": true }, "giget": { "version": "2.0.0", @@ -58484,22 +57938,19 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true, - "peer": true + "dev": true }, "hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true, - "peer": true + "dev": true }, "hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.29.1" } @@ -58536,7 +57987,8 @@ "version": "4.10.6", "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true + "dev": true, + "peer": true }, "hpack.js": { "version": "2.1.6", @@ -58830,7 +58282,6 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, - "peer": true, "requires": { "queue": "6.0.2" } @@ -58991,8 +58442,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "peer": true + "dev": true }, "is-docker": { "version": "2.2.1", @@ -59209,7 +58659,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -59222,8 +58671,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59280,7 +58728,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "peer": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -59294,15 +58741,13 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "peer": true + "dev": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -59323,7 +58768,6 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -59340,15 +58784,13 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59359,8 +58801,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59369,7 +58810,6 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -59380,8 +58820,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "peer": true + "dev": true }, "jest-util": { "version": "29.7.0", @@ -59401,7 +58840,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -59415,15 +58853,13 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59434,8 +58870,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59464,8 +58899,7 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true, - "peer": true + "dev": true }, "jiti": { "version": "1.21.0", @@ -59529,8 +58963,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true, - "peer": true + "dev": true }, "jsdom": { "version": "26.1.0", @@ -59623,8 +59056,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "peer": true + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -59707,8 +59139,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true, - "peer": true + "dev": true }, "latest-version": { "version": "7.0.0", @@ -59801,7 +59232,6 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, - "peer": true, "requires": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -59812,7 +59242,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "requires": { "ms": "2.0.0" } @@ -59821,8 +59250,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59852,88 +59280,77 @@ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-freebsd-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-x64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-x64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-win32-arm64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-win32-x64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lilconfig": { "version": "2.1.0", @@ -60021,8 +59438,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "peer": true + "dev": true }, "lodash.uniq": { "version": "4.5.0", @@ -60034,7 +59450,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, - "peer": true, "requires": { "chalk": "^2.0.1" }, @@ -60044,7 +59459,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -60054,7 +59468,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -60066,7 +59479,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -60075,29 +59487,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -60187,6 +59595,7 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, + "peer": true, "requires": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -60212,7 +59621,6 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "peer": true, "requires": { "tmpl": "1.0.5" } @@ -60250,8 +59658,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true, - "peer": true + "dev": true }, "math-intrinsics": { "version": "1.1.0", @@ -60540,8 +59947,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true, - "peer": true + "dev": true }, "merge-anything": { "version": "5.1.7", @@ -60577,7 +59983,6 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -60625,22 +60030,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "peer": true, "requires": { "mime-db": "1.52.0" } @@ -60649,15 +60051,13 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -60667,7 +60067,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -60680,7 +60079,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, - "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -60693,7 +60091,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60703,7 +60100,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, - "peer": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -60720,7 +60116,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -60730,7 +60125,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, - "peer": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -60743,7 +60137,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, - "peer": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -60754,7 +60147,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -60765,7 +60157,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "peer": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -60775,8 +60166,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60785,7 +60175,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -60797,7 +60186,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, - "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -60815,7 +60203,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -60826,7 +60213,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60836,7 +60222,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -60847,7 +60232,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -60865,8 +60249,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60875,7 +60258,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -60889,8 +60271,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60899,7 +60280,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -60914,7 +60294,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61549,7 +60928,8 @@ "version": "15.10.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true + "dev": true, + "peer": true }, "graphql-subscriptions": { "version": "1.2.1", @@ -61592,7 +60972,8 @@ "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "peer": true }, "mri": { "version": "1.2.0", @@ -61623,6 +61004,7 @@ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, + "peer": true, "requires": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -61703,8 +61085,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true, - "peer": true + "dev": true }, "netmask": { "version": "2.0.2", @@ -61795,8 +61176,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "peer": true + "dev": true }, "node-releases": { "version": "2.0.27", @@ -61826,7 +61206,6 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, - "peer": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -61839,7 +61218,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "peer": true, "requires": { "lru-cache": "^10.0.1" } @@ -61848,8 +61226,7 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -61910,8 +61287,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "peer": true + "dev": true }, "nwsapi": { "version": "2.2.22", @@ -61937,7 +61313,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -62057,7 +61432,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, - "peer": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -62071,15 +61445,13 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -62089,7 +61461,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -62101,7 +61472,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -62110,29 +61480,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -62142,7 +61508,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -62225,6 +61590,7 @@ "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.8.5.tgz", "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", "dev": true, + "peer": true, "requires": { "@oxlint-tsgolint/darwin-arm64": "0.8.5", "@oxlint-tsgolint/darwin-x64": "0.8.5", @@ -62249,7 +61615,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -62323,8 +61688,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true + "dev": true }, "pac-proxy-agent": { "version": "7.2.0", @@ -62461,7 +61825,6 @@ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, - "peer": true, "requires": { "pngjs": "^3.3.0" } @@ -62514,8 +61877,7 @@ "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, - "peer": true + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -62582,6 +61944,7 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -62744,6 +62107,7 @@ "version": "1.53.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", + "peer": true, "requires": { "fsevents": "2.3.2", "playwright-core": "1.53.2" @@ -62759,7 +62123,6 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, - "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -62770,8 +62133,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true, - "peer": true + "dev": true }, "portfinder": { "version": "1.0.38", @@ -62792,6 +62154,7 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -63419,6 +62782,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -63516,8 +62880,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "peer": true + "dev": true }, "pretty-error": { "version": "4.0.0", @@ -63574,6 +62937,7 @@ "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", "dev": true, + "peer": true, "requires": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -63592,8 +62956,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "peer": true + "dev": true }, "process": { "version": "0.11.10", @@ -63628,15 +62991,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "peer": true + "dev": true }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, - "peer": true, "requires": { "asap": "~2.0.6" } @@ -63806,8 +63167,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true, - "peer": true + "dev": true }, "qs": { "version": "6.14.0", @@ -63822,7 +63182,6 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, - "peer": true, "requires": { "inherits": "~2.0.3" } @@ -63922,6 +63281,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -63931,7 +63291,6 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, - "peer": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -63942,7 +63301,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -63951,6 +63309,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -63999,6 +63358,7 @@ "version": "npm:@docusaurus/react-loadable@6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "peer": true, "requires": { "@types/react": "*" } @@ -64045,6 +63405,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "peer": true, "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -64548,7 +63909,6 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -64620,7 +63980,6 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, - "peer": true, "requires": { "node-forge": "^1.3.3" } @@ -64630,7 +63989,6 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, - "peer": true, "requires": { "chalk": "^4.1.2" } @@ -64640,7 +63998,6 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -64660,7 +64017,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, - "peer": true, "requires": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -64683,7 +64039,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -64713,7 +64068,6 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -64732,7 +64086,6 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, - "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -64746,15 +64099,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true, - "peer": true + "dev": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -64765,7 +64116,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -64819,7 +64169,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -64835,7 +64184,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -64846,7 +64194,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -64861,7 +64208,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -64873,7 +64219,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, - "peer": true, "requires": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -64888,15 +64233,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true, - "peer": true + "dev": true }, "@react-native/dev-middleware": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -64917,7 +64260,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -64926,15 +64268,13 @@ "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true, - "peer": true + "dev": true }, "@react-native/debugger-shell": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -64945,7 +64285,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -64965,7 +64304,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -64976,29 +64314,25 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true, - "peer": true + "dev": true }, "@react-native/js-polyfills": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true, - "peer": true + "dev": true }, "@react-native/normalize-colors": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true, - "peer": true + "dev": true }, "@react-native/virtualized-lists": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -65008,22 +64342,19 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "babel-preset-expo": { "version": "54.0.10", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, - "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -65054,7 +64385,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -65063,15 +64393,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true + "dev": true }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true + "dev": true }, "expo": { "version": "54.0.32", @@ -65108,7 +64436,6 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, - "peer": true, "requires": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -65119,7 +64446,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -65130,7 +64456,6 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, - "peer": true, "requires": {} }, "expo-font": { @@ -65148,7 +64473,6 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, - "peer": true, "requires": {} }, "expo-modules-autolinking": { @@ -65156,7 +64480,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -65170,7 +64493,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4" } @@ -65189,7 +64511,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -65201,7 +64522,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -65212,29 +64532,25 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true, - "peer": true + "dev": true }, "hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true + "dev": true }, "lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -65282,15 +64598,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": true }, "hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65300,7 +64614,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -65310,7 +64623,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -65323,7 +64635,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65335,7 +64646,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, - "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -65348,7 +64658,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65358,7 +64667,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, - "peer": true, "requires": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -65375,7 +64683,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -65387,7 +64694,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, - "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -65405,7 +64711,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -65416,7 +64721,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65426,7 +64730,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -65437,7 +64740,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -65456,7 +64758,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -65471,7 +64772,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65486,7 +64786,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65507,15 +64806,13 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "peer": true, "requires": { "mime-db": "1.52.0" } @@ -65525,7 +64822,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -65535,7 +64831,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "peer": true, "requires": { "minipass": "^7.1.2" } @@ -65545,7 +64840,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65555,7 +64849,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -65566,7 +64859,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -65576,15 +64868,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true + "dev": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -65596,7 +64886,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -65614,8 +64903,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true }, "react-native": { "version": "0.83.1", @@ -65666,7 +64954,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -65681,15 +64968,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -65699,7 +64984,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -65709,15 +64993,13 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true + "dev": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -65732,7 +65014,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65742,7 +65023,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65752,7 +65032,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -65761,29 +65040,25 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true + "dev": true }, "scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, - "peer": true + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true }, "tar": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, - "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -65802,15 +65077,13 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true, - "peer": true + "dev": true }, "yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -65880,7 +65153,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "peer": true }, "typescript": { "version": "5.9.3", @@ -65933,7 +65207,6 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, - "peer": true, "requires": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -65945,7 +65218,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, - "peer": true, "requires": { "path-parse": "^1.0.5" } @@ -65982,7 +65254,6 @@ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, - "peer": true, "requires": { "global-dirs": "^0.1.1" }, @@ -65992,7 +65263,6 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, - "peer": true, "requires": { "ini": "^1.3.4" } @@ -66013,15 +65283,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true, - "peer": true + "dev": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "peer": true + "dev": true }, "responselike": { "version": "3.0.0", @@ -66036,7 +65304,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, - "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -66046,15 +65313,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "peer": true + "dev": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, - "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -66108,6 +65373,7 @@ "version": "4.46.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "peer": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", @@ -66238,6 +65504,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -66372,8 +65639,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true, - "peer": true + "dev": true }, "serialize-javascript": { "version": "6.0.2", @@ -66387,7 +65653,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true + "dev": true, + "peer": true }, "seroval-plugins": { "version": "1.1.1", @@ -66686,7 +65953,6 @@ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, - "peer": true, "requires": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -66754,8 +66020,7 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true, - "peer": true + "dev": true }, "smart-buffer": { "version": "4.2.0", @@ -66819,6 +66084,7 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, + "peer": true, "requires": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -66982,7 +66248,6 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "peer": true, "requires": { "escape-string-regexp": "^2.0.0" }, @@ -66991,8 +66256,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "peer": true + "dev": true } } }, @@ -67006,15 +66270,13 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "peer": true + "dev": true }, "stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, - "peer": true, "requires": { "type-fest": "^0.7.1" }, @@ -67023,8 +66285,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -67047,8 +66308,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "peer": true + "dev": true }, "stream-shift": { "version": "1.0.3", @@ -67167,8 +66427,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true, - "peer": true + "dev": true }, "style-to-js": { "version": "1.1.21", @@ -67231,7 +66490,6 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, - "peer": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -67308,6 +66566,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, + "peer": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -67416,15 +66675,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "peer": true + "dev": true }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, - "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -67434,6 +66691,7 @@ "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -67581,8 +66839,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "peer": true + "dev": true }, "throttleit": { "version": "2.1.0", @@ -67642,7 +66899,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "peer": true } } }, @@ -67682,8 +66940,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "peer": true + "dev": true }, "to-regex-range": { "version": "5.0.1", @@ -67786,12 +67043,14 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "peer": true }, "tsx": { "version": "4.20.5", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "peer": true, "requires": { "esbuild": "~0.25.0", "fsevents": "~2.3.3", @@ -67897,8 +67156,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true + "dev": true }, "type-fest": { "version": "4.41.0", @@ -67989,6 +67247,7 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, + "peer": true, "requires": {} }, "typescript": { @@ -68398,8 +67657,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "peer": true + "dev": true }, "value-equal": { "version": "1.0.1", @@ -68466,6 +67724,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fsevents": "~2.3.3", @@ -68560,8 +67819,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "peer": true + "dev": true }, "w3c-xmlserializer": { "version": "5.0.0", @@ -68577,7 +67835,6 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "peer": true, "requires": { "makeerror": "1.0.12" } @@ -68604,7 +67861,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "peer": true, "requires": { "defaults": "^1.0.3" } @@ -68618,6 +67874,7 @@ "version": "5.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -68881,8 +68138,7 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true, - "peer": true + "dev": true }, "whatwg-mimetype": { "version": "4.0.0", @@ -68904,7 +68160,6 @@ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, - "peer": true, "requires": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -68915,8 +68170,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -69007,8 +68261,7 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true, - "peer": true + "dev": true }, "wordwrapjs": { "version": "5.1.0", @@ -69066,6 +68319,7 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "peer": true, "requires": {} }, "wsl-utils": { @@ -69096,7 +68350,6 @@ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, - "peer": true, "requires": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -69106,8 +68359,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -69135,7 +68387,6 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, - "peer": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -69145,8 +68396,7 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -69154,8 +68404,7 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "peer": true + "dev": true }, "xmlchars": { "version": "2.2.0", @@ -69212,8 +68461,7 @@ "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, - "peer": true + "dev": true }, "z2s": { "version": "file:packages/z2s", @@ -69332,7 +68580,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true }, "typescript": { "version": "5.9.3", @@ -69345,6 +68594,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -69650,7 +68900,6 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, - "peer": true, "requires": {} }, "zql": { @@ -69774,7 +69023,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true }, "typescript": { "version": "5.9.3", diff --git a/packages/zero-client/.gitignore b/packages/zero-client/.gitignore index f65fe0ca74..ef9713f48c 100644 --- a/packages/zero-client/.gitignore +++ b/packages/zero-client/.gitignore @@ -1,3 +1,4 @@ node_modules .DS_Store out + diff --git a/packages/zero-client/src/client/zero-poke-handler.test.ts b/packages/zero-client/src/client/zero-poke-handler.test.ts index 7eef04e3cc..db9159e5fb 100644 --- a/packages/zero-client/src/client/zero-poke-handler.test.ts +++ b/packages/zero-client/src/client/zero-poke-handler.test.ts @@ -17,10 +17,9 @@ import {serverToClient} from '../../../zero-schema/src/name-mapper.ts'; import {MutationTracker} from './mutation-tracker.ts'; import {PokeHandler, mergePokes} from './zero-poke-handler.ts'; -let rafStub: MockInstance<(cb: FrameRequestCallback) => number>; -// The FrameRequestCallback in PokeHandler does not use -// its time argument, so use an arbitrary constant for it in tests. -const UNUSED_RAF_ARG = 10; +let setTimeoutStub: MockInstance< + (callback: () => Promise, ms: number) => number +>; const ackMutationResponses = () => {}; const onFatalError = () => {}; @@ -46,16 +45,18 @@ const schema = createSchema({ describe('poke handler', () => { beforeEach(() => { - rafStub = vi - .spyOn(globalThis, 'requestAnimationFrame') - .mockImplementation(() => 0); + setTimeoutStub = vi + .spyOn(globalThis, 'setTimeout') + .mockImplementation( + (() => 0) as unknown as typeof setTimeout, + ) as MockInstance<(callback: () => Promise, ms: number) => number>; }); afterEach(() => { vi.restoreAllMocks(); }); - test('completed poke plays on first raf', async () => { + test('completed poke plays on first scheduled callback', async () => { const onPokeErrorStub = vi.fn(); const replicachePokeStub = vi.fn(); const clientID = 'c1'; @@ -68,7 +69,7 @@ describe('poke handler', () => { logContext, new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ pokeID: 'poke1', @@ -111,15 +112,16 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); - const rafCallback0 = rafStub.mock.calls[0][0]; - await rafCallback0(UNUSED_RAF_ARG); + const timeoutCallback0 = setTimeoutStub.mock + .calls[0][0] as () => Promise; + await timeoutCallback0(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); const replicachePoke0 = replicachePokeStub.mock.calls[0][0]; @@ -155,12 +157,13 @@ describe('poke handler', () => { }, }); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); - const rafCallback1 = rafStub.mock.calls[1][0]; - await rafCallback1(UNUSED_RAF_ARG); + const timeoutCallback1 = setTimeoutStub.mock + .calls[1][0] as () => Promise; + await timeoutCallback1(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); }); test('canceled poke is not applied', async () => { @@ -176,7 +179,7 @@ describe('poke handler', () => { logContext, new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); const pokeStartAndParts = (pokeID: string) => { pokeHandler.handlePokeStart({ @@ -218,26 +221,27 @@ describe('poke handler', () => { }; pokeStartAndParts('poke1'); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '', cancel: true}); - // raf is not scheduled because poke was canceled; - expect(rafStub).toHaveBeenCalledTimes(0); + // setTimeout is not scheduled because poke was canceled; + expect(setTimeoutStub).toHaveBeenCalledTimes(0); expect(replicachePokeStub).toHaveBeenCalledTimes(0); // now test receiving a poke after the canceled poke pokeStartAndParts('poke2'); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke2', cookie: '2'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); - const rafCallback0 = rafStub.mock.calls[0][0]; - await rafCallback0(UNUSED_RAF_ARG); + const timeoutCallback0 = setTimeoutStub.mock + .calls[0][0] as () => Promise; + await timeoutCallback0(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); const replicachePoke0 = replicachePokeStub.mock.calls[0][0]; @@ -269,15 +273,16 @@ describe('poke handler', () => { }, }); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); - const rafCallback1 = rafStub.mock.calls[1][0]; - await rafCallback1(UNUSED_RAF_ARG); + const timeoutCallback1 = setTimeoutStub.mock + .calls[1][0] as () => Promise; + await timeoutCallback1(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); }); - test('multiple pokes received before raf callback are merged', async () => { + test('multiple pokes received before scheduled callback are merged', async () => { const onPokeErrorStub = vi.fn(); const replicachePokeStub = vi.fn(); const clientID = 'c1'; @@ -291,7 +296,7 @@ describe('poke handler', () => { new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ pokeID: 'poke1', @@ -330,10 +335,10 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ @@ -367,15 +372,16 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); pokeHandler.handlePokeEnd({pokeID: 'poke2', cookie: '3'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); - const rafCallback0 = rafStub.mock.calls[0][0]; - await rafCallback0(UNUSED_RAF_ARG); + const timeoutCallback0 = setTimeoutStub.mock + .calls[0][0] as () => Promise; + await timeoutCallback0(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); const replicachePoke0 = replicachePokeStub.mock.calls[0][0]; @@ -418,15 +424,16 @@ describe('poke handler', () => { }, }); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); - const rafCallback1 = rafStub.mock.calls[1][0]; - await rafCallback1(UNUSED_RAF_ARG); + const timeoutCallback1 = setTimeoutStub.mock + .calls[1][0] as () => Promise; + await timeoutCallback1(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); }); - test('multiple pokes received before raf callback are merged, canceled pokes are not merged', async () => { + test('multiple pokes received before scheduled callback are merged, canceled pokes are not merged', async () => { const onPokeErrorStub = vi.fn(); const replicachePokeStub = vi.fn(); const clientID = 'c1'; @@ -440,7 +447,7 @@ describe('poke handler', () => { new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ pokeID: 'poke1', @@ -479,10 +486,10 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ @@ -516,11 +523,11 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); pokeHandler.handlePokeEnd({pokeID: 'poke2', cookie: '', cancel: true}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ @@ -541,12 +548,13 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); pokeHandler.handlePokeEnd({pokeID: 'poke3', cookie: '3'}); - const rafCallback0 = rafStub.mock.calls[0][0]; - await rafCallback0(UNUSED_RAF_ARG); + const timeoutCallback0 = setTimeoutStub.mock + .calls[0][0] as () => Promise; + await timeoutCallback0(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); const replicachePoke0 = replicachePokeStub.mock.calls[0][0]; @@ -597,15 +605,16 @@ describe('poke handler', () => { }, }); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); - const rafCallback1 = rafStub.mock.calls[1][0]; - await rafCallback1(UNUSED_RAF_ARG); + const timeoutCallback1 = setTimeoutStub.mock + .calls[1][0] as () => Promise; + await timeoutCallback1(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); }); - test('playback over series of rafs', async () => { + test('playback over series of scheduled callbacks', async () => { const onPokeErrorStub = vi.fn(); const replicachePokeStub = vi.fn(); const clientID = 'c1'; @@ -619,7 +628,7 @@ describe('poke handler', () => { new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ pokeID: 'poke1', @@ -658,14 +667,15 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); - const rafCallback0 = rafStub.mock.calls[0][0]; - await rafCallback0(UNUSED_RAF_ARG); + const timeoutCallback0 = setTimeoutStub.mock + .calls[0][0] as () => Promise; + await timeoutCallback0(); expect(replicachePokeStub).toHaveBeenCalledTimes(1); const replicachePoke0 = replicachePokeStub.mock.calls[0][0]; @@ -697,7 +707,7 @@ describe('poke handler', () => { }, }); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); pokeHandler.handlePokeStart({ pokeID: 'poke2', @@ -730,15 +740,16 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); pokeHandler.handlePokeEnd({pokeID: 'poke2', cookie: '3'}); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); expect(replicachePokeStub).toHaveBeenCalledTimes(1); - const rafCallback1 = rafStub.mock.calls[1][0]; - await rafCallback1(UNUSED_RAF_ARG); + const timeoutCallback1 = setTimeoutStub.mock + .calls[1][0] as () => Promise; + await timeoutCallback1(); expect(replicachePokeStub).toHaveBeenCalledTimes(2); const replicachePoke1 = replicachePokeStub.mock.calls[1][0]; @@ -765,12 +776,13 @@ describe('poke handler', () => { }, }); - expect(rafStub).toHaveBeenCalledTimes(3); + expect(setTimeoutStub).toHaveBeenCalledTimes(3); - const rafCallback2 = rafStub.mock.calls[2][0]; - await rafCallback2(UNUSED_RAF_ARG); + const timeoutCallback2 = setTimeoutStub.mock + .calls[2][0] as () => Promise; + await timeoutCallback2(); expect(replicachePokeStub).toHaveBeenCalledTimes(2); - expect(rafStub).toHaveBeenCalledTimes(3); + expect(setTimeoutStub).toHaveBeenCalledTimes(3); }); suite('onPokeErrors', () => { @@ -846,7 +858,7 @@ describe('poke handler', () => { logContext, new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ pokeID: 'poke1', @@ -885,19 +897,20 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); const {promise, reject} = resolver(); replicachePokeStub.mockReturnValue(promise); expect(onPokeErrorStub).toHaveBeenCalledTimes(0); - const rafCallback0 = rafStub.mock.calls[0][0]; - const rafCallback0Result = rafCallback0(UNUSED_RAF_ARG); + const timeoutCallback0 = setTimeoutStub.mock + .calls[0][0] as () => Promise; + const timeoutCallback0Result = timeoutCallback0(); expect(onPokeErrorStub).toHaveBeenCalledTimes(0); @@ -924,18 +937,19 @@ describe('poke handler', () => { }); reject('error in poke'); - await rafCallback0Result; + await timeoutCallback0Result; expect(replicachePokeStub).toHaveBeenCalledTimes(1); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); expect(onPokeErrorStub).toHaveBeenCalledTimes(1); - const rafCallback1 = rafStub.mock.calls[1][0]; - await rafCallback1(UNUSED_RAF_ARG); + const timeoutCallback1 = setTimeoutStub.mock + .calls[1][0] as () => Promise; + await timeoutCallback1(); // poke 2 cleared so replicachePokeStub not called expect(replicachePokeStub).toHaveBeenCalledTimes(1); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); }); test('cookie gap during mergePoke calls onPokeError and clears', async () => { @@ -951,7 +965,7 @@ describe('poke handler', () => { logContext, new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ pokeID: 'poke1', @@ -990,11 +1004,11 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ @@ -1010,13 +1024,14 @@ describe('poke handler', () => { pokeHandler.handlePokeEnd({pokeID: 'poke2', cookie: '4'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); expect(onPokeErrorStub).toHaveBeenCalledTimes(0); - const rafCallback0 = rafStub.mock.calls[0][0]; - const rafCallback0Result = rafCallback0(UNUSED_RAF_ARG); + const timeoutCallback0 = setTimeoutStub.mock + .calls[0][0] as () => Promise; + const timeoutCallback0Result = timeoutCallback0(); expect(onPokeErrorStub).toHaveBeenCalledTimes(0); @@ -1041,19 +1056,20 @@ describe('poke handler', () => { pokeID: 'poke3', cookie: '5', }); - await rafCallback0Result; + await timeoutCallback0Result; // not called because error is in merge before call expect(replicachePokeStub).toHaveBeenCalledTimes(0); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); expect(onPokeErrorStub).toHaveBeenCalledTimes(1); - const rafCallback1 = rafStub.mock.calls[1][0]; - await rafCallback1(UNUSED_RAF_ARG); + const timeoutCallback1 = setTimeoutStub.mock + .calls[1][0] as () => Promise; + await timeoutCallback1(); // poke 3 cleared so replicachePokeStub not called expect(replicachePokeStub).toHaveBeenCalledTimes(0); - expect(rafStub).toHaveBeenCalledTimes(2); + expect(setTimeoutStub).toHaveBeenCalledTimes(2); }); test('onDisconnect clears pending pokes', async () => { @@ -1069,7 +1085,7 @@ describe('poke handler', () => { logContext, new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ pokeID: 'poke1', @@ -1108,20 +1124,21 @@ describe('poke handler', () => { ], }); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); expect(replicachePokeStub).toHaveBeenCalledTimes(0); pokeHandler.handleDisconnect(); - const rafCallback0 = rafStub.mock.calls[0][0]; - await rafCallback0(UNUSED_RAF_ARG); + const timeoutCallback0 = setTimeoutStub.mock + .calls[0][0] as () => Promise; + await timeoutCallback0(); expect(replicachePokeStub).toHaveBeenCalledTimes(0); - expect(rafStub).toHaveBeenCalledTimes(1); + expect(setTimeoutStub).toHaveBeenCalledTimes(1); }); test('handlePoke returns the last mutation id change for this client from pokePart or undefined if none or error', () => { @@ -1137,7 +1154,7 @@ describe('poke handler', () => { logContext, new MutationTracker(logContext, ackMutationResponses, onFatalError), ); - expect(rafStub).toHaveBeenCalledTimes(0); + expect(setTimeoutStub).toHaveBeenCalledTimes(0); pokeHandler.handlePokeStart({ pokeID: 'poke1', @@ -1551,14 +1568,18 @@ describe('poke handler', () => { describe('mutation tracker interactions', () => { beforeEach(() => { - rafStub = vi - .spyOn(globalThis, 'requestAnimationFrame') - .mockImplementation(c => { - setTimeout(() => { - c(UNUSED_RAF_ARG); - }, 0); - return 1; + setTimeoutStub = vi.spyOn(globalThis, 'setTimeout').mockImplementation((( + callback: () => Promise, + ) => { + // Invoke the callback immediately for these tests + // Use queueMicrotask to avoid infinite recursion + queueMicrotask(() => { + void callback(); }); + return 1; + }) as unknown as typeof setTimeout) as MockInstance< + (callback: () => Promise, ms: number) => number + >; }); afterEach(() => { diff --git a/packages/zero-client/src/client/zero-poke-handler.ts b/packages/zero-client/src/client/zero-poke-handler.ts index a841fe9c2e..9c2510f8af 100644 --- a/packages/zero-client/src/client/zero-poke-handler.ts +++ b/packages/zero-client/src/client/zero-poke-handler.ts @@ -7,7 +7,6 @@ import type { import type {PatchOperation} from '../../../replicache/src/patch-operation.ts'; import type {ClientID} from '../../../replicache/src/sync/ids.ts'; import {unreachable} from '../../../shared/src/asserts.ts'; -import {getBrowserGlobalMethod} from '../../../shared/src/browser-env.ts'; import type {JSONValue} from '../../../shared/src/json.ts'; import type {MutationPatch} from '../../../zero-protocol/src/mutations-patch.ts'; import type { @@ -39,11 +38,11 @@ type PokeAccumulator = { /** * Handles the multi-part format of zero pokes. * As an optimization it also debounces pokes, only poking Replicache with a - * merged poke at most once per frame (as determined by requestAnimationFrame). - * The client cannot control how fast the server sends pokes, and it can only - * update the UI once per frame. This debouncing avoids wastefully - * computing separate diffs and IVM updates for intermediate states that will - * never been displayed to the UI. + * merged poke at most once per scheduled callback (using setTimeout). + * This debouncing avoids wastefully computing separate diffs and IVM updates + * for intermediate states. setTimeout is used instead of requestAnimationFrame + * to ensure pokes are delivered even when the tab is in the background, + * enabling notifications (sounds, favicon badges) to work correctly. */ export class PokeHandler { readonly #replicachePoke: (poke: PokeInternal) => Promise; @@ -53,7 +52,7 @@ export class PokeHandler { #receivingPoke: Omit | undefined = undefined; readonly #pokeBuffer: PokeAccumulator[] = []; #pokePlaybackLoopRunning = false; - #lastRafPerfTimestamp = 0; + #lastScheduledTimestamp = 0; // Serializes calls to this.#replicachePoke otherwise we can cause out of // order poke errors. readonly #pokeLock = new Lock(); @@ -61,9 +60,6 @@ export class PokeHandler { readonly #serverToClient: NameMapper; readonly #mutationTracker: MutationTracker; - readonly #raf = - getBrowserGlobalMethod('requestAnimationFrame') ?? rafFallback; - constructor( replicachePoke: (poke: PokeInternal) => Promise, onPokeError: () => void, @@ -139,25 +135,28 @@ export class PokeHandler { #startPlaybackLoop() { this.#lc.debug?.('starting playback loop'); this.#pokePlaybackLoopRunning = true; - this.#raf(this.#rafCallback); + setTimeout(this.#scheduledCallback, 0); } - #rafCallback = async () => { - const rafLC = this.#lc.withContext('rafAt', Math.floor(performance.now())); + #scheduledCallback = async () => { + const lc = this.#lc.withContext( + 'scheduledAt', + Math.floor(performance.now()), + ); if (this.#pokeBuffer.length === 0) { - rafLC.debug?.('stopping playback loop'); + lc.debug?.('stopping playback loop'); this.#pokePlaybackLoopRunning = false; return; } - this.#raf(this.#rafCallback); + setTimeout(this.#scheduledCallback, 0); const start = performance.now(); - rafLC.debug?.( - 'raf fired, processing pokes. Since last raf', - start - this.#lastRafPerfTimestamp, + lc.debug?.( + 'scheduled callback fired, processing pokes. Since last callback', + start - this.#lastScheduledTimestamp, ); - this.#lastRafPerfTimestamp = start; - await this.#processPokesForFrame(rafLC); - rafLC.debug?.('processing pokes took', performance.now() - start); + this.#lastScheduledTimestamp = start; + await this.#processPokesForFrame(lc); + lc.debug?.('processing pokes took', performance.now() - start); }; #processPokesForFrame(lc: LogContext): Promise { @@ -391,11 +390,3 @@ function rowsPatchOpToReplicachePatchOp( unreachable(op); } } - -/** - * Some environments we run in don't have `requestAnimationFrame` (such as - * Node, Cloudflare Workers). - */ -function rafFallback(callback: () => void): void { - setTimeout(callback, 0); -} From 2ce2ce6c10443b4361e6bdda8fcfdcc7f6ae3e7e Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 16 Feb 2026 06:43:12 -0800 Subject: [PATCH 071/495] chore(zero-cache): avoid unnecessary await (#5573) Avoid an unnecessary microtask in the common case. --- .../src/services/change-source/common/backfill-manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts index b3e97bb92f..c846c8ea4b 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -275,7 +275,7 @@ export class BackfillManager implements Cancelable, Listener { commitTx(); } - await mustWaitBeforeFlush; + mustWaitBeforeFlush && (await mustWaitBeforeFlush); if ( msg.tag === 'backfill' && From 6bf1bc14d1461ad0aaa02fe4abc873e1610a4b07 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Mon, 16 Feb 2026 11:10:30 -1000 Subject: [PATCH 072/495] docs: add Known Gotchas section to AGENTS.md Documents the SQLite NULL + OR full table scan issue discovered while debugging a customer performance regression. Links to PR #5542 for the fix details. --- AGENTS.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index e153477c0a..df243ae629 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -197,6 +197,35 @@ Zero is a streaming database: - Zero schema definitions are separate from PostgreSQL schema - Apps like zbugs demonstrate the connection between PostgreSQL tables and Zero schemas +## Known Gotchas + +This section documents surprising behaviors and hard-won lessons. If you discover something non-obvious that caused significant debugging pain, consider adding it here. + +### SQLite: NULL + OR = Full Table Scan + +When building OR queries with bound parameters in SQLite, if **any** branch involves a NULL value, SQLite abandons its MULTI-INDEX OR optimization and falls back to a full table scan. + +```sql +-- Even this simple query becomes a full table scan if ? is NULL: +SELECT * FROM users WHERE id = ? OR email = ?; + +-- If email is NULL, SQLite won't use MULTI-INDEX OR, even for the valid id branch +EXPLAIN QUERY PLAN → "SCAN users" (not "SEARCH users USING INDEX") +``` + +**Why it matters**: This caused 320x slowdowns on tables with nullable unique columns. A query that should take <1ms was taking 320ms. + +**Fix**: Filter out conditions where the value is NULL before building OR queries. NULL values can't violate uniqueness constraints anyway (NULL ≠ NULL in SQL). + +```typescript +// Filter out keys where any column is NULL +const validKeys = keys.filter(key => + key.every(column => row[column] !== null && row[column] !== undefined), +); +``` + +See: https://github.com/rocicorp/mono/pull/5542 + ## Git Conventions ### Commit Messages From 61331f0206e38a1688ca98441d093b5219a9937c Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Tue, 17 Feb 2026 10:38:21 +0100 Subject: [PATCH 073/495] chore(view-syncer): add more tracers for view syncer (#5556) This is df6090180ad6c32c55bc73931b6b9e963b410a3d but for main. --- .../src/services/view-syncer/cvr.ts | 921 +++++++++--------- .../src/services/view-syncer/tracer.ts | 4 + .../src/services/view-syncer/view-syncer.ts | 77 +- 3 files changed, 531 insertions(+), 471 deletions(-) create mode 100644 packages/zero-cache/src/services/view-syncer/tracer.ts diff --git a/packages/zero-cache/src/services/view-syncer/cvr.ts b/packages/zero-cache/src/services/view-syncer/cvr.ts index d1482dae52..6fdb0b59e8 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr.ts @@ -1,4 +1,5 @@ import type {LogContext} from '@rocicorp/logger'; +import {startAsyncSpan, startSpan} from '../../../../otel/src/span.ts'; import {assert} from '../../../../shared/src/asserts.ts'; import {type JSONObject} from '../../../../shared/src/bigint-json.ts'; import {CustomKeyMap} from '../../../../shared/src/custom-key-map.ts'; @@ -41,6 +42,7 @@ import { type RowID, type RowRecord, } from './schema/types.ts'; +import {tracer} from './tracer.ts'; import {ttlClockAsNumber, type TTLClock} from './ttl-clock.ts'; export type RowUpdate = { @@ -210,80 +212,82 @@ export class CVRConfigDrivenUpdater extends CVRUpdater { } ensureClient(id: string): ClientRecord { - let client = this._cvr.clients[id]; - if (client) { - return client; - } - // Add the ClientRecord and PutPatch - client = {id, desiredQueryIDs: []}; - this._cvr.clients[id] = client; - - this._ensureNewVersion(); - this._cvrStore.insertClient(client); - - if (!this._cvr.queries[CLIENT_LMID_QUERY_ID]) { - const lmidsQuery: InternalQueryRecord = { - id: CLIENT_LMID_QUERY_ID, - ast: { - schema: '', - table: `${upstreamSchema(this.#shard)}.clients`, - where: { - type: 'simple', - left: { - type: 'column', - name: 'clientGroupID', - }, - op: '=', - right: { - type: 'literal', - value: this._cvr.id, + return startSpan(tracer, 'CVRConfigDrivenUpdater.ensureClient', () => { + let client = this._cvr.clients[id]; + if (client) { + return client; + } + // Add the ClientRecord and PutPatch + client = {id, desiredQueryIDs: []}; + this._cvr.clients[id] = client; + + this._ensureNewVersion(); + this._cvrStore.insertClient(client); + + if (!this._cvr.queries[CLIENT_LMID_QUERY_ID]) { + const lmidsQuery: InternalQueryRecord = { + id: CLIENT_LMID_QUERY_ID, + ast: { + schema: '', + table: `${upstreamSchema(this.#shard)}.clients`, + where: { + type: 'simple', + left: { + type: 'column', + name: 'clientGroupID', + }, + op: '=', + right: { + type: 'literal', + value: this._cvr.id, + }, }, + orderBy: [ + ['clientGroupID', 'asc'], + ['clientID', 'asc'], + ], }, - orderBy: [ - ['clientGroupID', 'asc'], - ['clientID', 'asc'], - ], - }, - type: 'internal', - }; - this._cvr.queries[CLIENT_LMID_QUERY_ID] = lmidsQuery; - this._cvrStore.putQuery(lmidsQuery); - } - if (!this._cvr.queries[CLIENT_MUTATION_RESULTS_QUERY_ID]) { - const mutationResultsQuery: InternalQueryRecord = getMutationResultsQuery( - upstreamSchema(this.#shard), - this._cvr.id, - ); - this._cvr.queries[CLIENT_MUTATION_RESULTS_QUERY_ID] = - mutationResultsQuery; - this._cvrStore.putQuery(mutationResultsQuery); - } + type: 'internal', + }; + this._cvr.queries[CLIENT_LMID_QUERY_ID] = lmidsQuery; + this._cvrStore.putQuery(lmidsQuery); + } + if (!this._cvr.queries[CLIENT_MUTATION_RESULTS_QUERY_ID]) { + const mutationResultsQuery: InternalQueryRecord = + getMutationResultsQuery(upstreamSchema(this.#shard), this._cvr.id); + this._cvr.queries[CLIENT_MUTATION_RESULTS_QUERY_ID] = + mutationResultsQuery; + this._cvrStore.putQuery(mutationResultsQuery); + } - return client; + return client; + }); } setClientSchema(lc: LogContext, clientSchema: ClientSchema) { - if (this._cvr.clientSchema === null) { - this._cvr.clientSchema = clientSchema; - this._cvrStore.putInstance(this._cvr); - } else if (!deepEqual(this._cvr.clientSchema, clientSchema)) { - // This should not be possible with a correct Zero client, as clients - // of a CVR should all have the same schema (given that the schema hash - // is part of the idb key). In fact, clients joining an existing group - // (i.e. non-empty baseCookie) do not send the clientSchema message. - lc.warn?.( - `New schema ${JSON.stringify( - clientSchema, - )} does not match existing schema ${JSON.stringify( - this._cvr.clientSchema, - )}`, - ); - throw new ProtocolError({ - kind: 'InvalidConnectionRequest', - message: `Provided schema does not match previous schema`, - origin: ErrorOrigin.ZeroCache, - }); - } + startSpan(tracer, 'CVRConfigDrivenUpdater.setClientSchema', () => { + if (this._cvr.clientSchema === null) { + this._cvr.clientSchema = clientSchema; + this._cvrStore.putInstance(this._cvr); + } else if (!deepEqual(this._cvr.clientSchema, clientSchema)) { + // This should not be possible with a correct Zero client, as clients + // of a CVR should all have the same schema (given that the schema hash + // is part of the idb key). In fact, clients joining an existing group + // (i.e. non-empty baseCookie) do not send the clientSchema message. + lc.warn?.( + `New schema ${JSON.stringify( + clientSchema, + )} does not match existing schema ${JSON.stringify( + this._cvr.clientSchema, + )}`, + ); + throw new ProtocolError({ + kind: 'InvalidConnectionRequest', + message: `Provided schema does not match previous schema`, + origin: ErrorOrigin.ZeroCache, + }); + } + }); } setProfileID(lc: LogContext, profileID: string) { @@ -314,89 +318,91 @@ export class CVRConfigDrivenUpdater extends CVRUpdater { ttl?: number | undefined; }>[], ): PatchToVersion[] { - const patches: PatchToVersion[] = []; - const client = this.ensureClient(clientID); - const current = new Set(client.desiredQueryIDs); + return startSpan(tracer, 'CVRConfigDrivenUpdater.putDesiredQueries', () => { + const patches: PatchToVersion[] = []; + const client = this.ensureClient(clientID); + const current = new Set(client.desiredQueryIDs); + + // Find the new/changed desired queries. + const needed: Set = new Set(); + + const recordQueryForTelemetry = (q: (typeof queries)[0]) => { + const {ast, name, args} = q; + if (ast) { + recordQuery('crud'); + } else if (name && args) { + recordQuery('custom'); + } + }; - // Find the new/changed desired queries. - const needed: Set = new Set(); + for (const q of queries) { + const {hash, ttl = DEFAULT_TTL_MS} = q; + const query = this._cvr.queries[hash]; + if (!query) { + // New query - record for telemetry + recordQueryForTelemetry(q); + needed.add(hash); + continue; + } + if (query.type === 'internal') { + continue; + } - const recordQueryForTelemetry = (q: (typeof queries)[0]) => { - const {ast, name, args} = q; - if (ast) { - recordQuery('crud'); - } else if (name && args) { - recordQuery('custom'); - } - }; - - for (const q of queries) { - const {hash, ttl = DEFAULT_TTL_MS} = q; - const query = this._cvr.queries[hash]; - if (!query) { - // New query - record for telemetry - recordQueryForTelemetry(q); - needed.add(hash); - continue; - } - if (query.type === 'internal') { - continue; - } + const oldClientState = query.clientState[clientID]; + // Old query was inactivated or never desired by this client. + if (!oldClientState || oldClientState.inactivatedAt !== undefined) { + // Reactivated query - record for telemetry + recordQueryForTelemetry(q); + needed.add(hash); + continue; + } - const oldClientState = query.clientState[clientID]; - // Old query was inactivated or never desired by this client. - if (!oldClientState || oldClientState.inactivatedAt !== undefined) { - // Reactivated query - record for telemetry - recordQueryForTelemetry(q); - needed.add(hash); - continue; + if (compareTTL(ttl, oldClientState.ttl) > 0) { + // TTL update only - don't record for telemetry + needed.add(hash); + } } - if (compareTTL(ttl, oldClientState.ttl) > 0) { - // TTL update only - don't record for telemetry - needed.add(hash); + if (needed.size === 0) { + return patches; } - } + const newVersion = this._ensureNewVersion(); + client.desiredQueryIDs = [...union(current, needed)].sort(stringCompare); - if (needed.size === 0) { - return patches; - } - const newVersion = this._ensureNewVersion(); - client.desiredQueryIDs = [...union(current, needed)].sort(stringCompare); + for (const id of needed) { + const q = must(queries.find(({hash}) => hash === id)); + const {ast, name, args} = q; - for (const id of needed) { - const q = must(queries.find(({hash}) => hash === id)); - const {ast, name, args} = q; + const ttl = clampTTL(q.ttl ?? DEFAULT_TTL_MS); + const query = + this._cvr.queries[id] ?? newQueryRecord(id, ast, name, args); + assertNotInternal(query); - const ttl = clampTTL(q.ttl ?? DEFAULT_TTL_MS); - const query = - this._cvr.queries[id] ?? newQueryRecord(id, ast, name, args); - assertNotInternal(query); + const inactivatedAt = undefined; - const inactivatedAt = undefined; + query.clientState[clientID] = { + inactivatedAt, + ttl, + version: newVersion, + }; + this._cvr.queries[id] = query; + patches.push({ + toVersion: newVersion, + patch: {type: 'query', op: 'put', id, clientID}, + }); - query.clientState[clientID] = { - inactivatedAt, - ttl, - version: newVersion, - }; - this._cvr.queries[id] = query; - patches.push({ - toVersion: newVersion, - patch: {type: 'query', op: 'put', id, clientID}, - }); - - this._cvrStore.putQuery(query); - this._cvrStore.putDesiredQuery( - newVersion, - query, - client, - false, - inactivatedAt, - ttl, - ); - } - return patches; + this._cvrStore.putQuery(query); + this._cvrStore.putDesiredQuery( + newVersion, + query, + client, + false, + inactivatedAt, + ttl, + ); + } + return patches; + }); } markDesiredQueriesAsInactive( @@ -419,64 +425,66 @@ export class CVRConfigDrivenUpdater extends CVRUpdater { queryHashes: string[], inactivatedAt: TTLClock | undefined, ): PatchToVersion[] { - const patches: PatchToVersion[] = []; - const client = this.ensureClient(clientID); - const current = new Set(client.desiredQueryIDs); - const unwanted = new Set(queryHashes); - const remove = intersection(unwanted, current); - if (remove.size === 0) { - return patches; - } - - const newVersion = this._ensureNewVersion(); - client.desiredQueryIDs = [...difference(current, remove)].sort( - stringCompare, - ); - - for (const id of remove) { - const query = this._cvr.queries[id]; - if (!query) { - continue; // Query itself has already been removed. Should not happen? + return startSpan(tracer, 'CVRConfigDrivenUpdater.#deleteQueries', () => { + const patches: PatchToVersion[] = []; + const client = this.ensureClient(clientID); + const current = new Set(client.desiredQueryIDs); + const unwanted = new Set(queryHashes); + const remove = intersection(unwanted, current); + if (remove.size === 0) { + return patches; } - assertNotInternal(query); - let ttl = DEFAULT_TTL_MS; - if (inactivatedAt === undefined) { - delete query.clientState[clientID]; - } else { - // client state can be missing if the query never transformed so we never - // recorded it. - const clientState = query.clientState[clientID]; - if (clientState !== undefined) { - assert( - clientState.inactivatedAt === undefined, - `Query ${id} is already inactivated`, - ); - // Clamp TTL to ensure we don't propagate historical unclamped values. - ttl = clampTTL(clientState.ttl); - query.clientState[clientID] = { - inactivatedAt, - ttl, - version: newVersion, - }; + const newVersion = this._ensureNewVersion(); + client.desiredQueryIDs = [...difference(current, remove)].sort( + stringCompare, + ); + + for (const id of remove) { + const query = this._cvr.queries[id]; + if (!query) { + continue; // Query itself has already been removed. Should not happen? + } + assertNotInternal(query); + + let ttl = DEFAULT_TTL_MS; + if (inactivatedAt === undefined) { + delete query.clientState[clientID]; + } else { + // client state can be missing if the query never transformed so we never + // recorded it. + const clientState = query.clientState[clientID]; + if (clientState !== undefined) { + assert( + clientState.inactivatedAt === undefined, + `Query ${id} is already inactivated`, + ); + // Clamp TTL to ensure we don't propagate historical unclamped values. + ttl = clampTTL(clientState.ttl); + query.clientState[clientID] = { + inactivatedAt, + ttl, + version: newVersion, + }; + } } - } - this._cvrStore.putQuery(query); - this._cvrStore.putDesiredQuery( - newVersion, - query, - client, - true, - inactivatedAt, - ttl, - ); - patches.push({ - toVersion: newVersion, - patch: {type: 'query', op: 'del', id, clientID}, - }); - } - return patches; + this._cvrStore.putQuery(query); + this._cvrStore.putDesiredQuery( + newVersion, + query, + client, + true, + inactivatedAt, + ttl, + ); + patches.push({ + toVersion: newVersion, + patch: {type: 'query', op: 'del', id, clientID}, + }); + } + return patches; + }); } clearDesiredQueries(clientID: string): PatchToVersion[] { @@ -485,27 +493,29 @@ export class CVRConfigDrivenUpdater extends CVRUpdater { } deleteClient(clientID: string, ttlClock: TTLClock): PatchToVersion[] { - // clientID might not be part of this client group but if it is, this delete - // may generate changes to the desired queries. - - const client = this._cvr.clients[clientID]; - if (!client) { - // Clients in different client groups are no longer deleted, leaving - // cleanup to inactive CVR purging logic. - return []; - } + return startSpan(tracer, 'CVRConfigDrivenUpdater.deleteClient', () => { + // clientID might not be part of this client group but if it is, this delete + // may generate changes to the desired queries. + + const client = this._cvr.clients[clientID]; + if (!client) { + // Clients in different client groups are no longer deleted, leaving + // cleanup to inactive CVR purging logic. + return []; + } - // When a client is deleted we mark all of its desired queries as inactive. - // They will then be removed when the queries expire. - const patches = this.markDesiredQueriesAsInactive( - clientID, - client.desiredQueryIDs, - ttlClock, - ); - delete this._cvr.clients[clientID]; - this._cvrStore.deleteClient(clientID); + // When a client is deleted we mark all of its desired queries as inactive. + // They will then be removed when the queries expire. + const patches = this.markDesiredQueriesAsInactive( + clientID, + client.desiredQueryIDs, + ttlClock, + ); + delete this._cvr.clients[clientID]; + this._cvrStore.deleteClient(clientID); - return patches; + return patches; + }); } } @@ -587,62 +597,70 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { executed: {id: string; transformationHash: string}[], removed: {id: string}[], ): {newVersion: CVRVersion; queryPatches: PatchToVersion[]} { - assert(this.#existingRows === undefined, `trackQueries already called`); - - const queryPatches: Patch[] = [ - executed.map(q => this.#trackExecuted(q.id, q.transformationHash)), - removed.map(q => this.#trackRemoved(q.id)), - ].flat(2); - - this.#existingRows = this.#lookupRowsForExecutedAndRemovedQueries(lc); - // Immediately attach a rejection handler to avoid unhandled rejections. - // The error will surface when this.#existingRows is awaited. - void this.#existingRows.then(() => {}); - - return { - newVersion: this._cvr.version, - queryPatches: queryPatches.map(patch => ({ - patch, - toVersion: this._cvr.version, - })), - }; + return startSpan(tracer, 'CVRQueryDrivenUpdater.trackQueries', () => { + assert(this.#existingRows === undefined, `trackQueries already called`); + + const queryPatches: Patch[] = [ + executed.map(q => this.#trackExecuted(q.id, q.transformationHash)), + removed.map(q => this.#trackRemoved(q.id)), + ].flat(2); + + this.#existingRows = this.#lookupRowsForExecutedAndRemovedQueries(lc); + // Immediately attach a rejection handler to avoid unhandled rejections. + // The error will surface when this.#existingRows is awaited. + void this.#existingRows.then(() => {}); + + return { + newVersion: this._cvr.version, + queryPatches: queryPatches.map(patch => ({ + patch, + toVersion: this._cvr.version, + })), + }; + }); } - async #lookupRowsForExecutedAndRemovedQueries( + #lookupRowsForExecutedAndRemovedQueries( lc: LogContext, ): Promise> { - const results = new CustomKeyMap(rowIDString); - - if (this.#removedOrExecutedQueryIDs.size === 0) { - // Query-less update. This can happen for config only changes. - return []; - } + return startAsyncSpan( + tracer, + 'CVRQueryDrivenUpdater.#lookupRowsForExecutedAndRemovedQueries', + async () => { + const results = new CustomKeyMap(rowIDString); + + if (this.#removedOrExecutedQueryIDs.size === 0) { + // Query-less update. This can happen for config only changes. + return []; + } - // Utilizes the in-memory RowCache. - const allRowRecords = (await this._cvrStore.getRowRecords()).values(); - let total = 0; - for (const existing of allRowRecords) { - total++; - assert( - existing.refCounts !== null, - 'allRowRecords should not include null refCounts', - ); - for (const id of Object.keys(existing.refCounts)) { - if (this.#removedOrExecutedQueryIDs.has(id)) { - results.set(existing.id, existing); - break; + // Utilizes the in-memory RowCache. + const allRowRecords = (await this._cvrStore.getRowRecords()).values(); + let total = 0; + for (const existing of allRowRecords) { + total++; + assert( + existing.refCounts !== null, + 'allRowRecords should not include null refCounts', + ); + for (const id of Object.keys(existing.refCounts)) { + if (this.#removedOrExecutedQueryIDs.has(id)) { + results.set(existing.id, existing); + break; + } + } } - } - } - lc.debug?.( - `found ${ - results.size - } (of ${total}) rows for executed / removed queries ${[ - ...this.#removedOrExecutedQueryIDs, - ]}`, + lc.debug?.( + `found ${ + results.size + } (of ${total}) rows for executed / removed queries ${[ + ...this.#removedOrExecutedQueryIDs, + ]}`, + ); + return results.values(); + }, ); - return results.values(); } /** @@ -652,32 +670,34 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { * This must be called for all executed queries. */ #trackExecuted(queryID: string, transformationHash: string): Patch[] { - assert( - !this.#removedOrExecutedQueryIDs.has(queryID), - () => `Query ${queryID} already tracked as executed or removed`, - ); - this.#removedOrExecutedQueryIDs.add(queryID); - - let gotQueryPatch: Patch | undefined; - const query = this._cvr.queries[queryID]; - if (query.transformationHash !== transformationHash) { - const transformationVersion = this._ensureNewVersion(); - - if (query.type !== 'internal' && query.patchVersion === undefined) { - // client query: desired -> gotten - query.patchVersion = transformationVersion; - gotQueryPatch = { - type: 'query', - op: 'put', - id: query.id, - }; - } + return startSpan(tracer, 'CVRQueryDrivenUpdater.#trackExecuted', () => { + assert( + !this.#removedOrExecutedQueryIDs.has(queryID), + () => `Query ${queryID} already tracked as executed or removed`, + ); + this.#removedOrExecutedQueryIDs.add(queryID); + + let gotQueryPatch: Patch | undefined; + const query = this._cvr.queries[queryID]; + if (query.transformationHash !== transformationHash) { + const transformationVersion = this._ensureNewVersion(); + + if (query.type !== 'internal' && query.patchVersion === undefined) { + // client query: desired -> gotten + query.patchVersion = transformationVersion; + gotQueryPatch = { + type: 'query', + op: 'put', + id: query.id, + }; + } - query.transformationHash = transformationHash; - query.transformationVersion = transformationVersion; - this._cvrStore.updateQuery(query); - } - return gotQueryPatch ? [gotQueryPatch] : []; + query.transformationHash = transformationHash; + query.transformationVersion = transformationVersion; + this._cvrStore.updateQuery(query); + } + return gotQueryPatch ? [gotQueryPatch] : []; + }); } /** @@ -691,20 +711,22 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { * This must only be called on queries that are not "desired" by any client. */ #trackRemoved(queryID: string): Patch[] { - const query = this._cvr.queries[queryID]; - assertNotInternal(query); + return startSpan(tracer, 'CVRQueryDrivenUpdater.#trackRemoved', () => { + const query = this._cvr.queries[queryID]; + assertNotInternal(query); - assert( - !this.#removedOrExecutedQueryIDs.has(queryID), - () => `Query ${queryID} already tracked as executed or removed`, - ); - this.#removedOrExecutedQueryIDs.add(queryID); - delete this._cvr.queries[queryID]; + assert( + !this.#removedOrExecutedQueryIDs.has(queryID), + () => `Query ${queryID} already tracked as executed or removed`, + ); + this.#removedOrExecutedQueryIDs.add(queryID); + delete this._cvr.queries[queryID]; - const newVersion = this._ensureNewVersion(); - const queryPatch = {type: 'query', op: 'del', id: queryID} as const; - this._cvrStore.markQueryAsDeleted(newVersion, queryPatch); - return [queryPatch]; + const newVersion = this._ensureNewVersion(); + const queryPatch = {type: 'query', op: 'del', id: queryID} as const; + this._cvrStore.markQueryAsDeleted(newVersion, queryPatch); + return [queryPatch]; + }); } /** @@ -730,101 +752,110 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { * returns (put) patches to be returned to update their state, versioned by * patchVersion so that only the patches new to the clients are sent. */ - async received( + received( _lc: LogContext, rows: Map, ): Promise { - const patches: PatchToVersion[] = []; - const existingRows = await this._cvrStore.getRowRecords(); - - for (const [id, update] of rows.entries()) { - const {contents, version, refCounts} = update; - - let existing = existingRows.get(id); - // Accumulate all received refCounts to determine which rows to prune. - const previouslyReceived = this.#receivedRows.get(id); - - const merged = - previouslyReceived !== undefined - ? mergeRefCounts(previouslyReceived, refCounts) - : mergeRefCounts( - existing?.refCounts, - refCounts, - this.#removedOrExecutedQueryIDs, - ); - - this.#receivedRows.set(id, merged); - - const newRowVersion = merged === null ? undefined : version; - const patchVersion = - existing && existing.rowVersion === newRowVersion - ? existing.patchVersion // existing row is unchanged - : this.#assertNewVersion(); - - // Note: for determining what to commit to the CVR store, use the - // `version` of the update even if `merged` is null (i.e. don't - // use `newRowVersion`). This will be deduped by the cvr-store flush - // if it is redundant. In rare cases--namely, if the row key has - // changed--we _do_ want to add row-put for the new row key with - // `refCounts: null` in order to correctly record a delete patch - // for that row, as the row with the old key will be removed. - const rowVersion = version ?? existing?.rowVersion; - if (rowVersion) { - this._cvrStore.putRowRecord({ - id, - rowVersion, - patchVersion, - refCounts: merged, - }); - } else { - // This means that a row that was not in the CVR was added during - // this update, and then subsequently removed. Since there's no - // corresponding row in the CVR itself, cancel the previous put. - // Note that we still send a 'del' patch to the client in order to - // cancel the previous 'put' patch. - this._cvrStore.delRowRecord(id); - } - - // Dedupe against the lastPatch sent for the row, and ensure that - // toVersion never backtracks (lest it be undesirably filtered). - const lastPatch = this.#lastPatches.get(id); - const toVersion = maxVersion(patchVersion, lastPatch?.toVersion); - - if (merged === null) { - // All refCounts have gone to zero, if row was previously synced - // delete it. - if (existing || previouslyReceived) { - // dedupe - if (lastPatch?.rowVersion !== null) { - patches.push({ - patch: { - type: 'row', - op: 'del', - id, - }, - toVersion, + return startAsyncSpan( + tracer, + 'CVRQueryDrivenUpdater.received', + async () => { + const patches: PatchToVersion[] = []; + const existingRows = await this._cvrStore.getRowRecords(); + + for (const [id, update] of rows.entries()) { + const {contents, version, refCounts} = update; + + let existing = existingRows.get(id); + // Accumulate all received refCounts to determine which rows to prune. + const previouslyReceived = this.#receivedRows.get(id); + + const merged = + previouslyReceived !== undefined + ? mergeRefCounts(previouslyReceived, refCounts) + : mergeRefCounts( + existing?.refCounts, + refCounts, + this.#removedOrExecutedQueryIDs, + ); + + this.#receivedRows.set(id, merged); + + const newRowVersion = merged === null ? undefined : version; + const patchVersion = + existing && existing.rowVersion === newRowVersion + ? existing.patchVersion // existing row is unchanged + : this.#assertNewVersion(); + + // Note: for determining what to commit to the CVR store, use the + // `version` of the update even if `merged` is null (i.e. don't + // use `newRowVersion`). This will be deduped by the cvr-store flush + // if it is redundant. In rare cases--namely, if the row key has + // changed--we _do_ want to add row-put for the new row key with + // `refCounts: null` in order to correctly record a delete patch + // for that row, as the row with the old key will be removed. + const rowVersion = version ?? existing?.rowVersion; + if (rowVersion) { + this._cvrStore.putRowRecord({ + id, + rowVersion, + patchVersion, + refCounts: merged, }); - this.#lastPatches.set(id, {rowVersion: null, toVersion}); + } else { + // This means that a row that was not in the CVR was added during + // this update, and then subsequently removed. Since there's no + // corresponding row in the CVR itself, cancel the previous put. + // Note that we still send a 'del' patch to the client in order to + // cancel the previous 'put' patch. + this._cvrStore.delRowRecord(id); + } + + // Dedupe against the lastPatch sent for the row, and ensure that + // toVersion never backtracks (lest it be undesirably filtered). + const lastPatch = this.#lastPatches.get(id); + const toVersion = maxVersion(patchVersion, lastPatch?.toVersion); + + if (merged === null) { + // All refCounts have gone to zero, if row was previously synced + // delete it. + if (existing || previouslyReceived) { + // dedupe + if (lastPatch?.rowVersion !== null) { + patches.push({ + patch: { + type: 'row', + op: 'del', + id, + }, + toVersion, + }); + this.#lastPatches.set(id, {rowVersion: null, toVersion}); + } + } + } else if (contents) { + assert( + rowVersion, + 'rowVersion is required when contents is present', + ); + // dedupe + if (!lastPatch?.rowVersion || lastPatch.rowVersion < rowVersion) { + patches.push({ + patch: { + type: 'row', + op: 'put', + id, + contents, + }, + toVersion, + }); + this.#lastPatches.set(id, {rowVersion, toVersion}); + } } } - } else if (contents) { - assert(rowVersion, 'rowVersion is required when contents is present'); - // dedupe - if (!lastPatch?.rowVersion || lastPatch.rowVersion < rowVersion) { - patches.push({ - patch: { - type: 'row', - op: 'put', - id, - contents, - }, - toVersion, - }); - this.#lastPatches.set(id, {rowVersion, toVersion}); - } - } - } - return patches; + return patches; + }, + ); } /** @@ -839,66 +870,78 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { * This is Step [5] of the * [CVR Sync Algorithm](https://www.notion.so/replicache/Sync-and-Client-View-Records-CVR-a18e02ec3ec543449ea22070855ff33d?pvs=4#7874f9b80a514be2b8cd5cf538b88d37). */ - async deleteUnreferencedRows(lc?: LogContext): Promise { - if (this.#removedOrExecutedQueryIDs.size === 0) { - // Query-less update. This can happen for config-only changes. - assert( - this.#receivedRows.size === 0, - () => - `Expected no received rows for query-less update, got ${this.#receivedRows.size}`, - ); - return []; - } + deleteUnreferencedRows(lc?: LogContext): Promise { + return startAsyncSpan( + tracer, + 'CVRQueryDrivenUpdater.deleteUnreferencedRows', + async () => { + if (this.#removedOrExecutedQueryIDs.size === 0) { + // Query-less update. This can happen for config-only changes. + assert( + this.#receivedRows.size === 0, + () => + `Expected no received rows for query-less update, got ${this.#receivedRows.size}`, + ); + return []; + } - // patches to send to the client. - const patches: PatchToVersion[] = []; + // patches to send to the client. + const patches: PatchToVersion[] = []; - const start = Date.now(); - assert(this.#existingRows, `trackQueries() was not called`); - for (const existing of await this.#existingRows) { - const deletedID = this.#deleteUnreferencedRow(existing); - if (deletedID === null) { - continue; - } - patches.push({ - toVersion: this._cvr.version, - patch: {type: 'row', op: 'del', id: deletedID}, - }); - } - lc?.debug?.( - `computed ${patches.length} delete patches (${Date.now() - start} ms)`, - ); + const start = Date.now(); + assert(this.#existingRows, `trackQueries() was not called`); + for (const existing of await this.#existingRows) { + const deletedID = this.#deleteUnreferencedRow(existing); + if (deletedID === null) { + continue; + } + patches.push({ + toVersion: this._cvr.version, + patch: {type: 'row', op: 'del', id: deletedID}, + }); + } + lc?.debug?.( + `computed ${patches.length} delete patches (${Date.now() - start} ms)`, + ); - return patches; + return patches; + }, + ); } #deleteUnreferencedRow(existing: RowRecord): RowID | null { - if (this.#receivedRows.get(existing.id)) { - return null; - } + return startSpan( + tracer, + 'CVRQueryDrivenUpdater.#deleteUnreferencedRow', + () => { + if (this.#receivedRows.get(existing.id)) { + return null; + } + + const newRefCounts = mergeRefCounts( + existing.refCounts, + undefined, + this.#removedOrExecutedQueryIDs, + ); + // If a row is still referenced, we update the refCounts but not the + // patchVersion (as the existence and contents of the row have not + // changed from the clients' perspective). If the row is deleted, it + // gets a new patchVersion (and corresponding poke). + const patchVersion = newRefCounts + ? existing.patchVersion + : this.#assertNewVersion(); + const rowRecord: RowRecord = { + ...existing, + patchVersion, + refCounts: newRefCounts, + }; - const newRefCounts = mergeRefCounts( - existing.refCounts, - undefined, - this.#removedOrExecutedQueryIDs, + this._cvrStore.putRowRecord(rowRecord); + + // Return the id to delete if no longer referenced. + return newRefCounts ? null : existing.id; + }, ); - // If a row is still referenced, we update the refCounts but not the - // patchVersion (as the existence and contents of the row have not - // changed from the clients' perspective). If the row is deleted, it - // gets a new patchVersion (and corresponding poke). - const patchVersion = newRefCounts - ? existing.patchVersion - : this.#assertNewVersion(); - const rowRecord: RowRecord = { - ...existing, - patchVersion, - refCounts: newRefCounts, - }; - - this._cvrStore.putRowRecord(rowRecord); - - // Return the id to delete if no longer referenced. - return newRefCounts ? null : existing.id; } } diff --git a/packages/zero-cache/src/services/view-syncer/tracer.ts b/packages/zero-cache/src/services/view-syncer/tracer.ts new file mode 100644 index 0000000000..655e45c793 --- /dev/null +++ b/packages/zero-cache/src/services/view-syncer/tracer.ts @@ -0,0 +1,4 @@ +import {trace} from '@opentelemetry/api'; +import {version} from '../../../../otel/src/version.ts'; + +export const tracer = trace.getTracer('view-syncer', version); diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.ts index 786842b050..fe0e888925 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.ts @@ -1,4 +1,3 @@ -import {trace} from '@opentelemetry/api'; import {Lock} from '@rocicorp/lock'; import type {LogContext} from '@rocicorp/logger'; import {resolver} from '@rocicorp/resolver'; @@ -8,7 +7,6 @@ import { startAsyncSpan, startSpan, } from '../../../../otel/src/span.ts'; -import {version} from '../../../../otel/src/version.ts'; import {assert, unreachable} from '../../../../shared/src/asserts.ts'; import {stringify} from '../../../../shared/src/bigint-json.ts'; import {CustomKeyMap} from '../../../../shared/src/custom-key-map.ts'; @@ -99,6 +97,7 @@ import { type RowID, } from './schema/types.ts'; import {ResetPipelinesSignal} from './snapshotter.ts'; +import {tracer} from './tracer.ts'; import { ttlClockAsNumber, ttlClockFromNumber, @@ -116,8 +115,6 @@ export type SyncContext = { readonly userID: string; }; -const tracer = trace.getTracer('view-syncer', version); - const PROTOCOL_VERSION_ATTR = 'protocol.version'; export interface ViewSyncer { @@ -868,23 +865,25 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { } #flushUpdater(lc: LogContext, updater: CVRUpdater): Promise { - return this.#runPriorityOp(lc, 'flushing cvr', async () => { - const now = Date.now(); - const ttlClock = this.#getTTLClock(now); - const {cvr, flushed} = await updater.flush( - lc, - this.#lastConnectTime, - now, - ttlClock, - ); + return startAsyncSpan(tracer, 'vs.#flushUpdater', () => + this.#runPriorityOp(lc, 'flushing cvr', async () => { + const now = Date.now(); + const ttlClock = this.#getTTLClock(now); + const {cvr, flushed} = await updater.flush( + lc, + this.#lastConnectTime, + now, + ttlClock, + ); - if (flushed) { - // If the CVR was flushed, we restart the ttlClock interval. - this.#startTTLClockInterval(lc); - } + if (flushed) { + // If the CVR was flushed, we restart the ttlClock interval. + this.#startTTLClockInterval(lc); + } - return cvr; - }); + return cvr; + }), + ); } #startTTLClockInterval(lc: LogContext): void { @@ -942,11 +941,20 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { // (Clients that are behind the cvr.version need to be caught up in // #syncQueryPipelineSet(), as row data may be needed for catchup) const newCVR = this.#cvr; - const pokers = startPoke(this.#getClients(cvr.version), newCVR.version); - for (const patch of patches) { - await pokers.addPatch(patch); - } - await pokers.end(newCVR.version); + await startAsyncSpan( + tracer, + 'vs.#updateCVRConfig.pokeClients', + async () => { + const pokers = startPoke( + this.#getClients(cvr.version), + newCVR.version, + ); + for (const patch of patches) { + await pokers.addPatch(patch); + } + await pokers.end(newCVR.version); + }, + ); } if (this.#pipelinesSynced) { @@ -1061,7 +1069,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { customQueryTransformMode: CustomQueryTransformMode, profileID?: string, ) => - startAsyncSpan(tracer, 'vs.#patchQueries', async () => { + startAsyncSpan(tracer, 'vs.#handleConfigUpdate', async () => { const deletedClientIDs: string[] = []; const deletedClientGroupIDs: string[] = []; @@ -1149,14 +1157,19 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { deletedClientGroupIDs.length ) { const clients = this.#getClients(); - await Promise.allSettled( - clients.map(client => - client.sendDeleteClients( - lc, - deletedClientIDs, - deletedClientGroupIDs, + await startAsyncSpan( + tracer, + 'vs.#handleConfigUpdate.sendDeleteClients', + () => + Promise.allSettled( + clients.map(client => + client.sendDeleteClients( + lc, + deletedClientIDs, + deletedClientGroupIDs, + ), + ), ), - ), ); } From f0182442c6e311a2449d3a17f880cce193753b37 Mon Sep 17 00:00:00 2001 From: jbingen Date: Tue, 17 Feb 2026 17:14:06 +0100 Subject: [PATCH 074/495] fix(zero-client): log socket close code 1006 as info, not error (#5563) WebSocket close code 1006 (abnormal closure) is generated by the browser when the connection drops unexpectedly - laptop sleep, network change, etc. this is expected in practice, especially in Electron apps, but the current `#onClose` handler logs it as `lc.error` which floods error monitoring. treats 1006 the same as clean close codes (<=1001) by logging at info level. the connection still transitions through the normal reconnect flow regardless of log level. ## test plan - added test verifying code 1006 produces an info log, not error - existing tests pass across chromium, webkit, firefox --------- Co-authored-by: Chase Adams Co-authored-by: Chase Adams --- packages/zero-client/src/client/zero.test.ts | 29 ++++++++++++++++++++ packages/zero-client/src/client/zero.ts | 4 ++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/zero-client/src/client/zero.test.ts b/packages/zero-client/src/client/zero.test.ts index b5ea08af4b..2006f2bd58 100644 --- a/packages/zero-client/src/client/zero.test.ts +++ b/packages/zero-client/src/client/zero.test.ts @@ -4348,6 +4348,35 @@ describe('WebSocket event error handling', () => { }); }); +test('socket close code 1006 is logged as info, not error', async () => { + const z = zeroForTest({logLevel: 'info'}); + await z.triggerConnected(); + const socket = await z.socket; + + const initialLogCount = z.testLogSink.messages.length; + socket.dispatchEvent( + new CloseEvent('close', {code: 1006, reason: '', wasClean: false}), + ); + await z.waitForConnectionStatus(ConnectionStatus.Connecting); + + const newLogs = z.testLogSink.messages.slice(initialLogCount); + const closeLog = newLogs.find( + ([, , args]) => Array.isArray(args) && args[0] === 'Got socket close event', + ); + expect(closeLog).toBeDefined(); + assert(closeLog); + expect(closeLog[0]).toBe('info'); + expect(closeLog[2][1]).toEqual({code: 1006, reason: '', wasClean: false}); + + const errorLog = newLogs.find( + ([level, , args]) => + level === 'error' && args[0] === 'Got unexpected socket close event', + ); + expect(errorLog).toBeUndefined(); + + await z.close().catch(() => {}); +}); + test('Logging stack on close', async () => { const z = zeroForTest({logLevel: 'debug'}); await z.triggerConnected(); diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index fd5883bcd5..e7b335c797 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -1331,7 +1331,9 @@ export class Zero< lc = addWebSocketIDFromSocketToLogContext(this.#socket, lc); const {code, reason, wasClean} = e; - if (code <= 1001) { + // 1006 = abnormal closure, generated by the browser when the connection + // drops (e.g. laptop sleep, network change). expected in practice. + if (code <= 1001 || code === 1006) { lc.info?.('Got socket close event', {code, reason, wasClean}); } else { lc.error?.('Got unexpected socket close event', { From b84d4a701d44ce8a0b4cbb0f7ab137f8a628a1ef Mon Sep 17 00:00:00 2001 From: utkarsh-611 Date: Wed, 18 Feb 2026 00:08:14 +0530 Subject: [PATCH 075/495] fix: release backpressure when Storer crashes (#5569) Suggested Change: When the Storer's #processQueue() throws an exception while backpressure is active, the #readyForMore promise was never resolved. This will cause ChangeStreamerService to deadlock on await readyForMore. Release any pending backpressure in the finally block of run() to ensure upstream can proceed even when Storer exits due to an error. Why this change: We were facing an issue that suddenly backpressure is getting applied with 100k changes and then released at 89999 changes and at this point the syncing gets stopped, we have to kill the replicator, delete all the table from zero (cvr, cdb etc) and then restart everything from fresh. there are no specific logs as to what is happening, we are checking our applications if we are getting lot of rows added, which is unlikely, as there is not that much traffic. seeing the code around this problem I thought this change might be required. Logs {"level":"WARN","pid":46,"worker":"change-streamer","component":"change-log","message":"applying back pressure with 100001 queued changes"} Co-authored-by: Darick Tong --- packages/zero-cache/src/services/change-streamer/storer.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index ba595fedde..d401394252 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -331,6 +331,11 @@ export class Storer implements Service { await this.#processQueue(); } finally { this.#running = false; + // Release any pending backpressure so the upstream can proceed + if (this.#readyForMore !== null) { + this.#readyForMore.resolve(); + this.#readyForMore = null; + } this.#lc.info?.('storer stopped'); } } From 14b748a4cd5f6c31a27d49bc404640a4a7caec85 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Tue, 17 Feb 2026 14:23:25 -0700 Subject: [PATCH 076/495] chore: update tsx (#5576) Related to https://github.com/rocicorp/mono/pull/5543 Fixes https://bugs.rocicorp.dev/p/zero/issue/246607 --- apps/zbugs/package.json | 2 +- package-lock.json | 680 +++++++++++++++++++++++++- package.json | 2 +- packages/replicache-perf/package.json | 2 +- packages/zero-cache/package.json | 2 +- packages/zero/package.json | 2 +- 6 files changed, 668 insertions(+), 22 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 6b5c37d557..1b26357d1c 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -88,7 +88,7 @@ "rehype-video": "^2.3.0", "shared": "0.0.0", "tailwindcss": "^3.0.23", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "typescript": "~5.9.3", "universal-user-agent": "^7.0.2", "vite": "7.2.7", diff --git a/package-lock.json b/package-lock.json index 25e6e872be..cce67b2914 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "oxlint": "^1.32.0", "oxlint-tsgolint": "^0.8.5", "prettier": "^3.5.3", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "turbo": "^2.4.4", "vitest": "4.0.15" }, @@ -117,7 +117,7 @@ "rehype-video": "^2.3.0", "shared": "0.0.0", "tailwindcss": "^3.0.23", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "typescript": "~5.9.3", "universal-user-agent": "^7.0.2", "vite": "7.2.7", @@ -35504,13 +35504,13 @@ "peer": true }, "node_modules/tsx": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", - "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", "peer": true, "dependencies": { - "esbuild": "~0.25.0", + "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -35523,6 +35523,463 @@ "fsevents": "~2.3.3" } }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "node_modules/tsx/node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -38232,7 +38689,7 @@ "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "typescript": "~5.9.3", "vite": "7.2.7", "xbytes": "^1.7.0" @@ -40198,7 +40655,7 @@ "postgres": "3.4.7", "prettier": "^3.5.3", "semver": "^7.5.4", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "url-pattern": "^1.0.3", "urlpattern-polyfill": "^10.1.0", "ws": "^8.18.1" @@ -40287,7 +40744,7 @@ "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "url-pattern": "^1.0.3", "urlpattern-polyfill": "^10.1.0", "ws": "^8.18.1", @@ -49996,7 +50453,7 @@ "replicache": "15.2.1", "semver": "^7.5.4", "shared": "0.0.0", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "typedoc": "^0.28.15", "typedoc-plugin-markdown": "^4.9.0", "typescript": "~5.9.3", @@ -65132,7 +65589,7 @@ "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "typescript": "~5.9.3", "vite": "7.2.7", "xbytes": "^1.7.0" @@ -67047,16 +67504,205 @@ "peer": true }, "tsx": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", - "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "peer": true, "requires": { - "esbuild": "~0.25.0", + "esbuild": "~0.27.0", "fsevents": "~2.3.3", "get-tsconfig": "^4.7.5" }, "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "optional": true + }, + "@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "optional": true + }, + "esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "requires": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -68532,7 +69178,7 @@ "remark-gfm": "^4.0.0", "shared": "0.0.0", "tailwindcss": "^3.0.23", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "typescript": "~5.9.3", "universal-user-agent": "^7.0.2", "use-debounce": "^10.0.4", @@ -68680,7 +69326,7 @@ "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", "shared": "0.0.0", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "typescript": "~5.9.3", "url-pattern": "^1.0.3", "urlpattern-polyfill": "^10.1.0", diff --git a/package.json b/package.json index 13baad8210..887894308a 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "oxlint": "^1.32.0", "oxlint-tsgolint": "^0.8.5", "prettier": "^3.5.3", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "turbo": "^2.4.4", "vitest": "4.0.15" }, diff --git a/packages/replicache-perf/package.json b/packages/replicache-perf/package.json index 1d51110527..b4996fa6d0 100644 --- a/packages/replicache-perf/package.json +++ b/packages/replicache-perf/package.json @@ -24,7 +24,7 @@ "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "typescript": "~5.9.3", "vite": "7.2.7", "xbytes": "^1.7.0" diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index ecb88680eb..2bc0b8fc15 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -61,7 +61,7 @@ "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "url-pattern": "^1.0.3", "urlpattern-polyfill": "^10.1.0", "ws": "^8.18.1", diff --git a/packages/zero/package.json b/packages/zero/package.json index ca974512fe..0b67ea1d67 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -71,7 +71,7 @@ "postgres": "3.4.7", "prettier": "^3.5.3", "semver": "^7.5.4", - "tsx": "^4.19.1", + "tsx": "^4.21.0", "url-pattern": "^1.0.3", "urlpattern-polyfill": "^10.1.0", "ws": "^8.18.1" From 5c6f3ed203cbc698d677b272018b2615393cd0ea Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Tue, 17 Feb 2026 14:55:46 -0700 Subject: [PATCH 077/495] chore(zero-cache): include current owner in storer serialization failure AbortError (#5577) --- .../change-streamer/storer.pg.test.ts | 50 +++++++++++++++++++ .../src/services/change-streamer/storer.ts | 13 ++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 2ad8c495b7..d2d255223c 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -815,6 +815,56 @@ describe('change-streamer/storer', () => { ]); }); + test('ownership change detected at begin aborts transaction', async () => { + // Change ownership before storing begin — the storer's pipelined + // SELECT will read the new owner immediately. + await db`UPDATE "xero_5/cdc"."replicationState" SET owner = 'other-task'`; + + storer.store([ + '07', + ['begin', messages.begin(), {commitWatermark: '08'}], + ]); + storer.store(['07', ['data', messages.insert('issues', {id: 'foo'})]]); + storer.store(['08', ['commit', messages.commit(), {watermark: '08'}]]); + + await expect(done).rejects.toThrow( + 'changeLog ownership has been assumed by other-task', + ); + // Prevent the beforeEach cleanup from re-throwing the rejected done. + done = Promise.resolve(); + }); + + test('ownership change during transaction includes new owner in error', async () => { + // Start a transaction — this begins a SERIALIZABLE tx that + // reads replicationState (owner = 'task-id'). + storer.store([ + '07', + ['begin', messages.begin(), {commitWatermark: '08'}], + ]); + storer.store(['07', ['data', messages.insert('issues', {id: 'foo'})]]); + + // Wait for the storer to process 'begin' and start the SERIALIZABLE tx. + // The pipelined SELECT of replicationState should have executed by now. + await sleep(100); + + // Change ownership externally — this commits immediately on a separate + // connection, modifying the replicationState row that the storer's + // SERIALIZABLE tx has already read. + await db`UPDATE "xero_5/cdc"."replicationState" SET owner = 'new-owner-task'`; + + // Now send commit. The storer's initial read shows owner = 'task-id' + // (matching), so it proceeds to UPDATE lastWatermark. But Postgres + // detects the serialization conflict and throws PG_SERIALIZATION_FAILURE. + storer.store(['08', ['commit', messages.commit(), {watermark: '08'}]]); + + // The AbortError should include the new owner read from a fresh query. + await expect(done).rejects.toThrow( + 'changeLog ownership was concurrently assumed by new-owner-task (serialization failure)', + ); + // Prevent the beforeEach cleanup from re-throwing the rejected done. + done = Promise.resolve(); + }); + test('abort', async () => { storer.store([ '0b', diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index d401394252..29e5750123 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -454,7 +454,18 @@ export class Storer implements Service { e.code === PG_SERIALIZATION_FAILURE ) { // Ownership change happened after the replicationState was read in 'begin'. - throw new AbortError(`changeLog ownership has changed`, {cause: e}); + let ownerInfo: string; + try { + const [{owner}] = await this.#db` + SELECT * FROM ${this.#cdc('replicationState')}`; + ownerInfo = `ownership was concurrently assumed by ${owner}`; + } catch { + ownerInfo = `ownership was concurrently changed (failed to read current owner)`; + } + throw new AbortError( + `changeLog ${ownerInfo} (serialization failure)`, + {cause: e}, + ); } throw e; } From 746bb50e6602b213c5587be024e4d8cce2382691 Mon Sep 17 00:00:00 2001 From: jbingen Date: Wed, 18 Feb 2026 16:38:58 +0100 Subject: [PATCH 078/495] fix(replicache): downgrade IDBNotFoundError to info log level (#5562) `IDBNotFoundError` is explicitly documented as non-fatal: > This likely means that the user deleted IndexedDB instances while the app was running. This is non-fatal. The app will continue running in memory until reload. but `bg-interval.ts` catches it with `lc.error` which floods error monitoring (Sentry) in downstream apps. especially common in Electron apps where IndexedDB can be cleared during sleep/wake cycles. checks for `IDBNotFoundError` before the generic error log and uses `lc.info` instead, matching the non-fatal nature described in the error message itself. ## test plan - added test verifying `IDBNotFoundError` is logged at info level - existing tests pass (18/18 across chromium, webkit, firefox) --------- Co-authored-by: Chase Adams Co-authored-by: Chase Adams --- packages/replicache/src/bg-interval.test.ts | 25 +++++++++++++++++++ packages/replicache/src/bg-interval.ts | 3 +++ .../replicache/src/persist/heartbeat.test.ts | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/replicache/src/bg-interval.test.ts b/packages/replicache/src/bg-interval.test.ts index 08528b1c14..dfbf50c4ec 100644 --- a/packages/replicache/src/bg-interval.test.ts +++ b/packages/replicache/src/bg-interval.test.ts @@ -3,6 +3,7 @@ import {resolver} from '@rocicorp/resolver'; import {afterEach, beforeEach, expect, test, vi} from 'vitest'; import {TestLogSink} from '../../shared/src/logging-test-utils.ts'; import {initBgIntervalProcess} from './bg-interval.ts'; +import {IDBNotFoundError} from './kv/idb-store.ts'; beforeEach(() => { vi.useFakeTimers(); @@ -122,6 +123,30 @@ test('error thrown during process (before stop is called) is logged to error', a ); }); +test('IDBNotFoundError thrown during process is logged to info, not error', async () => { + const testLogSink = new TestLogSink(); + const lc = new LogContext('info', undefined, testLogSink); + const idbError = new IDBNotFoundError('test db missing'); + const process = () => Promise.reject(idbError); + const controller = new AbortController(); + initBgIntervalProcess( + 'testProcess', + process, + () => 100, + lc, + controller.signal, + ); + await vi.advanceTimersByTimeAsync(100); + controller.abort(); + expect(testLogSink.messages).toEqual([ + [ + 'info', + {bgIntervalProcess: 'testProcess'}, + ['IndexedDB was deleted externally.', idbError], + ], + ]); +}); + test('error thrown during process (after stop is called) is logged to debug', async () => { const testLogSink = new TestLogSink(); const lc = new LogContext('debug', undefined, testLogSink); diff --git a/packages/replicache/src/bg-interval.ts b/packages/replicache/src/bg-interval.ts index 418fd0e83c..1ed16664a2 100644 --- a/packages/replicache/src/bg-interval.ts +++ b/packages/replicache/src/bg-interval.ts @@ -1,6 +1,7 @@ import type {LogContext} from '@rocicorp/logger'; import {AbortError} from '../../shared/src/abort-error.ts'; import {sleep} from '../../shared/src/sleep.ts'; +import {IDBNotFoundError} from './kv/idb-store.ts'; export function initBgIntervalProcess( processName: string, @@ -39,6 +40,8 @@ async function runBgIntervalProcess( } catch (e) { if (signal.aborted) { lc.debug?.('Error running most likely due to close.', e); + } else if (e instanceof IDBNotFoundError) { + lc.info?.('IndexedDB was deleted externally.', e); } else { lc.error?.('Error running.', e); } diff --git a/packages/replicache/src/persist/heartbeat.test.ts b/packages/replicache/src/persist/heartbeat.test.ts index 5e5ff7f94e..6bdb4bf705 100644 --- a/packages/replicache/src/persist/heartbeat.test.ts +++ b/packages/replicache/src/persist/heartbeat.test.ts @@ -269,7 +269,7 @@ test('heartbeat with dropped idb throws', async () => { dagStore, onClientStateNotFound, HEARTBEAT_INTERVAL, - new LogContext('error', undefined, testLogSink), + new LogContext('info', undefined, testLogSink), controller.signal, ); From 37926bd7b8f226e07fb224005da6dc2605dd9319 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 18 Feb 2026 17:09:53 +0100 Subject: [PATCH 079/495] chore(zero-cache): Batch CVR updates to queries (#5581) This is #5575 without the tracers --- .../src/services/view-syncer/cvr-store.ts | 569 +++++++++++++----- .../src/services/view-syncer/cvr.pg.test.ts | 6 +- .../services/view-syncer/row-record-cache.ts | 6 +- 3 files changed, 411 insertions(+), 170 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/cvr-store.ts b/packages/zero-cache/src/services/view-syncer/cvr-store.ts index 819be995b2..ad77cd4fdd 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr-store.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr-store.ts @@ -1,6 +1,6 @@ import {trace} from '@opentelemetry/api'; import type {LogContext} from '@rocicorp/logger'; -import type {MaybeRow, PendingQuery} from 'postgres'; +import type {MaybeRow, PendingQuery, Row} from 'postgres'; import {startAsyncSpan} from '../../../../otel/src/span.ts'; import {version} from '../../../../otel/src/version.ts'; import {assert} from '../../../../shared/src/asserts.ts'; @@ -70,8 +70,42 @@ export type CVRFlushStats = { let flushCounter = 0; +/** + * Convert TTL/timestamp values for both old (seconds-based) and new (ms-based) columns. + * Old columns: inactivatedAt (TIMESTAMPTZ), ttl (INTERVAL) - need conversion ms->seconds + * New columns: inactivatedAtMs (DOUBLE PRECISION), ttlMs (DOUBLE PRECISION) - store ms directly + */ +function convertTTLValues( + inactivatedAt: TTLClock | undefined, + ttl: number, +): { + ttlInterval: number | null; + ttlMs: number | null; + inactivatedAtTimestamp: TTLClock | null; + inactivatedAtMs: TTLClock | null; +} { + return { + ttlInterval: ttl < 0 ? null : ttl / 1000, // INTERVAL needs seconds + ttlMs: ttl < 0 ? null : ttl, // New column stores ms directly + inactivatedAtTimestamp: + inactivatedAt === undefined + ? null + : ttlClockFromNumber(ttlClockAsNumber(inactivatedAt) / 1000), + inactivatedAtMs: inactivatedAt ?? null, + }; +} + const tracer = trace.getTracer('cvr-store', version); +/** + * QueriesRow with queryArgs as a stringified JSON value. + * Used for batched config writes where queryArgs are pre-stringified + * to handle the postgres.js boolean array bug. + */ +type StringifiedQueriesRow = Omit & { + queryArgs: string | null; +}; + function asQuery(row: QueriesRow): QueryRecord { const maybeVersion = (s: string | null) => s === null ? undefined : versionFromString(s); @@ -137,6 +171,15 @@ export class CVRStore { lastConnectTime: number, ) => PendingQuery; }> = new Set(); + // Stored separately so repeated putInstance() calls (e.g. setClientSchema, + // setProfileID, and the final call in #flush) replace each other rather than + // accumulating as independent statements in #writes. + #pendingInstanceWrite: + | (( + tx: PostgresTransaction, + lastConnectTime: number, + ) => PendingQuery) + | undefined = undefined; readonly #pendingRowRecordUpdates = new CustomKeyMap( rowIDString, ); @@ -145,6 +188,9 @@ export class CVRStore { readonly #loadAttemptIntervalMs: number; readonly #maxLoadAttempts: number; #rowCount: number = 0; + readonly #pendingQueryUpdates = new Map(); + readonly #pendingDesireUpdates = new Map(); + readonly #pendingQueryPartialUpdates = new Map>(); constructor( lc: LogContext, @@ -180,6 +226,11 @@ export class CVRStore { return this.#db(`${this.#schema}.${table}`); } + #updateQueryFields(queryHash: string, fields: Partial): void { + // Track as partial-only update for batched flush + this.#pendingQueryPartialUpdates.set(queryHash, fields); + } + load(lc: LogContext, lastConnectTime: number): Promise { return startAsyncSpan(tracer, 'cvr.load', async () => { let err: RowsVersionBehindError | undefined; @@ -474,95 +525,54 @@ export class CVRStore { | 'profileID' | 'ttlClock' >): void { - this.#writes.add({ - stats: {instances: 1}, - write: (tx, lastConnectTime) => { - const change: InstancesRow = { - clientGroupID: this.#id, - version: versionString(version), - lastActive, - ttlClock, - replicaVersion, - owner: this.#taskID, - grantedAt: lastConnectTime, - clientSchema, - profileID, - }; - return tx` + // Overwrite any previously queued instance write — only the last call + // matters since they all target the same row. + this.#pendingInstanceWrite = (tx, lastConnectTime) => { + const change: InstancesRow = { + clientGroupID: this.#id, + version: versionString(version), + lastActive, + ttlClock, + replicaVersion, + owner: this.#taskID, + grantedAt: lastConnectTime, + clientSchema, + profileID, + }; + return tx` INSERT INTO ${this.#cvr('instances')} ${tx(change)} ON CONFLICT ("clientGroupID") DO UPDATE SET ${tx(change)}`; - }, - }); + }; } markQueryAsDeleted(version: CVRVersion, queryPatch: QueryPatch): void { - this.#writes.add({ - stats: {queries: 1}, - write: tx => tx`UPDATE ${this.#cvr('queries')} SET ${tx({ - patchVersion: versionString(version), - deleted: true, - transformationHash: null, - transformationVersion: null, - })} - WHERE "clientGroupID" = ${this.#id} AND "queryHash" = ${queryPatch.id}`, + this.#updateQueryFields(queryPatch.id, { + patchVersion: versionString(version), + deleted: true, + transformationHash: null, + transformationVersion: null, }); } putQuery(query: QueryRecord): void { - const change: QueriesRow = queryRecordToQueryRow(this.#id, query); - // ${JSON.stringify(change.queryArgs)}::text::json is used because postgres.js - // gets confused if the input is `[boolean]` and throws an error saying a bool - // cannot be converted to json. - // https://github.com/porsager/postgres/issues/386 - this.#writes.add({ - stats: {queries: 1}, - write: tx => tx`INSERT INTO ${this.#cvr('queries')} ( - "clientGroupID", - "queryHash", - "clientAST", - "queryName", - "queryArgs", - "patchVersion", - "transformationHash", - "transformationVersion", - "internal", - "deleted" - ) VALUES ( - ${change.clientGroupID}, - ${change.queryHash}, - ${change.clientAST}, - ${change.queryName}, - ${change.queryArgs === undefined ? null : JSON.stringify(change.queryArgs)}::text::json, - ${change.patchVersion}, - ${change.transformationHash ?? null}, - ${change.transformationVersion ?? null}, - ${change.internal}, - ${change.deleted ?? false} - ) - ON CONFLICT ("clientGroupID", "queryHash") - DO UPDATE SET - "clientAST" = ${change.clientAST}, - "queryName" = ${change.queryName}, - "queryArgs" = ${change.queryArgs === undefined ? null : JSON.stringify(change.queryArgs)}::text::json, - "patchVersion" = ${change.patchVersion}, - "transformationHash" = ${change.transformationHash ?? null}, - "transformationVersion" = ${change.transformationVersion ?? null}, - "internal" = ${change.internal}, - "deleted" = ${change.deleted ?? false}`, - }); + const change = queryRecordToQueryRow(this.#id, query); + + const c = { + ...change, + // Pre-stringify queryArgs to handle postgres.js boolean array bug + queryArgs: + change.queryArgs !== null ? JSON.stringify(change.queryArgs) : null, + transformationHash: change.transformationHash ?? null, + transformationVersion: change.transformationVersion ?? null, + deleted: change.deleted ?? false, + }; + this.#pendingQueryUpdates.set(query.id, c); } updateQuery(query: QueryRecord) { const maybeVersionString = (v: CVRVersion | undefined) => v ? versionString(v) : null; - - const change: Pick< - QueriesRow, - | 'patchVersion' - | 'transformationHash' - | 'transformationVersion' - | 'deleted' - > = { + this.#updateQueryFields(query.id, { patchVersion: query.type === 'internal' ? null @@ -570,12 +580,6 @@ export class CVRStore { transformationHash: query.transformationHash ?? null, transformationVersion: maybeVersionString(query.transformationVersion), deleted: false, - }; - - this.#writes.add({ - stats: {queries: 1}, - write: tx => tx`UPDATE ${this.#cvr('queries')} SET ${tx(change)} - WHERE "clientGroupID" = ${this.#id} AND "queryHash" = ${query.id}`, }); } @@ -609,50 +613,21 @@ export class CVRStore { inactivatedAt: TTLClock | undefined, ttl: number, ): void { + const {ttlMs, inactivatedAtMs} = convertTTLValues(inactivatedAt, ttl); + const change: DesiresRow = { clientGroupID: this.#id, clientID: client.id, deleted, - inactivatedAt: inactivatedAt ?? null, + inactivatedAt: inactivatedAtMs, patchVersion: versionString(newVersion), queryHash: query.id, - - // ttl is in ms in JavaScript - ttl: ttl < 0 ? null : ttl, + ttl: ttlMs, }; - // For backward compatibility during rollout, write to both old and new columns: - // Old columns: inactivatedAt (TIMESTAMPTZ), ttl (INTERVAL) - need conversion ms->seconds - // New columns: inactivatedAtMs (DOUBLE PRECISION), ttlMs (DOUBLE PRECISION) - store ms directly (1:1 with JS) - const inactivatedAtTimestamp = - inactivatedAt === undefined - ? null - : ttlClockFromNumber(ttlClockAsNumber(inactivatedAt) / 1000); - const inactivatedAtMs = inactivatedAt ?? null; - const ttlInterval = ttl < 0 ? null : ttl / 1000; // INTERVAL needs seconds - const ttlMs = ttl < 0 ? null : ttl; // New column stores ms directly - - this.#writes.add({ - stats: {desires: 1}, - write: tx => tx` - INSERT INTO ${this.#cvr('desires')} ( - "clientGroupID", "clientID", "queryHash", "patchVersion", "deleted", - "ttl", "ttlMs", "inactivatedAt", "inactivatedAtMs" - ) VALUES ( - ${change.clientGroupID}, ${change.clientID}, ${change.queryHash}, - ${change.patchVersion}, ${change.deleted}, ${ttlInterval}, ${ttlMs}, - ${inactivatedAtTimestamp}, ${inactivatedAtMs} - ) - ON CONFLICT ("clientGroupID", "clientID", "queryHash") - DO UPDATE SET - "patchVersion" = ${change.patchVersion}, - "deleted" = ${change.deleted}, - "ttl" = ${ttlInterval}, - "ttlMs" = ${ttlMs}, - "inactivatedAt" = ${inactivatedAtTimestamp}, - "inactivatedAtMs" = ${inactivatedAtMs} - `, - }); + // Use composite key to deduplicate/replace entries for the same client-query pair + const key = `${client.id}:${query.id}`; + this.#pendingDesireUpdates.set(key, change); } catchupRowPatches( @@ -735,6 +710,215 @@ export class CVRStore { } } + #flushQueries( + tx: PostgresTransaction, + lc: LogContext, + ): PendingQuery[] { + // Merge partial updates into full updates + const partialOnly = new Map>(); + for (const [queryHash, partial] of this.#pendingQueryPartialUpdates) { + const existing = this.#pendingQueryUpdates.get(queryHash); + if (existing) { + // Merge partial into full update + Object.assign(existing, partial); + } else { + // Track partial-only updates to batch separately + partialOnly.set(queryHash, partial); + } + } + + const queries: PendingQuery[] = []; + + // Batch full updates + if (this.#pendingQueryUpdates.size > 0) { + const rows = [...this.#pendingQueryUpdates.values()]; + lc.debug?.(`Batch flushing ${rows.length} full query updates`); + + queries.push(tx` + INSERT INTO ${this.#cvr('queries')} ( + "clientGroupID", + "queryHash", + "clientAST", + "queryName", + "queryArgs", + "patchVersion", + "transformationHash", + "transformationVersion", + "internal", + "deleted" + ) + SELECT + "clientGroupID", + "queryHash", + "clientAST", + "queryName", + CASE + WHEN "queryArgs" IS NULL THEN NULL + ELSE "queryArgs"::json + END, + "patchVersion", + "transformationHash", + "transformationVersion", + "internal", + "deleted" + FROM json_to_recordset(${rows}) AS x( + "clientGroupID" TEXT, + "queryHash" TEXT, + "clientAST" JSONB, + "queryName" TEXT, + "queryArgs" TEXT, + "patchVersion" TEXT, + "transformationHash" TEXT, + "transformationVersion" TEXT, + "internal" BOOLEAN, + "deleted" BOOLEAN + ) + ON CONFLICT ("clientGroupID", "queryHash") DO UPDATE SET + "clientAST" = excluded."clientAST", + "queryName" = excluded."queryName", + "queryArgs" = CASE + WHEN excluded."queryArgs" IS NULL THEN NULL + ELSE excluded."queryArgs"::json + END, + "patchVersion" = excluded."patchVersion", + "transformationHash" = excluded."transformationHash", + "transformationVersion" = excluded."transformationVersion", + "internal" = excluded."internal", + "deleted" = excluded."deleted" + `); + } + + // Batch partial-only updates + if (partialOnly.size > 0) { + lc.debug?.(`Batch flushing ${partialOnly.size} partial query updates`); + const rows = Array.from( + partialOnly.entries(), + ([queryHash, partial]) => ({ + clientGroupID: this.#id, + queryHash, + patchVersionSet: partial.patchVersion !== undefined, + patchVersion: partial.patchVersion ?? null, + deletedSet: partial.deleted !== undefined, + deleted: partial.deleted ?? null, + transformationHashSet: partial.transformationHash !== undefined, + transformationHash: partial.transformationHash ?? null, + transformationVersionSet: partial.transformationVersion !== undefined, + transformationVersion: partial.transformationVersion ?? null, + }), + ); + queries.push(tx` + UPDATE ${this.#cvr('queries')} AS q + SET + "patchVersion" = CASE + WHEN u."patchVersionSet" THEN u."patchVersion" + ELSE q."patchVersion" + END, + "deleted" = CASE + WHEN u."deletedSet" THEN u."deleted" + ELSE q."deleted" + END, + "transformationHash" = CASE + WHEN u."transformationHashSet" THEN u."transformationHash" + ELSE q."transformationHash" + END, + "transformationVersion" = CASE + WHEN u."transformationVersionSet" THEN u."transformationVersion" + ELSE q."transformationVersion" + END + FROM json_to_recordset(${rows}) AS u( + "clientGroupID" TEXT, + "queryHash" TEXT, + "patchVersionSet" BOOLEAN, + "patchVersion" TEXT, + "deletedSet" BOOLEAN, + "deleted" BOOLEAN, + "transformationHashSet" BOOLEAN, + "transformationHash" TEXT, + "transformationVersionSet" BOOLEAN, + "transformationVersion" TEXT + ) + WHERE q."clientGroupID" = u."clientGroupID" + AND q."queryHash" = u."queryHash" + `); + } + + return queries; + } + + #flushDesires( + tx: PostgresTransaction, + lc: LogContext, + ): PendingQuery | null { + if (this.#pendingDesireUpdates.size === 0) { + return null; + } + + const rows = Array.from(this.#pendingDesireUpdates.values(), row => { + const {ttlInterval, ttlMs, inactivatedAtTimestamp, inactivatedAtMs} = + convertTTLValues(row.inactivatedAt ?? undefined, row.ttl ?? -1); + return { + clientGroupID: row.clientGroupID, + clientID: row.clientID, + queryHash: row.queryHash, + patchVersion: row.patchVersion, + deleted: row.deleted, + ttl: ttlInterval, + ttlMs, + inactivatedAt: inactivatedAtTimestamp, + inactivatedAtMs, + }; + }); + + lc.debug?.(`Batch flushing ${rows.length} desire updates`); + + return tx` + INSERT INTO ${this.#cvr('desires')} ( + "clientGroupID", + "clientID", + "queryHash", + "patchVersion", + "deleted", + "ttl", + "ttlMs", + "inactivatedAt", + "inactivatedAtMs" + ) + SELECT + "clientGroupID", + "clientID", + "queryHash", + "patchVersion", + "deleted", + "ttl", + "ttlMs", + CASE + WHEN "inactivatedAt" IS NULL THEN NULL + -- Divide by 1000 because postgres.js serializeTimestamp treats numbers as ms + -- and to_timestamp expects seconds. This matches non-batched behavior. + ELSE to_timestamp("inactivatedAt" / 1000.0) + END, + "inactivatedAtMs" + FROM json_to_recordset(${rows}) AS x( + "clientGroupID" TEXT, + "clientID" TEXT, + "queryHash" TEXT, + "patchVersion" TEXT, + "deleted" BOOLEAN, + "ttl" INTERVAL, + "ttlMs" DOUBLE PRECISION, + "inactivatedAt" DOUBLE PRECISION, + "inactivatedAtMs" DOUBLE PRECISION + ) + ON CONFLICT ("clientGroupID", "clientID", "queryHash") DO UPDATE SET + "patchVersion" = excluded."patchVersion", + "deleted" = excluded."deleted", + "ttl" = excluded."ttl", + "ttlMs" = excluded."ttlMs", + "inactivatedAt" = excluded."inactivatedAt", + "inactivatedAtMs" = excluded."inactivatedAtMs" + `; + } + async #checkVersionAndOwnership( lc: LogContext, tx: PostgresTransaction, @@ -743,12 +927,12 @@ export class CVRStore { ): Promise { const start = Date.now(); lc.debug?.('checking cvr version and ownership'); - const expected = versionString(expectedCurrentVersion); const result = await tx< Pick[] >`SELECT "version", "owner", "grantedAt" FROM ${this.#cvr('instances')} WHERE "clientGroupID" = ${this.#id} - FOR UPDATE`.execute(); // Note: execute() immediately to send the query before others. + FOR UPDATE`; + const expected = versionString(expectedCurrentVersion); const {version, owner, grantedAt} = result.length > 0 ? result[0] @@ -804,7 +988,14 @@ export class CVRStore { } } } - if (this.#pendingRowRecordUpdates.size === 0 && this.#writes.size === 0) { + if ( + this.#pendingRowRecordUpdates.size === 0 && + this.#writes.size === 0 && + this.#pendingInstanceWrite === undefined && + this.#pendingQueryUpdates.size === 0 && + this.#pendingQueryPartialUpdates.size === 0 && + this.#pendingDesireUpdates.size === 0 + ) { return null; } // Note: The CVR instance itself is only updated if there are material @@ -812,44 +1003,65 @@ export class CVRStore { this.putInstance(cvr); const start = Date.now(); lc.debug?.('flush tx beginning'); - const rowsFlushed = await this.#db.begin(Mode.READ_COMMITTED, async tx => { + + // Use an async callback so we can await the version/ownership check and + // validate it INSIDE the transaction. If validation fails, the exception + // causes postgres.js to ROLLBACK, ensuring no writes are committed on error. + const results = await this.#db.begin(Mode.READ_COMMITTED, async tx => { lc.debug?.(`flush tx begun after ${Date.now() - start} ms`); - const pipelined: Promise[] = [ - // #checkVersionAndOwnership() executes a `SELECT ... FOR UPDATE` - // query to acquire a row-level lock so that version-updating - // transactions are effectively serialized per cvr.instance. - // - // Note that `rowsVersion` updates, on the other hand, are not subject - // to this lock and can thus commit / be-committed independently of - // cvr.instances. - this.#checkVersionAndOwnership( - lc, - tx, - expectedCurrentVersion, - lastConnectTime, - ), - ]; - let i = 0; + // Acquire row-level lock and validate version/ownership before queuing writes. + // Throwing here (inside the begin callback) rolls back the transaction so that + // no writes are committed when concurrent modification or ownership errors occur. + await this.#checkVersionAndOwnership( + lc, + tx, + expectedCurrentVersion, + lastConnectTime, + ); + + const writeQueries = []; + if (this.#pendingInstanceWrite) { + writeQueries.push(this.#pendingInstanceWrite(tx, lastConnectTime)); + stats.instances++; + stats.statements++; + } for (const write of this.#writes) { - stats.instances += write.stats.instances ?? 0; - stats.queries += write.stats.queries ?? 0; - stats.desires += write.stats.desires ?? 0; stats.clients += write.stats.clients ?? 0; stats.rows += write.stats.rows ?? 0; - const writeIndex = i++; - const writeStart = Date.now(); - pipelined.push( - write - .write(tx, lastConnectTime) - .execute() - .then(() => { - lc.debug?.( - `write ${writeIndex}/${this.#writes.size} completed in ${Date.now() - writeStart} ms`, - ); - }), - ); + writeQueries.push(write.write(tx, lastConnectTime)); + stats.statements++; + } + + // Batch flush config writes + // Flush queries first (desires depend on queries via foreign key) + const hasQueryUpdates = + this.#pendingQueryUpdates.size > 0 || + this.#pendingQueryPartialUpdates.size > 0; + + const desireFlush = this.#flushDesires(tx, lc); + + let queryFlushes: PendingQuery[] = []; + if (hasQueryUpdates) { + queryFlushes = this.#flushQueries(tx, lc); + + // Count both full updates and partial-only updates + const partialOnlyCount = Array.from( + this.#pendingQueryPartialUpdates.keys(), + ).filter(key => !this.#pendingQueryUpdates.has(key)).length; + + stats.queries = this.#pendingQueryUpdates.size + partialOnlyCount; + stats.statements += + (this.#pendingQueryUpdates.size > 0 ? 1 : 0) + + (partialOnlyCount > 0 ? 1 : 0); + + if (desireFlush) { + stats.desires = this.#pendingDesireUpdates.size; + stats.statements++; + } + } else if (desireFlush) { + stats.desires = this.#pendingDesireUpdates.size; stats.statements++; } @@ -860,22 +1072,47 @@ export class CVRStore { 'allow-defer', lc, ); - pipelined.push(...rowUpdates); stats.statements += rowUpdates.length; - // Make sure Errors thrown by pipelined statements - // are propagated up the stack. - await Promise.all(pipelined); - lc.debug?.(`flush tx returning after ${Date.now() - start} ms`); - if (rowUpdates.length === 0) { - stats.rowsDeferred = this.#pendingRowRecordUpdates.size; - return false; - } - stats.rows += this.#pendingRowRecordUpdates.size; + // Pipeline writes now that the version check has passed. + const pipelined = [ + ...writeQueries, + ...queryFlushes, + ...(desireFlush ? [desireFlush] : []), + ...rowUpdates, + ]; - return true; + lc.debug?.(`returning ${pipelined.length} queries for pipelining`); + + // Explicitly await all pipelined queries. When the begin callback is async, + // postgres.js does not call Promise.all() on the return value the way it does + // for sync callbacks, so we must do it ourselves. + return Promise.all(pipelined); }); + lc.debug?.(`flush tx completed after ${Date.now() - start} ms`); + + // Calculate how many row update queries were in the pipeline. + // Note: the version check was awaited separately and is not in the results array. + const baseQueries = + (this.#pendingInstanceWrite ? 1 : 0) + + this.#writes.size + + (this.#pendingQueryUpdates.size > 0 ? 1 : 0) + + (Array.from(this.#pendingQueryPartialUpdates.keys()).filter( + key => !this.#pendingQueryUpdates.has(key), + ).length > 0 + ? 1 + : 0) + + (this.#pendingDesireUpdates.size > 0 ? 1 : 0); + const rowUpdateCount = results.length - baseQueries; + + const rowsFlushed = rowUpdateCount > 0; + if (!rowsFlushed) { + stats.rowsDeferred = this.#pendingRowRecordUpdates.size; + } else { + stats.rows += this.#pendingRowRecordUpdates.size; + } + this.#rowCount = await this.#rowCache.apply( this.#pendingRowRecordUpdates, cvr.version, @@ -920,8 +1157,12 @@ export class CVRStore { throw e; } finally { this.#writes.clear(); + this.#pendingInstanceWrite = undefined; this.#pendingRowRecordUpdates.clear(); this.#forceUpdates.clear(); + this.#pendingQueryUpdates.clear(); + this.#pendingDesireUpdates.clear(); + this.#pendingQueryPartialUpdates.clear(); } } diff --git a/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts b/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts index 6b166e8c80..0149f06775 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr.pg.test.ts @@ -1172,10 +1172,10 @@ describe('view-syncer/cvr', () => { "clients": 2, "desires": 8, "instances": 1, - "queries": 10, + "queries": 6, "rows": 0, "rowsDeferred": 0, - "statements": 22, + "statements": 6, } `); expect(updated).toEqual({ @@ -3013,7 +3013,7 @@ describe('view-syncer/cvr', () => { "queries": 2, "rows": 2, "rowsDeferred": 0, - "statements": 5, + "statements": 4, } `); diff --git a/packages/zero-cache/src/services/view-syncer/row-record-cache.ts b/packages/zero-cache/src/services/view-syncer/row-record-cache.ts index b941fa327d..f8315d77f4 100644 --- a/packages/zero-cache/src/services/view-syncer/row-record-cache.ts +++ b/packages/zero-cache/src/services/view-syncer/row-record-cache.ts @@ -382,7 +382,7 @@ export class RowRecordCache { const pending: PendingQuery[] = [ tx`INSERT INTO ${this.#cvr('rowsVersion')} ${tx(rowsVersion)} ON CONFLICT ("clientGroupID") - DO UPDATE SET ${tx(rowsVersion)}`.execute(), + DO UPDATE SET ${tx(rowsVersion)}`, ]; const rowRecordRows: RowsRow[] = []; @@ -395,7 +395,7 @@ export class RowRecordCache { AND "schema" = ${id.schema} AND "table" = ${id.table} AND "rowKey" = ${id.rowKey} - `.execute(), + `, ); } else { rowRecordRows.push(rowRecordToRowsRow(this.#cvrID, row)); @@ -420,7 +420,7 @@ export class RowRecordCache { DO UPDATE SET "rowVersion" = excluded."rowVersion", "patchVersion" = excluded."patchVersion", "refCounts" = excluded."refCounts" - `.execute(), + `, ); lc.debug?.( `flushing ${rowUpdates.size} rows (${rowRecordRows.length} inserts, ${ From 5ef10996488dd7ed4ada0d7f1c1337b81134567d Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Wed, 18 Feb 2026 11:06:06 -0700 Subject: [PATCH 080/495] feat(zero-cache): monitor scalar subquery values with live companion pipelines (#5578) Keep companion IVM inputs alive after resolving scalar subqueries so they can reactively detect when the resolved value changes during advance(). When a companion detects a value change (edit or delete), it throws ResetPipelinesSignal to trigger a full pipeline re-resolution. Companions are properly destroyed in reset() and removeQuery(). --------- Co-authored-by: Matt Wonlaw Co-authored-by: Claude Opus 4.6 --- .../view-syncer/pipeline-driver.test.ts | 112 ++++++++++++++++++ .../services/view-syncer/pipeline-driver.ts | 109 ++++++++++++++--- .../zqlite/src/resolve-scalar-subqueries.ts | 11 +- 3 files changed, 215 insertions(+), 17 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts index 1751470fa7..a1eb678ae7 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts @@ -2030,4 +2030,116 @@ describe('view-syncer/pipeline-driver', () => { ] `); }); + + test('companion pipeline throws ResetPipelinesSignal when scalar value changes', () => { + pipelines.init(clientSchema); + + // Resolves comment '10' (issueID='1'), so query becomes `issues WHERE id = '1'` + [ + ...pipelines.addQuery( + 'hash-scalar', + 'queryScalar', + ISSUES_WITH_SCALAR_SUBQUERY, + startTimer(), + ), + ]; + + // Change comment '10' issueID from '1' to '2' — the scalar value changes + replicator.processTransaction( + '134', + messages.update('comments', {id: '10', issueID: '2', upvotes: 0}), + ); + + expect(() => changes()).toThrowError(ResetPipelinesSignal); + }); + + test('companion pipeline does not throw when scalar value stays same', () => { + pipelines.init(clientSchema); + + // Resolves comment '10' (issueID='1'), so query becomes `issues WHERE id = '1'` + [ + ...pipelines.addQuery( + 'hash-scalar', + 'queryScalar', + ISSUES_WITH_SCALAR_SUBQUERY, + startTimer(), + ), + ]; + + // Change a different column (upvotes) on comment '10' — issueID stays '1' + replicator.processTransaction( + '134', + messages.update('comments', {id: '10', issueID: '1', upvotes: 5}), + ); + + // No ResetPipelinesSignal, and the companion row change is synced + expect(changes()).toMatchInlineSnapshot(` + [ + { + "queryID": "queryScalar", + "row": { + "_0_version": "134", + "id": "10", + "issueID": "1", + "upvotes": 5, + }, + "rowKey": { + "id": "10", + }, + "table": "comments", + "type": "edit", + }, + ] + `); + }); + + test('companion pipeline throws ResetPipelinesSignal when companion row deleted', () => { + pipelines.init(clientSchema); + + // Resolves comment '10' (issueID='1'), so query becomes `issues WHERE id = '1'` + [ + ...pipelines.addQuery( + 'hash-scalar', + 'queryScalar', + ISSUES_WITH_SCALAR_SUBQUERY, + startTimer(), + ), + ]; + + // Delete comment '10' — the scalar value goes from '1' to undefined (no row) + replicator.processTransaction( + '134', + messages.delete('comments', {id: '10'}), + ); + + expect(() => changes()).toThrowError(ResetPipelinesSignal); + }); + + test('companion pipeline throws ResetPipelinesSignal when companion row added', () => { + pipelines.init(clientSchema); + + replicator.processTransaction( + '134', + messages.delete('comments', {id: '10'}), + ); + + changes(); + + [ + ...pipelines.addQuery( + 'hash-scalar', + 'queryScalar', + ISSUES_WITH_SCALAR_SUBQUERY, + startTimer(), + ), + ]; + + // Insert comment '10' — the scalar value goes from undefined to '1' + replicator.processTransaction( + '135', + messages.insert('comments', {id: '10', issueID: '1', upvotes: 0}), + ); + + expect(() => changes()).toThrowError(ResetPipelinesSignal); + }); }); diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 6307912973..1f1aacbf0b 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -29,7 +29,10 @@ import type {ConnectionCostModel} from '../../../../zql/src/planner/planner-conn import {MeasurePushOperator} from '../../../../zql/src/query/measure-push-operator.ts'; import type {ClientGroupStorage} from '../../../../zqlite/src/database-storage.ts'; import type {Database} from '../../../../zqlite/src/db.ts'; -import {resolveSimpleScalarSubqueries} from '../../../../zqlite/src/resolve-scalar-subqueries.ts'; +import { + resolveSimpleScalarSubqueries, + type CompanionSubquery, +} from '../../../../zqlite/src/resolve-scalar-subqueries.ts'; import {createSQLiteCostModel} from '../../../../zqlite/src/sqlite-cost-model.ts'; import {TableSource} from '../../../../zqlite/src/table-source.ts'; import { @@ -77,11 +80,18 @@ export type RowEdit = { export type RowChange = RowAdd | RowRemove | RowEdit; +type CompanionPipeline = { + readonly input: Input; + readonly childField: string; + readonly resolvedValue: LiteralValue | null | undefined; +}; + type Pipeline = { readonly input: Input; readonly hydrationTimeMs: number; readonly transformedAst: AST; readonly transformationHash: string; + readonly companions: readonly CompanionPipeline[]; }; type QueryInfo = { @@ -197,8 +207,11 @@ export class PipelineDriver { * as TableSources need to be recomputed. */ reset(clientSchema: ClientSchema) { - for (const {input} of this.#pipelines.values()) { - input.destroy(); + for (const pipeline of this.#pipelines.values()) { + pipeline.input.destroy(); + for (const companion of pipeline.companions) { + companion.input.destroy(); + } } this.#pipelines.clear(); this.#tables.clear(); @@ -317,8 +330,11 @@ export class PipelineDriver { #resolveScalarSubqueries(ast: AST): { ast: AST; companionRows: {table: string; row: Row}[]; + companions: CompanionSubquery[]; + companionInputs: Input[]; } { const companionRows: {table: string; row: Row}[] = []; + const companionInputs: Input[] = []; const executor = ( subqueryAST: AST, @@ -336,24 +352,24 @@ export class PipelineDriver { }, 'scalar-subquery', ); - try { - const node = first(skipYields(input.fetch({}))); - if (!node) { - return undefined; - } - companionRows.push({table: subqueryAST.table, row: node.row as Row}); - return (node.row[childField] as LiteralValue) ?? null; - } finally { - input.destroy(); + const node = first(skipYields(input.fetch({}))); + if (!node) { + // Keep the companion alive even with no results — it will + // detect a future insert that creates the row. + companionInputs.push(input); + return undefined; } + companionRows.push({table: subqueryAST.table, row: node.row as Row}); + companionInputs.push(input); + return (node.row[childField] as LiteralValue) ?? null; }; - const {ast: resolved} = resolveSimpleScalarSubqueries( + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( ast, this.#tableSpecs, executor, ); - return {ast: resolved, companionRows}; + return {ast: resolved, companionRows, companions, companionInputs}; } /** @@ -398,8 +414,12 @@ export class PipelineDriver { timer, }; try { - const {ast: resolvedQuery, companionRows} = - this.#resolveScalarSubqueries(query); + const { + ast: resolvedQuery, + companionRows, + companions: companionMeta, + companionInputs, + } = this.#resolveScalarSubqueries(query); const input = buildPipeline( resolvedQuery, @@ -467,6 +487,46 @@ export class PipelineDriver { } debugDelegate?.reset(); + // Set up live companion pipelines for reactive scalar subquery monitoring. + const liveCompanions: CompanionPipeline[] = []; + for (let i = 0; i < companionMeta.length; i++) { + const meta = companionMeta[i]; + const companionInput = companionInputs[i]; + const companionSchema = companionInput.getSchema(); + const {childField, resolvedValue} = meta; + companionInput.setOutput({ + push: (change: Change) => { + let newValue: LiteralValue | null | undefined; + switch (change.type) { + case 'add': + case 'edit': + newValue = + (change.node.row[childField] as LiteralValue) ?? null; + break; + case 'remove': + newValue = undefined; + break; + case 'child': + return []; + } + if (!scalarValuesEqual(newValue, resolvedValue)) { + throw new ResetPipelinesSignal( + `Scalar subquery value changed for ${meta.ast.table}: ` + + `${String(resolvedValue)} -> ${String(newValue)}`, + ); + } + const streamer = this.#streamer; + assert( + streamer, + 'must #startAccumulating() before pushing changes', + ); + streamer.accumulate(queryID, companionSchema, [change]); + return []; + }, + }); + liveCompanions.push({input: companionInput, childField, resolvedValue}); + } + // Note: This hydrationTime is a wall-clock overestimate, as it does // not take time slicing into account. The view-syncer resets this // to a more precise processing-time measurement with setHydrationTime(). @@ -475,6 +535,7 @@ export class PipelineDriver { hydrationTimeMs, transformedAst: resolvedQuery, transformationHash, + companions: liveCompanions, }); } finally { this.#hydrateContext = null; @@ -490,6 +551,9 @@ export class PipelineDriver { if (pipeline) { this.#pipelines.delete(queryID); pipeline.input.destroy(); + for (const companion of pipeline.companions) { + companion.input.destroy(); + } } } @@ -919,3 +983,16 @@ function mustGetPrimaryKey( `Check the spelling and ensure that the table has a primary key.`, ); } + +/** + * Compares two scalar subquery resolved values for equality. + * Unlike `valuesEqual` in data.ts (which treats null != null for join + * semantics), this uses identity semantics: undefined === undefined + * (no row matched), null === null (row matched but field was NULL). + */ +function scalarValuesEqual( + a: LiteralValue | null | undefined, + b: LiteralValue | null | undefined, +): boolean { + return a === b; +} diff --git a/packages/zqlite/src/resolve-scalar-subqueries.ts b/packages/zqlite/src/resolve-scalar-subqueries.ts index 132bf9c351..252ad69446 100644 --- a/packages/zqlite/src/resolve-scalar-subqueries.ts +++ b/packages/zqlite/src/resolve-scalar-subqueries.ts @@ -16,6 +16,11 @@ type TableSpecWithUniqueKeys = { export type CompanionSubquery = { /** The original scalar subquery AST (the subquery table query). */ ast: AST; + /** The field in the subquery row whose value was resolved. */ + childField: string; + /** The resolved value, `null` if a row matched but the field was `NULL`, + * or `undefined` if no row matched. */ + resolvedValue: LiteralValue | null | undefined; }; export type ResolveResult = { @@ -128,7 +133,11 @@ function resolveScalarSubquery( // Record the companion subquery AST so its rows are synced to the client. // The client rewrites scalar subqueries to EXISTS and needs those rows. - companions.push({ast: subquery}); + companions.push({ + ast: subquery, + childField: condition.childField, + resolvedValue: value, + }); if (value === undefined || value === null) { // No rows or NULL value — both x = NULL and x != NULL are false in SQL From d231cdd7dfa63fe45059977458b8cf5987526bb3 Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Wed, 18 Feb 2026 19:11:21 -0700 Subject: [PATCH 081/495] chore(zqlite): fixes for scalar subqueries (#5582) Fixes for scalar subqueries: - consumes the companion pipelines - transforms scalar subqueries that cannot be inlined to exists before hitting the plan phase - adds whereScalar --------- Co-authored-by: Matt Wonlaw Co-authored-by: Claude Opus 4.6 --- .../services/view-syncer/pipeline-driver.ts | 9 +- packages/zql/src/builder/builder.ts | 38 +++- packages/zql/src/query/query-impl.ast.test.ts | 89 ++++++++ packages/zql/src/query/query-impl.ts | 54 +++++ packages/zql/src/query/query.ts | 22 ++ .../src/resolve-scalar-subqueries.test.ts | 211 ++++++++++++++++++ .../zqlite/src/resolve-scalar-subqueries.ts | 22 +- 7 files changed, 432 insertions(+), 13 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 1f1aacbf0b..494de0036c 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -18,7 +18,6 @@ import { skipYields, type Storage, } from '../../../../zql/src/ivm/operator.ts'; -import {first} from '../../../../zql/src/ivm/stream.ts'; import type {SourceSchema} from '../../../../zql/src/ivm/schema.ts'; import type { Source, @@ -352,7 +351,13 @@ export class PipelineDriver { }, 'scalar-subquery', ); - const node = first(skipYields(input.fetch({}))); + // Consume the full stream rather than using first() to avoid + // triggering early return on Take's #initialFetch assertion. + // The subquery AST already has limit: 1, so at most one row is produced. + let node: Node | undefined; + for (const n of skipYields(input.fetch({}))) { + node ??= n; + } if (!node) { // Keep the companion alive even with no results — it will // detect a future insert that creates the row. diff --git a/packages/zql/src/builder/builder.ts b/packages/zql/src/builder/builder.ts index 87cd8c8727..9b8dc58b28 100644 --- a/packages/zql/src/builder/builder.ts +++ b/packages/zql/src/builder/builder.ts @@ -136,6 +136,7 @@ export function buildPipeline( ast, tableName => must(delegate.getSource(tableName)).tableSchema.primaryKey, ); + ast = rewriteScalarSubqueriesInAST(ast); if (costModel) { ast = planQuery(ast, costModel, planDebugger, lc); } @@ -258,19 +259,44 @@ export function assertNoNotExists(condition: Condition): void { } } -function rewriteScalarSubqueryConditions(condition: Condition): Condition { +function rewriteScalarSubqueriesInCondition(condition: Condition): Condition { if (condition.type === 'scalarSubquery') { - return rewriteScalarSubquery(condition); + return rewriteScalarSubquery({ + ...condition, + subquery: rewriteScalarSubqueriesInAST(condition.subquery), + }); + } + if (condition.type === 'correlatedSubquery') { + return { + ...condition, + related: { + ...condition.related, + subquery: rewriteScalarSubqueriesInAST(condition.related.subquery), + }, + }; } if (condition.type === 'and' || condition.type === 'or') { return { type: condition.type, - conditions: condition.conditions.map(rewriteScalarSubqueryConditions), + conditions: condition.conditions.map(rewriteScalarSubqueriesInCondition), }; } return condition; } +function rewriteScalarSubqueriesInAST(ast: AST): AST { + return { + ...ast, + where: ast.where + ? rewriteScalarSubqueriesInCondition(ast.where) + : undefined, + related: ast.related?.map(sq => ({ + ...sq, + subquery: rewriteScalarSubqueriesInAST(sq.subquery), + })), + }; +} + function rewriteScalarSubquery(condition: ScalarSubqueryCondition): Condition { const correlated: CorrelatedSubquery = { correlation: { @@ -309,12 +335,6 @@ function buildPipelineInternal( throw new Error(`Source not found: ${ast.table}`); } - // Rewrite scalar subquery conditions to correlated subquery conditions - // before the rest of the pipeline processing. - if (ast.where) { - ast = {...ast, where: rewriteScalarSubqueryConditions(ast.where)}; - } - ast = uniquifyCorrelatedSubqueryConditionAliases(ast); if (!delegate.enableNotExists && ast.where) { diff --git a/packages/zql/src/query/query-impl.ast.test.ts b/packages/zql/src/query/query-impl.ast.test.ts index fde5d9381e..b66ed6fc7e 100644 --- a/packages/zql/src/query/query-impl.ast.test.ts +++ b/packages/zql/src/query/query-impl.ast.test.ts @@ -2331,3 +2331,92 @@ describe('scalar subquery via cmp + scalar', () => { `); }); }); + +describe('whereScalar', () => { + test('basic (no callback)', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect(ast(issueQuery.whereScalar('owner'))).toMatchInlineSnapshot(` + { + "table": "issue", + "where": { + "childField": "id", + "op": "=", + "parentField": "ownerId", + "subquery": { + "alias": "zsubq_owner", + "limit": 1, + "table": "user", + }, + "type": "scalarSubquery", + }, + } + `); + }); + + test('with callback', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect(ast(issueQuery.whereScalar('owner', q => q.where('name', 'Alice')))) + .toMatchInlineSnapshot(` + { + "table": "issue", + "where": { + "childField": "id", + "op": "=", + "parentField": "ownerId", + "subquery": { + "alias": "zsubq_owner", + "limit": 1, + "table": "user", + "where": { + "left": { + "name": "name", + "type": "column", + }, + "op": "=", + "right": { + "type": "literal", + "value": "Alice", + }, + "type": "simple", + }, + }, + "type": "scalarSubquery", + }, + } + `); + }); + + test('chained with where', () => { + const issueQuery = newQuery(schema, 'issue'); + + const q = issueQuery + .whereScalar('owner', q => q.where('name', 'Alice')) + .where('closed', false); + + expect(ast(q).where).toMatchObject({ + type: 'and', + conditions: [ + { + type: 'scalarSubquery', + op: '=', + parentField: 'ownerId', + childField: 'id', + }, + { + type: 'simple', + op: '=', + }, + ], + }); + }); + + test('two-hop relationship throws', () => { + const issueQuery = newQuery(schema, 'issue'); + + expect(() => issueQuery.whereScalar('labels')).toThrow( + 'whereScalar only supports one-hop relationships', + ); + }); +}); diff --git a/packages/zql/src/query/query-impl.ts b/packages/zql/src/query/query-impl.ts index 3d6e1eb8c2..57550ae47c 100644 --- a/packages/zql/src/query/query-impl.ts +++ b/packages/zql/src/query/query-impl.ts @@ -209,6 +209,16 @@ export class QueryImpl< ) as Query; }; + whereScalar = ( + relationship: string, + cb?: (q: AnyQuery) => AnyQuery, + ): Query => + this.where(() => this.#scalarSubquery(relationship, cb)) as Query< + TTable, + TSchema, + TReturn + >; + related = ( relationship: string, cb?: (q: AnyQuery) => AnyQuery, @@ -562,6 +572,50 @@ export class QueryImpl< throw new Error(`Invalid relationship ${relationship}`); }; + #scalarSubquery = ( + relationship: string, + cb: ((query: AnyQuery) => AnyQuery) | undefined, + ): Condition => { + cb = cb ?? (q => q); + const related = this.#schema.relationships[this.#tableName][relationship]; + assert(related, 'Invalid relationship'); + assert( + isOneHop(related), + 'whereScalar only supports one-hop relationships', + ); + + const {destSchema: destTableName, sourceField, destField} = related[0]; + assert(isCompoundKey(sourceField), 'Invalid relationship'); + assert(isCompoundKey(destField), 'Invalid relationship'); + assert( + sourceField.length === 1 && destField.length === 1, + 'whereScalar only supports single-field relationships', + ); + + const subQuery = asQueryImpl( + cb( + this.#newQuery( + destTableName, + { + table: destTableName, + alias: `${SUBQ_PREFIX}${relationship}`, + }, + defaultFormat, + this.customQueryID, + undefined, + ), + ), + ); + + return { + type: 'scalarSubquery', + op: '=', + parentField: sourceField[0], + childField: destField[0], + subquery: {...subQuery.#ast, limit: 1}, + }; + }; + get ast(): AST { return this.#ast; } diff --git a/packages/zql/src/query/query.ts b/packages/zql/src/query/query.ts index 59167d685c..8484d447f2 100644 --- a/packages/zql/src/query/query.ts +++ b/packages/zql/src/query/query.ts @@ -275,6 +275,28 @@ export interface Query< options?: ExistsOptions, ): Query; + /** + * EXPERIMENTAL: Support for scalar subqueries in WHERE clauses. + * Do not use unless you know what you are doing. + * API is unstable. + * Use at your own risk. + */ + whereScalar( + relationship: AvailableRelationships, + ): Query; + /** + * EXPERIMENTAL: Support for scalar subqueries in WHERE clauses. + * Do not use unless you know what you are doing. + * API is unstable. + * Use at your own risk. + */ + whereScalar>( + relationship: TRelationship, + cb: ( + q: Query, TSchema>, + ) => Query, + ): Query; + start( row: Partial>, opts?: {inclusive: boolean}, diff --git a/packages/zqlite/src/resolve-scalar-subqueries.test.ts b/packages/zqlite/src/resolve-scalar-subqueries.test.ts index 0a9412ad9e..8e463d3ca5 100644 --- a/packages/zqlite/src/resolve-scalar-subqueries.test.ts +++ b/packages/zqlite/src/resolve-scalar-subqueries.test.ts @@ -545,6 +545,217 @@ test('returns original AST when nothing to resolve', () => { expect(companions).toHaveLength(0); }); +test('resolves scalar subqueries inside correlatedSubquery (EXISTS) conditions', () => { + const specs = makeTableSpecs({ + label: [['id']], + }); + + const ast: AST = { + table: 'issue', + where: { + type: 'correlatedSubquery', + op: 'EXISTS', + related: { + correlation: { + parentField: ['id'], + childField: ['issueID'], + }, + subquery: { + table: 'issueLabel', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'labelID', + childField: 'id', + subquery: { + table: 'label', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 'label-001'}, + }, + }, + }, + }, + }, + }, + }; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + () => 'resolved-label-id', + ); + + // The correlatedSubquery condition should still be present, but its inner + // subquery's WHERE should be resolved from scalarSubquery to simple. + expect(resolved.where).toEqual({ + type: 'correlatedSubquery', + op: 'EXISTS', + related: { + correlation: { + parentField: ['id'], + childField: ['issueID'], + }, + subquery: { + table: 'issueLabel', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'labelID'}, + right: {type: 'literal', value: 'resolved-label-id'}, + }, + }, + }, + }); + expect(companions).toHaveLength(1); + expect(companions[0].ast.table).toBe('label'); +}); + +test('resolves scalar subqueries inside AND of correlatedSubquery conditions', () => { + const specs = makeTableSpecs({ + label: [['id']], + }); + + const ast: AST = { + table: 'issue', + where: { + type: 'and', + conditions: [ + { + type: 'correlatedSubquery', + op: 'EXISTS', + related: { + correlation: { + parentField: ['id'], + childField: ['issueID'], + }, + subquery: { + table: 'issueLabel', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'labelID', + childField: 'id', + subquery: { + table: 'label', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 'label-bug'}, + }, + }, + }, + }, + }, + }, + { + type: 'correlatedSubquery', + op: 'EXISTS', + related: { + correlation: { + parentField: ['id'], + childField: ['issueID'], + }, + subquery: { + table: 'issueLabel', + where: { + type: 'scalarSubquery', + op: '=', + parentField: 'labelID', + childField: 'id', + subquery: { + table: 'label', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 'label-software'}, + }, + }, + }, + }, + }, + }, + ], + }, + }; + + const values: Record = { + 'label-bug': 'bug-id', + 'label-software': 'software-id', + }; + let callCount = 0; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + (subAST, _field) => { + callCount++; + const idValue = (subAST.where as SimpleCondition).right as { + type: 'literal'; + value: string; + }; + return values[idValue.value]; + }, + ); + + expect(callCount).toBe(2); + expect(companions).toHaveLength(2); + + // Both correlatedSubquery conditions should have resolved inner WHERE + const andCond = resolved.where as {type: 'and'; conditions: Condition[]}; + expect(andCond.type).toBe('and'); + + for (const cond of andCond.conditions) { + expect(cond.type).toBe('correlatedSubquery'); + if (cond.type === 'correlatedSubquery') { + expect(cond.related.subquery.where?.type).toBe('simple'); + } + } +}); + +test('leaves correlatedSubquery unchanged when inner subquery has no scalar subqueries', () => { + const specs = makeTableSpecs({}); + + const ast: AST = { + table: 'issue', + where: { + type: 'correlatedSubquery', + op: 'EXISTS', + related: { + correlation: { + parentField: ['id'], + childField: ['issueID'], + }, + subquery: { + table: 'issueLabel', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'labelID'}, + right: {type: 'literal', value: 'some-id'}, + }, + }, + }, + }, + }; + + const {ast: resolved, companions} = resolveSimpleScalarSubqueries( + ast, + specs, + () => { + throw new Error('should not be called'); + }, + ); + + // Should return the original AST object (identity check) + expect(resolved).toBe(ast); + expect(companions).toHaveLength(0); +}); + test('resolves nested scalar subqueries in subquery where clause', () => { const specs = makeTableSpecs({ config: [['key']], diff --git a/packages/zqlite/src/resolve-scalar-subqueries.ts b/packages/zqlite/src/resolve-scalar-subqueries.ts index 252ad69446..7be526b780 100644 --- a/packages/zqlite/src/resolve-scalar-subqueries.ts +++ b/packages/zqlite/src/resolve-scalar-subqueries.ts @@ -101,6 +101,21 @@ function resolveCondition( } return {type: condition.type, conditions: resolved}; } + case 'correlatedSubquery': { + const resolvedSubquery = resolveASTRecursive( + condition.related.subquery, + tableSpecs, + execute, + companions, + ); + if (resolvedSubquery !== condition.related.subquery) { + return { + ...condition, + related: {...condition.related, subquery: resolvedSubquery}, + }; + } + return condition; + } default: return condition; } @@ -160,8 +175,11 @@ const ALWAYS_FALSE: SimpleCondition = { }; /** - * Checks if the subquery has at least one unique index whose columns - * are all equality-constrained by literal values. + * Checks if the subquery is guaranteed to return at most one deterministic row. + * + * This is true when all columns of at least one unique index on the subquery + * table are equality-constrained by literal values in the WHERE clause + * (using only AND conjunctions). */ export function isSimpleSubquery( subquery: AST, From 1734c7cabc49bbd079a3f30d883d6d3ac7af97ad Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Wed, 18 Feb 2026 19:38:26 -0700 Subject: [PATCH 082/495] feat(zbugs): swap to whereScalar for zbugs filtersGrgbkr/scalar zbugs (#5583) Add issueLabels and label relationships to the schema and update queries to use whereScalar instead of whereExists for project filtering, creator/ assignee lookups, and label filtering. Add a unique composite index on (projectID, name) to support scalar subquery resolution for label lookups by project. --------- Co-authored-by: Matt Wonlaw Co-authored-by: Claude Opus 4.6 --- apps/zbugs/db/drizzle-schema.ts | 6 +- .../db/migrations/0007_red_omega_sentinel.sql | 2 + .../db/migrations/meta/0007_snapshot.json | 1172 +++++++++++++++++ apps/zbugs/db/migrations/meta/_journal.json | 7 + apps/zbugs/shared/queries.ts | 34 +- apps/zbugs/shared/schema.ts | 10 + 6 files changed, 1218 insertions(+), 13 deletions(-) create mode 100644 apps/zbugs/db/migrations/0007_red_omega_sentinel.sql create mode 100644 apps/zbugs/db/migrations/meta/0007_snapshot.json diff --git a/apps/zbugs/db/drizzle-schema.ts b/apps/zbugs/db/drizzle-schema.ts index a94a7df371..a63474caa7 100644 --- a/apps/zbugs/db/drizzle-schema.ts +++ b/apps/zbugs/db/drizzle-schema.ts @@ -175,7 +175,11 @@ export const label = pgTable( }, table => [ uniqueIndex('label_project_idx').using('btree', table.id, table.projectID), - index('label_name_idx').using('btree', table.name), + uniqueIndex('label_name_project_idx').using( + 'btree', + table.projectID, + table.name, + ), foreignKey({ columns: [table.projectID], foreignColumns: [project.id], diff --git a/apps/zbugs/db/migrations/0007_red_omega_sentinel.sql b/apps/zbugs/db/migrations/0007_red_omega_sentinel.sql new file mode 100644 index 0000000000..c3e3ab29f7 --- /dev/null +++ b/apps/zbugs/db/migrations/0007_red_omega_sentinel.sql @@ -0,0 +1,2 @@ +DROP INDEX "label_name_idx";--> statement-breakpoint +CREATE UNIQUE INDEX "label_name_project_idx" ON "label" USING btree ("projectID","name"); \ No newline at end of file diff --git a/apps/zbugs/db/migrations/meta/0007_snapshot.json b/apps/zbugs/db/migrations/meta/0007_snapshot.json new file mode 100644 index 0000000000..f8a9330324 --- /dev/null +++ b/apps/zbugs/db/migrations/meta/0007_snapshot.json @@ -0,0 +1,1172 @@ +{ + "id": "73ccf630-c78b-4673-bf31-8b6bca2351e2", + "prevId": "071c9aef-f7e6-4a4a-a9ed-96bb724ef53d", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.comment": { + "name": "comment", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "issueID": { + "name": "issueID", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "creatorID": { + "name": "creatorID", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "comment_issueid_idx": { + "name": "comment_issueid_idx", + "columns": [ + { + "expression": "issueID", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "comment_issueID_fkey": { + "name": "comment_issueID_fkey", + "tableFrom": "comment", + "tableTo": "issue", + "columnsFrom": [ + "issueID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "comment_creatorID_fkey": { + "name": "comment_creatorID_fkey", + "tableFrom": "comment", + "tableTo": "user", + "columnsFrom": [ + "creatorID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.emoji": { + "name": "emoji", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "annotation": { + "name": "annotation", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "subjectID": { + "name": "subjectID", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "creatorID": { + "name": "creatorID", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "double precision", + "primaryKey": false, + "notNull": false, + "default": "(EXTRACT(epoch FROM CURRENT_TIMESTAMP) * (1000)::numeric)" + } + }, + "indexes": { + "emoji_created_idx": { + "name": "emoji_created_idx", + "columns": [ + { + "expression": "created", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emoji_subject_id_idx": { + "name": "emoji_subject_id_idx", + "columns": [ + { + "expression": "subjectID", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "emoji_creatorID_fkey": { + "name": "emoji_creatorID_fkey", + "tableFrom": "emoji", + "tableTo": "user", + "columnsFrom": [ + "creatorID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "emoji_subjectID_creatorID_value_key": { + "name": "emoji_subjectID_creatorID_value_key", + "nullsNotDistinct": false, + "columns": [ + "value", + "subjectID", + "creatorID" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.issue": { + "name": "issue", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "shortID": { + "name": "shortID", + "type": "integer", + "primaryKey": false, + "notNull": true, + "identity": { + "type": "byDefault", + "name": "issue_shortID_seq", + "schema": "public", + "increment": "1", + "startWith": "3000", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "title": { + "name": "title", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true + }, + "open": { + "name": "open", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "modified": { + "name": "modified", + "type": "double precision", + "primaryKey": false, + "notNull": false, + "default": "(EXTRACT(epoch FROM CURRENT_TIMESTAMP) * (1000)::numeric)" + }, + "created": { + "name": "created", + "type": "double precision", + "primaryKey": false, + "notNull": false, + "default": "(EXTRACT(epoch FROM CURRENT_TIMESTAMP) * (1000)::numeric)" + }, + "projectID": { + "name": "projectID", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'iCNlS2qEpzYWEes1RTf-D'" + }, + "creatorID": { + "name": "creatorID", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "assigneeID": { + "name": "assigneeID", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar(10240)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "visibility": { + "name": "visibility", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'public'" + } + }, + "indexes": { + "issue_project_idx": { + "name": "issue_project_idx", + "columns": [ + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_shortID_idx": { + "name": "issue_shortID_idx", + "columns": [ + { + "expression": "shortID", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_created_idx": { + "name": "issue_created_idx", + "columns": [ + { + "expression": "created", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_projectID_open_assigneeID_modified_idx": { + "name": "issue_projectID_open_assigneeID_modified_idx", + "columns": [ + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "open", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "assigneeID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "modified", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_projectID_open_creatorID_modified_idx": { + "name": "issue_projectID_open_creatorID_modified_idx", + "columns": [ + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "open", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "creatorID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "modified", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_projectID_open_modified_idx": { + "name": "issue_projectID_open_modified_idx", + "columns": [ + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "open", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "modified", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_projectID_assigneeID_modified_idx": { + "name": "issue_projectID_assigneeID_modified_idx", + "columns": [ + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "assigneeID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "modified", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_projectID_creatorID_modified_idx": { + "name": "issue_projectID_creatorID_modified_idx", + "columns": [ + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "creatorID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "modified", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_projectID_modified_idx": { + "name": "issue_projectID_modified_idx", + "columns": [ + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "modified", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_creatorID_idx": { + "name": "issue_creatorID_idx", + "columns": [ + { + "expression": "creatorID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "issue_assigneeID_idx": { + "name": "issue_assigneeID_idx", + "columns": [ + { + "expression": "assigneeID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "issue_projectID_fkey": { + "name": "issue_projectID_fkey", + "tableFrom": "issue", + "tableTo": "project", + "columnsFrom": [ + "projectID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "issue_creatorID_fkey": { + "name": "issue_creatorID_fkey", + "tableFrom": "issue", + "tableTo": "user", + "columnsFrom": [ + "creatorID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "issue_assigneeID_fkey": { + "name": "issue_assigneeID_fkey", + "tableFrom": "issue", + "tableTo": "user", + "columnsFrom": [ + "assigneeID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.issueLabel": { + "name": "issueLabel", + "schema": "", + "columns": { + "labelID": { + "name": "labelID", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "issueID": { + "name": "issueID", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "projectID": { + "name": "projectID", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'iCNlS2qEpzYWEes1RTf-D'" + } + }, + "indexes": { + "issuelabel_issueid_idx": { + "name": "issuelabel_issueid_idx", + "columns": [ + { + "expression": "issueID", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "issueLabel_labelID_projectID_fkey": { + "name": "issueLabel_labelID_projectID_fkey", + "tableFrom": "issueLabel", + "tableTo": "label", + "columnsFrom": [ + "labelID", + "projectID" + ], + "columnsTo": [ + "id", + "projectID" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "issueLabel_issueID_projectID_fkey": { + "name": "issueLabel_issueID_projectID_fkey", + "tableFrom": "issueLabel", + "tableTo": "issue", + "columnsFrom": [ + "issueID", + "projectID" + ], + "columnsTo": [ + "id", + "projectID" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "issueLabel_pkey": { + "name": "issueLabel_pkey", + "columns": [ + "labelID", + "issueID" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.issueNotifications": { + "name": "issueNotifications", + "schema": "", + "columns": { + "userID": { + "name": "userID", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "issueID": { + "name": "issueID", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "subscribed": { + "name": "subscribed", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "created": { + "name": "created", + "type": "double precision", + "primaryKey": false, + "notNull": false, + "default": "(EXTRACT(epoch FROM CURRENT_TIMESTAMP) * (1000)::numeric)" + } + }, + "indexes": {}, + "foreignKeys": { + "issueNotifications_userID_fkey": { + "name": "issueNotifications_userID_fkey", + "tableFrom": "issueNotifications", + "tableTo": "user", + "columnsFrom": [ + "userID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "issueNotifications_issueID_fkey": { + "name": "issueNotifications_issueID_fkey", + "tableFrom": "issueNotifications", + "tableTo": "issue", + "columnsFrom": [ + "issueID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "issueNotifications_pkey": { + "name": "issueNotifications_pkey", + "columns": [ + "userID", + "issueID" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.label": { + "name": "label", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "projectID": { + "name": "projectID", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'iCNlS2qEpzYWEes1RTf-D'" + } + }, + "indexes": { + "label_project_idx": { + "name": "label_project_idx", + "columns": [ + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "label_name_project_idx": { + "name": "label_name_project_idx", + "columns": [ + { + "expression": "projectID", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "label_projectID_fkey": { + "name": "label_projectID_fkey", + "tableFrom": "label", + "tableTo": "project", + "columnsFrom": [ + "projectID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "lowerCaseName": { + "name": "lowerCaseName", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "issueCountEstimate": { + "name": "issueCountEstimate", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "supportsSearch": { + "name": "supportsSearch", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "markURL": { + "name": "markURL", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "logoURL": { + "name": "logoURL", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "project_lower_case_name_idx": { + "name": "project_lower_case_name_idx", + "columns": [ + { + "expression": "lowerCaseName", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "login": { + "name": "login", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "avatar": { + "name": "avatar", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'user'" + }, + "githubID": { + "name": "githubID", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "user_githubid_idx": { + "name": "user_githubid_idx", + "columns": [ + { + "expression": "githubID", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_login_idx": { + "name": "user_login_idx", + "columns": [ + { + "expression": "login", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.userPref": { + "name": "userPref", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "userID": { + "name": "userID", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "userPref_userID_fkey": { + "name": "userPref_userID_fkey", + "tableFrom": "userPref", + "tableTo": "user", + "columnsFrom": [ + "userID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "userPref_pkey": { + "name": "userPref_pkey", + "columns": [ + "key", + "userID" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.viewState": { + "name": "viewState", + "schema": "", + "columns": { + "userID": { + "name": "userID", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "issueID": { + "name": "issueID", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "viewed": { + "name": "viewed", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "viewState_userID_fkey": { + "name": "viewState_userID_fkey", + "tableFrom": "viewState", + "tableTo": "user", + "columnsFrom": [ + "userID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "viewState_issueID_fkey": { + "name": "viewState_issueID_fkey", + "tableFrom": "viewState", + "tableTo": "issue", + "columnsFrom": [ + "issueID" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "viewState_pkey": { + "name": "viewState_pkey", + "columns": [ + "userID", + "issueID" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/zbugs/db/migrations/meta/_journal.json b/apps/zbugs/db/migrations/meta/_journal.json index 1e889aaa19..528d447e7e 100644 --- a/apps/zbugs/db/migrations/meta/_journal.json +++ b/apps/zbugs/db/migrations/meta/_journal.json @@ -50,6 +50,13 @@ "when": 1762890350511, "tag": "0006_exotic_wither", "breakpoints": true + }, + { + "idx": 7, + "version": "7", + "when": 1770409020281, + "tag": "0007_red_omega_sentinel", + "breakpoints": true } ] } \ No newline at end of file diff --git a/apps/zbugs/shared/queries.ts b/apps/zbugs/shared/queries.ts index e9e19bbbde..27cb685efb 100644 --- a/apps/zbugs/shared/queries.ts +++ b/apps/zbugs/shared/queries.ts @@ -55,7 +55,7 @@ function labelsOrderByName({ orderBy?: 'asc' | 'desc' | undefined; }; }) { - let q = builder.label.whereExists('project', q => + let q = builder.label.whereScalar('project', q => q.where('lowerCaseName', projectName.toLocaleLowerCase()), ); if (orderBy !== undefined) { @@ -103,8 +103,8 @@ export const queries = defineQueries({ ({ctx: auth, args: {userID, projectName}}) => applyIssuePermissions( builder.issue - .whereExists('project', p => - p.where('lowerCaseName', projectName.toLocaleLowerCase()), + .whereScalar('project', q => + q.where('lowerCaseName', projectName.toLocaleLowerCase()), ) .related('labels') .related('viewState', q => q.where('userID', userID)) @@ -147,14 +147,14 @@ export const queries = defineQueries({ ); } else if (filter === 'creators') { q = q.whereExists('createdIssues', i => - i.whereExists('project', p => - p.where('lowerCaseName', projectName.toLocaleLowerCase()), + i.whereScalar('project', q => + q.where('lowerCaseName', projectName.toLocaleLowerCase()), ), ); } else if (filter === 'assignees') { q = q.whereExists('assignedIssues', i => - i.whereExists('project', p => - p.where('lowerCaseName', projectName.toLocaleLowerCase()), + i.whereScalar('project', q => + q.where('lowerCaseName', projectName.toLocaleLowerCase()), ), ); } else { @@ -390,7 +390,7 @@ export function buildListQuery(args: ListQueryArgs) { const {projectName = ZERO_PROJECT_NAME} = listContext; - q = q.whereExists('project', q => + q = q.whereScalar('project', q => q.where('lowerCaseName', projectName.toLocaleLowerCase()), ); @@ -411,13 +411,15 @@ export function buildListQuery(args: ListQueryArgs) { } const {open, creator, assignee, labels, textFilter} = listContext; - q = q.where(({and, cmp, exists, or}) => + q = q.where(({and, cmp, exists, or, scalar}) => and( // oxlint-disable-next-line eqeqeq open != null ? cmp('open', open) : undefined, - creator ? exists('creator', q => q.where('login', creator)) : undefined, + creator + ? cmp('creatorID', scalar(builder.user.where('login', creator), 'id')) + : undefined, assignee - ? exists('assignee', q => q.where('login', assignee)) + ? cmp('assigneeID', scalar(builder.user.where('login', assignee), 'id')) : undefined, textFilter ? or( @@ -429,7 +431,15 @@ export function buildListQuery(args: ListQueryArgs) { ) : undefined, ...(labels ?? []).map(label => - exists('labels', q => q.where('name', label)), + exists('issueLabels', q => + q.whereScalar('label', q => + q + .where('name', label) + .whereScalar('project', q => + q.where('lowerCaseName', projectName.toLocaleLowerCase()), + ), + ), + ), ), ), ); diff --git a/apps/zbugs/shared/schema.ts b/apps/zbugs/shared/schema.ts index 9e54e78673..e8b25bfd5b 100644 --- a/apps/zbugs/shared/schema.ts +++ b/apps/zbugs/shared/schema.ts @@ -144,6 +144,11 @@ const issueRelationships = relationships(issue, ({many, one}) => ({ destField: ['id'], destSchema: project, }), + issueLabels: many({ + sourceField: ['id'], + destField: ['issueID'], + destSchema: issueLabel, + }), labels: many( { sourceField: ['id'], @@ -212,6 +217,11 @@ const issueLabelRelationships = relationships(issueLabel, ({one}) => ({ destField: ['id'], destSchema: issue, }), + label: one({ + sourceField: ['labelID'], + destField: ['id'], + destSchema: label, + }), })); const labelRelationships = relationships(label, ({one}) => ({ From 18e0abecf8188750de21bc6963aa8cdeffd70547 Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Thu, 19 Feb 2026 10:39:20 -0700 Subject: [PATCH 083/495] chore(zero-cache): enchance server start log message (#5561) Example ``` 2026-02-13T20:59:52.525-07:00 [ 'pid=34187', 'worker=runner' ] starting server@0.26.0 {"protocolVersion":48,"taskID":"jpvNiHSdCXjtjzC8eQyQE","app":{"id":"zero","publications":["zero_zbugs"]},"shard":{"num":0},"port":4848} ``` --- packages/zero-cache/src/server/runner/run-worker.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/zero-cache/src/server/runner/run-worker.ts b/packages/zero-cache/src/server/runner/run-worker.ts index 08aa8318f4..43506a5493 100644 --- a/packages/zero-cache/src/server/runner/run-worker.ts +++ b/packages/zero-cache/src/server/runner/run-worker.ts @@ -33,10 +33,13 @@ export async function runWorker( const {port, lazyStartup} = config; const serverVersion = getServerVersion(config); - lc.info?.( - `starting server${!serverVersion ? '' : `@${serverVersion}`} ` + - `protocolVersion=${PROTOCOL_VERSION}`, - ); + lc.info?.(`starting server${!serverVersion ? '' : `@${serverVersion}`} `, { + protocolVersion: PROTOCOL_VERSION, + taskID: config.taskID, + app: config.app, + shard: config.shard, + port: config.port, + }); let zeroCache: Resolver | undefined; function startZeroCache(): Promise { From 526719e6f7ba0a3eced64fe679c8ba1dae93eabe Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Thu, 19 Feb 2026 10:53:44 -1000 Subject: [PATCH 084/495] Update cherry-pick command to include '-x' option (#5584) --- packages/zero/tool/release.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zero/tool/release.js b/packages/zero/tool/release.js index aed397bdc9..8b7966aa46 100755 --- a/packages/zero/tool/release.js +++ b/packages/zero/tool/release.js @@ -285,7 +285,7 @@ Stable Release Examples: Maintenance/cherry-pick workflow: 1. Create a maintenance branch from tag: git checkout -b maint/zero/v0.24 zero/v0.24.0 - 2. Cherry-pick commits: git cherry-pick + 2. Cherry-pick commits: git cherry-pick -x 3. Push to origin: git push origin maint/zero/v0.24 4. Run: node release.js --from maint/zero/v0.24 From 80e2d2240998171715c658e42eb149276acf731e Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Thu, 19 Feb 2026 22:40:19 -0700 Subject: [PATCH 085/495] refactor: make scalar just an option to exists (#5585) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes `scalar()`, `ScalarReference`, `cmp(..., scalar(...))`, and `whereScalar()` APIs and `ScalarSubqueryCondition` AST additions. Scalar subquery behavior is now just an option on `whereExists` and `exists` APIS and the `CorrelatedSubqueryCondition` AST type: ```ts // Before query.whereScalar('owner', q => q.where('name', 'Alice')); query.where(({cmp, scalar}) => cmp('ownerId', scalar(builder.user.where('name', 'Alice'), 'id'))); // After query.whereExists('owner', q => q.where('name', 'Alice'), {scalar: true}); query.where(({exists}) => exists('owner', q => q.where('name', 'Alice'), {scalar: true}))); ``` A scalar subquery is semantically equivalent to an EXISTS on a one-to-one relationship — the difference is purely a server-side optimization. Making it an option on `whereExists` rather than a separate API eliminates a parallel set of types, AST nodes, and the need to translate to exists for client side IVM, while keeping the conceptual model simple: one way to filter by related rows, with options to control execution. --- apps/zbugs/shared/queries.ts | 67 ++-- packages/ast-to-zql/src/ast-to-zql.test.ts | 243 +++++++++--- packages/ast-to-zql/src/ast-to-zql.ts | 54 +-- packages/z2s/src/compiler.output.test.ts | 92 +++++ packages/z2s/src/compiler.ts | 32 +- .../src/auth/read-authorizer.test.ts | 14 - .../zero-cache/src/auth/read-authorizer.ts | 7 - .../view-syncer/pipeline-driver.test.ts | 87 +++-- .../src/client/protocol-version-url.test.ts | 2 +- packages/zero-protocol/src/ast.test.ts | 88 ++++- packages/zero-protocol/src/ast.ts | 66 +--- .../src/protocol-version.test.ts | 4 +- .../zero-protocol/src/protocol-version.ts | 3 +- .../src/chinook/chinook.pg.test.ts | 23 +- .../src/chinook/planner-controlled.test.ts | 2 +- packages/zql/src/builder/builder.ts | 88 +---- packages/zql/src/builder/filter.ts | 1 - packages/zql/src/planner/planner-builder.ts | 5 +- .../zql/src/query/complete-ordering.test.ts | 278 +++++++------ packages/zql/src/query/complete-ordering.ts | 6 - .../zql/src/query/expression-test-util.ts | 2 - packages/zql/src/query/expression.test.ts | 54 ++- packages/zql/src/query/expression.ts | 109 +----- packages/zql/src/query/query-impl.ast.test.ts | 321 +++++---------- packages/zql/src/query/query-impl.ts | 71 +--- packages/zql/src/query/query.test.ts | 34 -- packages/zql/src/query/query.ts | 50 +-- packages/zql/src/query/test/query-gen.test.ts | 1 - packages/zqlite/src/query-builder.ts | 2 +- .../src/resolve-scalar-subqueries.test.ts | 365 ++++++++++-------- .../zqlite/src/resolve-scalar-subqueries.ts | 69 ++-- packages/zqlite/src/sqlite-cost-model.ts | 1 - 32 files changed, 1112 insertions(+), 1129 deletions(-) diff --git a/apps/zbugs/shared/queries.ts b/apps/zbugs/shared/queries.ts index 27cb685efb..76e2b85142 100644 --- a/apps/zbugs/shared/queries.ts +++ b/apps/zbugs/shared/queries.ts @@ -55,8 +55,10 @@ function labelsOrderByName({ orderBy?: 'asc' | 'desc' | undefined; }; }) { - let q = builder.label.whereScalar('project', q => - q.where('lowerCaseName', projectName.toLocaleLowerCase()), + let q = builder.label.whereExists( + 'project', + q => q.where('lowerCaseName', projectName.toLocaleLowerCase()), + {scalar: true}, ); if (orderBy !== undefined) { q = q.orderBy('name', orderBy); @@ -103,8 +105,10 @@ export const queries = defineQueries({ ({ctx: auth, args: {userID, projectName}}) => applyIssuePermissions( builder.issue - .whereScalar('project', q => - q.where('lowerCaseName', projectName.toLocaleLowerCase()), + .whereExists( + 'project', + q => q.where('lowerCaseName', projectName.toLocaleLowerCase()), + {scalar: true}, ) .related('labels') .related('viewState', q => q.where('userID', userID)) @@ -147,14 +151,18 @@ export const queries = defineQueries({ ); } else if (filter === 'creators') { q = q.whereExists('createdIssues', i => - i.whereScalar('project', q => - q.where('lowerCaseName', projectName.toLocaleLowerCase()), + i.whereExists( + 'project', + q => q.where('lowerCaseName', projectName.toLocaleLowerCase()), + {scalar: true}, ), ); } else if (filter === 'assignees') { q = q.whereExists('assignedIssues', i => - i.whereScalar('project', q => - q.where('lowerCaseName', projectName.toLocaleLowerCase()), + i.whereExists( + 'project', + q => q.where('lowerCaseName', projectName.toLocaleLowerCase()), + {scalar: true}, ), ); } else { @@ -390,8 +398,10 @@ export function buildListQuery(args: ListQueryArgs) { const {projectName = ZERO_PROJECT_NAME} = listContext; - q = q.whereScalar('project', q => - q.where('lowerCaseName', projectName.toLocaleLowerCase()), + q = q.whereExists( + 'project', + q => q.where('lowerCaseName', projectName.toLocaleLowerCase()), + {scalar: true}, ); const {sortField, sortDirection} = listContext; @@ -411,16 +421,10 @@ export function buildListQuery(args: ListQueryArgs) { } const {open, creator, assignee, labels, textFilter} = listContext; - q = q.where(({and, cmp, exists, or, scalar}) => + q = q.where(({and, cmp, exists, or}) => and( // oxlint-disable-next-line eqeqeq open != null ? cmp('open', open) : undefined, - creator - ? cmp('creatorID', scalar(builder.user.where('login', creator), 'id')) - : undefined, - assignee - ? cmp('assigneeID', scalar(builder.user.where('login', assignee), 'id')) - : undefined, textFilter ? or( cmp('title', 'ILIKE', `%${escapeLike(textFilter)}%`), @@ -432,18 +436,35 @@ export function buildListQuery(args: ListQueryArgs) { : undefined, ...(labels ?? []).map(label => exists('issueLabels', q => - q.whereScalar('label', q => - q - .where('name', label) - .whereScalar('project', q => - q.where('lowerCaseName', projectName.toLocaleLowerCase()), - ), + q.whereExists( + 'label', + q => + q + .where('name', label) + .whereExists( + 'project', + q => + q.where('lowerCaseName', projectName.toLocaleLowerCase()), + {scalar: true}, + ), + {scalar: true}, ), ), ), ), ); + if (creator) { + q = q.whereExists('creator', q => q.where('login', creator), { + scalar: true, + }); + } + if (assignee) { + q = q.whereExists('assignee', q => q.where('login', assignee), { + scalar: true, + }); + } + return applyIssuePermissions(q, role); } diff --git a/packages/ast-to-zql/src/ast-to-zql.test.ts b/packages/ast-to-zql/src/ast-to-zql.test.ts index e139ebcfc0..0219ac876d 100644 --- a/packages/ast-to-zql/src/ast-to-zql.test.ts +++ b/packages/ast-to-zql/src/ast-to-zql.test.ts @@ -637,121 +637,244 @@ test('EXISTS with order', () => { ); }); -test('scalar subquery with = operator', () => { +test('EXISTS with scalar option', () => { const ast: AST = { table: 'issue', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - subquery: { - table: 'user', + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + }, }, - childField: 'id', }, }; expect(astToZQL(ast)).toMatchInlineSnapshot( - `".where(({cmp, scalar}) => cmp('ownerId', scalar(q => q, 'id')))"`, + `".whereExists('owner', {scalar: true})"`, ); }); -test('scalar subquery with IS NOT operator', () => { +test('NOT EXISTS with scalar option', () => { const ast: AST = { table: 'issue', where: { - type: 'scalarSubquery', - op: 'IS NOT', - parentField: 'ownerId', - subquery: { - table: 'user', + type: 'correlatedSubquery', + op: 'NOT EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + }, }, - childField: 'id', }, }; expect(astToZQL(ast)).toMatchInlineSnapshot( - `".where(({cmp, scalar}) => cmp('ownerId', 'IS NOT', scalar(q => q, 'id')))"`, + `".where(({exists, not}) => not(exists('owner', {scalar: true})))"`, ); }); -test('scalar subquery with where clause in subquery', () => { +test('EXISTS with scalar and where condition on subquery', () => { const ast: AST = { table: 'issue', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - subquery: { - table: 'user', - where: { - type: 'simple', - left: {type: 'column', name: 'name'}, - op: '=', - right: {type: 'literal', value: 'Alice'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + where: { + type: 'simple', + left: {type: 'column', name: 'name'}, + op: '=', + right: {type: 'literal', value: 'Alice'}, + }, }, }, - childField: 'id', }, }; expect(astToZQL(ast)).toMatchInlineSnapshot( - `".where(({cmp, scalar}) => cmp('ownerId', scalar(q => q.where('name', 'Alice'), 'id')))"`, + `".whereExists('owner', q => q.where('name', 'Alice'), {scalar: true})"`, ); }); -test('scalar subquery inside AND combinator', () => { +test('NOT EXISTS with scalar and where condition', () => { const ast: AST = { table: 'issue', where: { - type: 'and', - conditions: [ - { - type: 'simple', - left: {type: 'column', name: 'status'}, - op: '=', - right: {type: 'literal', value: 'open'}, + type: 'correlatedSubquery', + op: 'NOT EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], }, - { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - subquery: { - table: 'user', + subquery: { + table: 'user', + alias: 'zsubq_owner', + where: { + type: 'simple', + left: {type: 'column', name: 'name'}, + op: '=', + right: {type: 'literal', value: 'Alice'}, }, - childField: 'id', }, - ], + }, }, }; expect(astToZQL(ast)).toMatchInlineSnapshot( - `".where('status', 'open').where(({cmp, scalar}) => cmp('ownerId', scalar(q => q, 'id')))"`, + `".where(({exists, not}) => not(exists('owner', q => q.where('name', 'Alice'), {scalar: true})))"`, ); }); -test('scalar subquery inside OR combinator', () => { +test('scalar in AND combinator', () => { const ast: AST = { table: 'issue', where: { - type: 'or', + type: 'and', conditions: [ { - type: 'simple', - left: {type: 'column', name: 'status'}, - op: '=', - right: {type: 'literal', value: 'open'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + }, + }, }, { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - subquery: { - table: 'user', - }, - childField: 'id', + type: 'simple', + left: {type: 'column', name: 'title'}, + op: 'LIKE', + right: {type: 'literal', value: '%bug%'}, }, ], }, }; expect(astToZQL(ast)).toMatchInlineSnapshot( - `".where(({cmp, or, scalar}) => or(cmp('status', 'open'), cmp('ownerId', scalar(q => q, 'id'))))"`, + `".whereExists('owner', {scalar: true}).where('title', 'LIKE', '%bug%')"`, + ); +}); + +test('EXISTS with both flip and scalar options', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'correlatedSubquery', + op: 'EXISTS', + flip: true, + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + }, + }, + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".whereExists('owner', {flip: true, scalar: true})"`, + ); +}); + +test('EXISTS with explicit flip: false', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'correlatedSubquery', + op: 'EXISTS', + flip: false, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + }, + }, + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".whereExists('owner', {flip: false})"`, + ); +}); + +test('EXISTS with explicit scalar: false', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: false, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + }, + }, + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".whereExists('owner', {scalar: false})"`, + ); +}); + +test('EXISTS with flip: false and scalar: false', () => { + const ast: AST = { + table: 'issue', + where: { + type: 'correlatedSubquery', + op: 'EXISTS', + flip: false, + scalar: false, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + }, + }, + }, + }; + expect(astToZQL(ast)).toMatchInlineSnapshot( + `".whereExists('owner', {flip: false, scalar: false})"`, ); }); diff --git a/packages/ast-to-zql/src/ast-to-zql.ts b/packages/ast-to-zql/src/ast-to-zql.ts index abf7fc1e84..31831604d6 100644 --- a/packages/ast-to-zql/src/ast-to-zql.ts +++ b/packages/ast-to-zql/src/ast-to-zql.ts @@ -10,7 +10,6 @@ import type { LiteralReference, Ordering, Parameter, - ScalarSubqueryCondition, SimpleCondition, ValuePosition, } from '../../zero-protocol/src/ast.ts'; @@ -86,8 +85,6 @@ function transformCondition( return transformLogicalCondition(condition, prefix, args); case 'correlatedSubquery': return transformExistsCondition(condition, prefix, args); - case 'scalarSubquery': - return transformScalarSubqueryCondition(condition, prefix, args); default: unreachable(condition); } @@ -164,22 +161,32 @@ function transformExistsCondition( nextSubquery.orderBy || nextSubquery.limit; + // Build options string for flip and scalar + const optionParts: string[] = []; + if (condition.flip !== undefined) { + optionParts.push(`flip: ${condition.flip}`); + } + if (condition.scalar !== undefined) { + optionParts.push(`scalar: ${condition.scalar}`); + } + const optionsStr = + optionParts.length > 0 ? `, {${optionParts.join(', ')}}` : ''; + if (op === 'EXISTS') { - const flipped = condition.flip ? ', {flip: true}' : ''; if (!hasSubQueryProps) { if (prefix === '.where') { - return `.whereExists('${relationship}'${flipped})`; + return `.whereExists('${relationship}'${optionsStr})`; } args.add('exists'); - return `exists('${relationship}'${flipped})`; + return `exists('${relationship}'${optionsStr})`; } if (prefix === '.where') { - return `.whereExists('${relationship}', q => q${astToZQL(nextSubquery)}${flipped})`; + return `.whereExists('${relationship}', q => q${astToZQL(nextSubquery)}${optionsStr})`; } prefix satisfies 'cmp'; args.add('exists'); - return `exists('${relationship}', q => q${astToZQL(nextSubquery)}${flipped})`; + return `exists('${relationship}', q => q${astToZQL(nextSubquery)}${optionsStr})`; } op satisfies 'NOT EXISTS'; @@ -188,44 +195,21 @@ function transformExistsCondition( if (prefix === '.where') { return `.where(({exists, not}) => not(exists('${relationship}', q => q${astToZQL( nextSubquery, - )})))`; + )}${optionsStr})))`; } prefix satisfies 'cmp'; args.add('not'); args.add('exists'); - return `not(exists('${relationship}', q => q${astToZQL(nextSubquery)}))`; + return `not(exists('${relationship}', q => q${astToZQL(nextSubquery)}${optionsStr}))`; } if (prefix === '.where') { - return `.where(({exists, not}) => not(exists('${relationship}')))`; + return `.where(({exists, not}) => not(exists('${relationship}'${optionsStr})))`; } args.add('not'); args.add('exists'); - return `not(exists('${relationship}')))`; -} - -function transformScalarSubqueryCondition( - condition: ScalarSubqueryCondition, - prefix: Prefix, - args: Args, -): string { - const subqueryCode = astToZQL(condition.subquery); - const scalarExpr = `scalar(q => q${subqueryCode}, '${condition.childField}')`; - - let cmpExpr: string; - if (condition.op === '=') { - cmpExpr = `cmp('${condition.parentField}', ${scalarExpr})`; - } else { - cmpExpr = `cmp('${condition.parentField}', '${condition.op}', ${scalarExpr})`; - } - - if (prefix === '.where') { - return `.where(({cmp, scalar}) => ${cmpExpr})`; - } - args.add('cmp'); - args.add('scalar'); - return cmpExpr; + return `not(exists('${relationship}'${optionsStr})))`; } // If the `exists` is applied against a junction edge, both hops will have the same alias and both hops will be exists conditions. diff --git a/packages/z2s/src/compiler.output.test.ts b/packages/z2s/src/compiler.output.test.ts index 2c38699aac..0af4f05a49 100644 --- a/packages/z2s/src/compiler.output.test.ts +++ b/packages/z2s/src/compiler.output.test.ts @@ -1309,3 +1309,95 @@ test('related w/o junction edge', () => { } `); }); + +test('scalar subquery with EXISTS generates = operator', () => { + expect( + formatPgInternalConvert( + compile(serverSchema, schema, { + table: 'issue', + related: [], + where: { + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'name'}, + right: {type: 'literal', value: 'Alice'}, + }, + }, + }, + }, + }), + ), + ).toMatchInlineSnapshot(` + { + "text": "SELECT + COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" + FROM (SELECT "issue_0"."id" as "id","issue_0"."title" as "title","issue_0"."description" as "description","issue_0"."closed" as "closed","issue_0"."ownerId" as "ownerId",EXTRACT(EPOCH FROM "issue_0"."created") * 1000 as "created" + FROM "issue" AS "issue_0" + WHERE "issue_0"."ownerId" = (SELECT "user_1"."id" FROM "user" AS "user_1" WHERE "user_1"."name" = $1::text COLLATE "ucs_basic" ORDER BY "user_1"."id" COLLATE "ucs_basic" ASC NULLS FIRST LIMIT 1) + + ORDER BY "issue_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ) "zql_root"", + "values": [ + "Alice", + ], + } + `); +}); + +test('scalar subquery with NOT EXISTS generates IS NOT operator', () => { + expect( + formatPgInternalConvert( + compile(serverSchema, schema, { + table: 'issue', + related: [], + where: { + type: 'correlatedSubquery', + op: 'NOT EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'user', + alias: 'zsubq_owner', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'name'}, + right: {type: 'literal', value: 'Alice'}, + }, + }, + }, + }, + }), + ), + ).toMatchInlineSnapshot(` + { + "text": "SELECT + COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" + FROM (SELECT "issue_0"."id" as "id","issue_0"."title" as "title","issue_0"."description" as "description","issue_0"."closed" as "closed","issue_0"."ownerId" as "ownerId",EXTRACT(EPOCH FROM "issue_0"."created") * 1000 as "created" + FROM "issue" AS "issue_0" + WHERE "issue_0"."ownerId" IS NOT (SELECT "user_1"."id" FROM "user" AS "user_1" WHERE "user_1"."name" = $1::text COLLATE "ucs_basic" ORDER BY "user_1"."id" COLLATE "ucs_basic" ASC NULLS FIRST LIMIT 1) + + ORDER BY "issue_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ) "zql_root"", + "values": [ + "Alice", + ], + } + `); +}); diff --git a/packages/z2s/src/compiler.ts b/packages/z2s/src/compiler.ts index 70ca02649c..06e2beeda8 100644 --- a/packages/z2s/src/compiler.ts +++ b/packages/z2s/src/compiler.ts @@ -17,7 +17,6 @@ import type { Correlation, LiteralReference, Ordering, - ScalarSubqueryCondition, SimpleCondition, ValuePosition, } from '../../zero-protocol/src/ast.ts'; @@ -304,9 +303,10 @@ function where( ' OR ', )})`; case 'correlatedSubquery': + if (condition.scalar) { + return scalarSubquery(spec, condition, table); + } return exists(spec, condition, table); - case 'scalarSubquery': - return scalarSubquery(spec, condition, table); case 'simple': return simple(spec, condition, table); } @@ -351,30 +351,32 @@ function exists( function scalarSubquery( spec: Spec, - condition: ScalarSubqueryCondition, + condition: CorrelatedSubqueryCondition, parentTable: Table, ): SQLQuery { + const parentField = condition.related.correlation.parentField[0]; + const childField = condition.related.correlation.childField[0]; + const subqueryAST = condition.related.subquery; + const parentCol = colIdent(spec.server, { table: parentTable, - zql: condition.parentField, + zql: parentField, }); - const subqueryTable = makeTable(spec, condition.subquery.table); + const subqueryTable = makeTable(spec, subqueryAST.table); const childCol = colIdent(spec.server, { table: subqueryTable, - zql: condition.childField, + zql: childField, }); - const op = sql.__dangerous__rawValue(condition.op); + const op = sql.__dangerous__rawValue( + condition.op === 'EXISTS' ? '=' : 'IS NOT', + ); - const subqueryWhere = condition.subquery.where - ? sql`WHERE ${where(spec, condition.subquery.where, subqueryTable)}` + const subqueryWhere = subqueryAST.where + ? sql`WHERE ${where(spec, subqueryAST.where, subqueryTable)}` : sql``; - const subqueryOrderBy = orderBy( - spec, - condition.subquery.orderBy, - subqueryTable, - ); + const subqueryOrderBy = orderBy(spec, subqueryAST.orderBy, subqueryTable); return sql`${parentCol} ${op} (SELECT ${childCol} FROM ${fromIdent(spec.server, subqueryTable)} ${subqueryWhere} ${subqueryOrderBy} LIMIT 1)`; } diff --git a/packages/zero-cache/src/auth/read-authorizer.test.ts b/packages/zero-cache/src/auth/read-authorizer.test.ts index 4182c1e3f8..e5d49a14d7 100644 --- a/packages/zero-cache/src/auth/read-authorizer.test.ts +++ b/packages/zero-cache/src/auth/read-authorizer.test.ts @@ -533,7 +533,6 @@ describe('unreadable tables', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -570,7 +569,6 @@ describe('unreadable tables', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -713,7 +711,6 @@ describe('unreadable tables', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -731,7 +728,6 @@ describe('unreadable tables', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -787,7 +783,6 @@ describe('unreadable tables', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -805,7 +800,6 @@ describe('unreadable tables', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -886,7 +880,6 @@ describe('unreadable tables', () => { "type": "correlatedSubquery", }, { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -958,7 +951,6 @@ describe('unreadable tables', () => { "type": "correlatedSubquery", }, { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1003,7 +995,6 @@ test('exists rules in permissions are tagged as the permissions system', () => { "related": undefined, "table": "readableThruUnreadable", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1055,7 +1046,6 @@ test('exists rules in permissions are tagged as the permissions system', () => { "related": undefined, "table": "readableThruUnreadable", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1387,7 +1377,6 @@ describe('admin readable', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1455,7 +1444,6 @@ describe('admin readable', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1540,7 +1528,6 @@ describe('admin readable', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1558,7 +1545,6 @@ describe('admin readable', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { diff --git a/packages/zero-cache/src/auth/read-authorizer.ts b/packages/zero-cache/src/auth/read-authorizer.ts index 8c3553ad6a..9c38d14ca3 100644 --- a/packages/zero-cache/src/auth/read-authorizer.ts +++ b/packages/zero-cache/src/auth/read-authorizer.ts @@ -148,12 +148,5 @@ function transformCondition( }, }; } - case 'scalarSubquery': { - const query = transformQueryInternal(lc, cond.subquery, auth); - return { - ...cond, - subquery: query, - }; - } } } diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts index a1eb678ae7..f4f6651c66 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts @@ -365,18 +365,23 @@ describe('view-syncer/pipeline-driver', () => { table: 'issues', orderBy: [['id', 'asc']], where: { - type: 'scalarSubquery', - op: '=', - parentField: 'id', - childField: 'issueID', - subquery: { - table: 'comments', - orderBy: [['id', 'asc']], - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '10'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['id'], + childField: ['issueID'], + }, + subquery: { + table: 'comments', + orderBy: [['id', 'asc']], + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '10'}, + }, }, }, }, @@ -386,18 +391,23 @@ describe('view-syncer/pipeline-driver', () => { table: 'issues', orderBy: [['id', 'asc']], where: { - type: 'scalarSubquery', - op: '=', - parentField: 'id', - childField: 'issueID', - subquery: { - table: 'comments', - orderBy: [['id', 'asc']], - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: 'nonexistent'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['id'], + childField: ['issueID'], + }, + subquery: { + table: 'comments', + orderBy: [['id', 'asc']], + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 'nonexistent'}, + }, }, }, }, @@ -1908,18 +1918,23 @@ describe('view-syncer/pipeline-driver', () => { right: {type: 'literal', value: false}, }, { - type: 'scalarSubquery', - op: '=', - parentField: 'id', - childField: 'issueID', - subquery: { - table: 'comments', - orderBy: [['id', 'asc']], - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '10'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['id'], + childField: ['issueID'], + }, + subquery: { + table: 'comments', + orderBy: [['id', 'asc']], + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '10'}, + }, }, }, }, diff --git a/packages/zero-client/src/client/protocol-version-url.test.ts b/packages/zero-client/src/client/protocol-version-url.test.ts index 9413126ed5..53db944016 100644 --- a/packages/zero-client/src/client/protocol-version-url.test.ts +++ b/packages/zero-client/src/client/protocol-version-url.test.ts @@ -34,5 +34,5 @@ test('When the URL changes we need to update the protocol version', async () => // might not understand it. You may need to bump the PROTOCOL_VERSION and // update the expected values. expect(hash).toBe('10r2tfvet9a3s'); - expect(PROTOCOL_VERSION).toBe(48); + expect(PROTOCOL_VERSION).toBe(49); }); diff --git a/packages/zero-protocol/src/ast.test.ts b/packages/zero-protocol/src/ast.test.ts index 6352530d01..e261f3350b 100644 --- a/packages/zero-protocol/src/ast.test.ts +++ b/packages/zero-protocol/src/ast.test.ts @@ -170,6 +170,90 @@ test('conditions are sorted', () => { }, ], }); + + // correlatedSubquery conditions differing only in flip sort deterministically + ast = { + table: 'table', + where: { + type: 'and', + conditions: [ + { + type: 'correlatedSubquery', + op: 'EXISTS', + flip: true, + related: { + correlation: {parentField: ['id'], childField: ['id']}, + subquery: {table: 'other', alias: 'zsubq_rel'}, + }, + }, + { + type: 'correlatedSubquery', + op: 'EXISTS', + related: { + correlation: {parentField: ['id'], childField: ['id']}, + subquery: {table: 'other', alias: 'zsubq_rel'}, + }, + }, + { + type: 'correlatedSubquery', + op: 'EXISTS', + flip: false, + related: { + correlation: {parentField: ['id'], childField: ['id']}, + subquery: {table: 'other', alias: 'zsubq_rel'}, + }, + }, + ], + }, + }; + + const flips = ( + normalizeAST(ast).where as unknown as {conditions: {flip?: boolean}[]} + ).conditions.map(c => c.flip); + // undefined < false < true + expect(flips).toEqual([undefined, false, true]); + + // correlatedSubquery conditions differing only in scalar sort deterministically + ast = { + table: 'table', + where: { + type: 'and', + conditions: [ + { + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: {parentField: ['id'], childField: ['id']}, + subquery: {table: 'other', alias: 'zsubq_rel'}, + }, + }, + { + type: 'correlatedSubquery', + op: 'EXISTS', + related: { + correlation: {parentField: ['id'], childField: ['id']}, + subquery: {table: 'other', alias: 'zsubq_rel'}, + }, + }, + { + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: false, + related: { + correlation: {parentField: ['id'], childField: ['id']}, + subquery: {table: 'other', alias: 'zsubq_rel'}, + }, + }, + ], + }, + }; + + const scalars = ( + normalizeAST(ast).where as unknown as {conditions: {scalar?: boolean}[]} + ).conditions.map(c => c.scalar); + // undefined < false < true + expect(scalars).toEqual([undefined, false, true]); }); test('related subqueries are sorted', () => { @@ -606,6 +690,6 @@ test('protocol version', () => { // If this test fails because the AST schema has changed such that // old code will not understand the new schema, bump the // PROTOCOL_VERSION and update the expected values. - expect(hash).toEqual('1b4tkghe24u7q'); - expect(PROTOCOL_VERSION).toBe(48); + expect(hash).toEqual('1dsf0svqtvyhv'); + expect(PROTOCOL_VERSION).toBe(49); }); diff --git a/packages/zero-protocol/src/ast.ts b/packages/zero-protocol/src/ast.ts index 8ebda7d8c9..66f5e73086 100644 --- a/packages/zero-protocol/src/ast.ts +++ b/packages/zero-protocol/src/ast.ts @@ -123,15 +123,7 @@ export const correlatedSubqueryConditionSchema: v.Type correlatedSubquerySchema), op: correlatedSubqueryConditionOperatorSchema, flip: v.boolean().optional(), - }); - -export const scalarSubqueryConditionSchema: v.Type = - v.readonlyObject({ - type: v.literal('scalarSubquery'), - op: v.literalUnion('=', 'IS NOT'), - parentField: v.string(), - subquery: v.lazy(() => astSchema), - childField: v.string(), + scalar: v.boolean().optional(), }); export const conditionSchema: v.Type = v.union( @@ -139,7 +131,6 @@ export const conditionSchema: v.Type = v.union( v.lazy(() => conjunctionSchema), v.lazy(() => disjunctionSchema), correlatedSubqueryConditionSchema, - scalarSubqueryConditionSchema, ); const conjunctionSchema: v.Type = v.readonlyObject({ @@ -302,8 +293,7 @@ export type Condition = | SimpleCondition | Conjunction | Disjunction - | CorrelatedSubqueryCondition - | ScalarSubqueryCondition; + | CorrelatedSubqueryCondition; export type SimpleCondition = { readonly type: 'simple'; @@ -332,19 +322,12 @@ export type CorrelatedSubqueryCondition = { related: CorrelatedSubquery; op: CorrelatedSubqueryConditionOperator; flip?: boolean | undefined; + scalar?: boolean | undefined; [planIdSymbol]?: number | undefined; }; export type CorrelatedSubqueryConditionOperator = 'EXISTS' | 'NOT EXISTS'; -export type ScalarSubqueryCondition = { - type: 'scalarSubquery'; - op: '=' | 'IS NOT'; - parentField: string; - subquery: AST; - childField: string; -}; - interface ASTTransform { tableName(orig: string): string; columnName(origTable: string, origColumn: string): string; @@ -432,13 +415,6 @@ function transformWhere( subquery: transformAST(subquery, transform), }, }; - } else if (where.type === 'scalarSubquery') { - return { - ...where, - parentField: columnName(table, where.parentField), - childField: columnName(where.subquery.table, where.childField), - subquery: transformAST(where.subquery, transform), - }; } return { @@ -519,24 +495,15 @@ function cmpCondition(a: Condition, b: Condition): number { if (b.type !== 'correlatedSubquery') { return -1; // Order subquery before conjuctions/disjuctions } - return cmpRelated(a.related, b.related) || compareUTF8MaybeNull(a.op, b.op); - } - if (b.type === 'correlatedSubquery') { - return -1; // Order correlatedSubquery before conjuctions/disjuctions - } - - if (a.type === 'scalarSubquery') { - if (b.type !== 'scalarSubquery') { - return -1; // Order scalarSubquery before conjunctions/disjunctions - } return ( - compareUTF8(a.parentField, b.parentField) || - compareUTF8(a.childField, b.childField) || - compareUTF8MaybeNull(a.op, b.op) + cmpRelated(a.related, b.related) || + compareUTF8MaybeNull(a.op, b.op) || + cmpOptionalBool(a.flip, b.flip) || + cmpOptionalBool(a.scalar, b.scalar) ); } - if (b.type === 'scalarSubquery') { - return 1; + if (b.type === 'correlatedSubquery') { + return -1; // Order correlatedSubquery before conjuctions/disjuctions } const val = compareUTF8MaybeNull(a.type, b.type); @@ -591,11 +558,7 @@ function cmpRelated(a: CorrelatedSubquery, b: CorrelatedSubquery): number { * empty Conjunctions. */ function flattened(cond: Condition): Condition | undefined { - if ( - cond.type === 'simple' || - cond.type === 'correlatedSubquery' || - cond.type === 'scalarSubquery' - ) { + if (cond.type === 'simple' || cond.type === 'correlatedSubquery') { return cond; } const conditions = defined( @@ -629,3 +592,12 @@ function compareUTF8MaybeNull(a: string | null, b: string | null): number { } return 0; } + +function cmpOptionalBool( + a: boolean | undefined, + b: boolean | undefined, +): number { + // undefined < false < true + const toNum = (v: boolean | undefined) => (v === undefined ? 0 : v ? 2 : 1); + return toNum(a) - toNum(b); +} diff --git a/packages/zero-protocol/src/protocol-version.test.ts b/packages/zero-protocol/src/protocol-version.test.ts index 563454a3b4..61ccc53e79 100644 --- a/packages/zero-protocol/src/protocol-version.test.ts +++ b/packages/zero-protocol/src/protocol-version.test.ts @@ -11,6 +11,6 @@ test('protocol version', () => { // If this test fails upstream or downstream schema has changed such that // old code will not understand the new schema, bump the // PROTOCOL_VERSION and update the expected values. - expect(hash).toEqual('2vvhsgs7kt1fg'); - expect(PROTOCOL_VERSION).toBe(48); + expect(hash).toEqual('21ccxnub12gy6'); + expect(PROTOCOL_VERSION).toBe(49); }); diff --git a/packages/zero-protocol/src/protocol-version.ts b/packages/zero-protocol/src/protocol-version.ts index 675e0f1f2a..36a0779184 100644 --- a/packages/zero-protocol/src/protocol-version.ts +++ b/packages/zero-protocol/src/protocol-version.ts @@ -54,7 +54,8 @@ import {assert} from '../../shared/src/asserts.ts'; // -- version 46 adds scalarSubquery condition type to AST // -- version 47 adds optional auth token to push body // -- version 48 adds updateAuth -export const PROTOCOL_VERSION = 48; +// -- version 49 adds `scalar` to CorrelatedSubqueryCondition, removes scalarSubquery +export const PROTOCOL_VERSION = 49; /** * The minimum server-supported sync protocol version (i.e. the version diff --git a/packages/zql-integration-tests/src/chinook/chinook.pg.test.ts b/packages/zql-integration-tests/src/chinook/chinook.pg.test.ts index 0370963f08..071eef8560 100644 --- a/packages/zql-integration-tests/src/chinook/chinook.pg.test.ts +++ b/packages/zql-integration-tests/src/chinook/chinook.pg.test.ts @@ -147,27 +147,20 @@ describe( { name: 'Scalar subquery: tracks for album by title', createQuery: q => - q.track.where(({cmp, scalar}) => - cmp( - 'albumId', - scalar(q.album.where('title', 'Riot Act'), 'id'), - ), - ), + q.track.whereExists('album', a => a.where('title', 'Riot Act'), { + scalar: true, + }), }, // Note: IS NOT scalar subquery is not tested here because it rewrites to // NOT EXISTS which is not supported on the memory backend. { name: 'Scalar subquery: with and combinator', createQuery: q => - q.track.where(({and, cmp, scalar}) => - and( - cmp( - 'albumId', - scalar(q.album.where('title', 'Riot Act'), 'id'), - ), - cmp('name', 'LIKE', '%Mine%'), - ), - ), + q.track + .whereExists('album', a => a.where('title', 'Riot Act'), { + scalar: true, + }) + .where('name', 'LIKE', '%Mine%'), }, { name: 'Prefix like', diff --git a/packages/zql-integration-tests/src/chinook/planner-controlled.test.ts b/packages/zql-integration-tests/src/chinook/planner-controlled.test.ts index 6fca3cd61f..df4ad0298d 100644 --- a/packages/zql-integration-tests/src/chinook/planner-controlled.test.ts +++ b/packages/zql-integration-tests/src/chinook/planner-controlled.test.ts @@ -31,7 +31,7 @@ function normalizeFlipFlags(ast: AST): AST { } function normalizeConditionFlipFlags(condition: Condition): Condition { - if (condition.type === 'simple' || condition.type === 'scalarSubquery') { + if (condition.type === 'simple') { return condition; } diff --git a/packages/zql/src/builder/builder.ts b/packages/zql/src/builder/builder.ts index 9b8dc58b28..e21f4a2bfb 100644 --- a/packages/zql/src/builder/builder.ts +++ b/packages/zql/src/builder/builder.ts @@ -14,7 +14,6 @@ import type { LiteralValue, Ordering, Parameter, - ScalarSubqueryCondition, SimpleCondition, ValuePosition, } from '../../../zero-protocol/src/ast.ts'; @@ -136,7 +135,7 @@ export function buildPipeline( ast, tableName => must(delegate.getSource(tableName)).tableSchema.primaryKey, ); - ast = rewriteScalarSubqueriesInAST(ast); + if (costModel) { ast = planQuery(ast, costModel, planDebugger, lc); } @@ -176,12 +175,7 @@ export function bindStaticParameters( }, }; } - if (condition.type === 'scalarSubquery') { - return { - ...condition, - subquery: visit(condition.subquery), - }; - } + return { ...condition, conditions: condition.conditions.map(bindCondition), @@ -237,7 +231,6 @@ const PERMISSIONS_EXISTS_LIMIT = 1; export function assertNoNotExists(condition: Condition): void { switch (condition.type) { case 'simple': - case 'scalarSubquery': return; case 'correlatedSubquery': @@ -259,70 +252,6 @@ export function assertNoNotExists(condition: Condition): void { } } -function rewriteScalarSubqueriesInCondition(condition: Condition): Condition { - if (condition.type === 'scalarSubquery') { - return rewriteScalarSubquery({ - ...condition, - subquery: rewriteScalarSubqueriesInAST(condition.subquery), - }); - } - if (condition.type === 'correlatedSubquery') { - return { - ...condition, - related: { - ...condition.related, - subquery: rewriteScalarSubqueriesInAST(condition.related.subquery), - }, - }; - } - if (condition.type === 'and' || condition.type === 'or') { - return { - type: condition.type, - conditions: condition.conditions.map(rewriteScalarSubqueriesInCondition), - }; - } - return condition; -} - -function rewriteScalarSubqueriesInAST(ast: AST): AST { - return { - ...ast, - where: ast.where - ? rewriteScalarSubqueriesInCondition(ast.where) - : undefined, - related: ast.related?.map(sq => ({ - ...sq, - subquery: rewriteScalarSubqueriesInAST(sq.subquery), - })), - }; -} - -function rewriteScalarSubquery(condition: ScalarSubqueryCondition): Condition { - const correlated: CorrelatedSubquery = { - correlation: { - parentField: [condition.parentField], - childField: [condition.childField], - }, - subquery: condition.subquery, - }; - - if (condition.op === '=') { - // field = (SELECT col FROM ...) rewrites to EXISTS with correlation - return { - type: 'correlatedSubquery', - related: correlated, - op: 'EXISTS', - }; - } - - // field IS NOT (SELECT col FROM ...) rewrites to NOT EXISTS with correlation - return { - type: 'correlatedSubquery', - related: correlated, - op: 'NOT EXISTS', - }; -} - function buildPipelineInternal( ast: AST, delegate: BuilderDelegate, @@ -562,10 +491,6 @@ function applyFilter( return applyCorrelatedSubqueryCondition(input, condition, delegate, name); case 'simple': return applySimpleCondition(input, delegate, condition); - case 'scalarSubquery': - // Scalar subqueries are rewritten to correlated subqueries before - // the filter pipeline is built, so this should not be reached. - throw new Error('Unexpected scalarSubquery in applyFilter'); } } @@ -644,10 +569,7 @@ export function groupSubqueryConditions(condition: Disjunction) { export function isNotAndDoesNotContainSubquery( condition: Condition, ): condition is NoSubqueryCondition { - if ( - condition.type === 'correlatedSubquery' || - condition.type === 'scalarSubquery' - ) { + if (condition.type === 'correlatedSubquery') { return false; } if (condition.type === 'simple') { @@ -812,7 +734,7 @@ function uniquifyCorrelatedSubqueryConditionAliases(ast: AST): AST { }); const uniquify = (cond: Condition): Condition => { - if (cond.type === 'simple' || cond.type === 'scalarSubquery') { + if (cond.type === 'simple') { return cond; } else if (cond.type === 'correlatedSubquery') { return uniquifyCorrelatedSubquery(cond); @@ -845,7 +767,7 @@ export function conditionIncludesFlippedSubqueryAtAnyLevel( conditionIncludesFlippedSubqueryAtAnyLevel(c), ); } - // simple and scalarSubquery don't have flips + // simple conditions don't have flips return false; } diff --git a/packages/zql/src/builder/filter.ts b/packages/zql/src/builder/filter.ts index 24effdc789..4bc487960e 100644 --- a/packages/zql/src/builder/filter.ts +++ b/packages/zql/src/builder/filter.ts @@ -170,7 +170,6 @@ export function transformFilters(filters: Condition | undefined): { case 'simple': return {filters, conditionsRemoved: false}; case 'correlatedSubquery': - case 'scalarSubquery': return {filters: undefined, conditionsRemoved: true}; case 'and': case 'or': { diff --git a/packages/zql/src/planner/planner-builder.ts b/packages/zql/src/planner/planner-builder.ts index 3a2fddff55..29eea8882a 100644 --- a/packages/zql/src/planner/planner-builder.ts +++ b/packages/zql/src/planner/planner-builder.ts @@ -107,7 +107,6 @@ function processCondition( ): Exclude { switch (condition.type) { case 'simple': - case 'scalarSubquery': return input; case 'and': return processAnd(condition, input, graph, model, parentTable, getPlanId); @@ -287,7 +286,7 @@ function hasCorrelatedSubquery(condition: Condition): boolean { if (condition.type === 'and' || condition.type === 'or') { return condition.conditions.some(hasCorrelatedSubquery); } - // simple and scalarSubquery don't contain correlated subqueries + // simple conditions don't contain correlated subqueries return false; } @@ -324,7 +323,7 @@ function applyToCondition( condition: Condition, flippedIds: Set, ): Condition { - if (condition.type === 'simple' || condition.type === 'scalarSubquery') { + if (condition.type === 'simple') { return condition; } diff --git a/packages/zql/src/query/complete-ordering.test.ts b/packages/zql/src/query/complete-ordering.test.ts index 014411a11a..42d80dd2ce 100644 --- a/packages/zql/src/query/complete-ordering.test.ts +++ b/packages/zql/src/query/complete-ordering.test.ts @@ -238,7 +238,6 @@ describe('completeOrdering', () => { { "table": "issue", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -253,7 +252,6 @@ describe('completeOrdering', () => { "alias": "zsubq_labels", "table": "issueLabel", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -281,72 +279,70 @@ describe('completeOrdering', () => { `); expect(completeOrdering(ast(issueQuery), getPrimaryKey)) .toMatchInlineSnapshot(` - { - "orderBy": [ - [ - "id", - "asc", + { + "orderBy": [ + [ + "id", + "asc", + ], ], - ], - "table": "issue", - "where": { - "flip": undefined, - "op": "EXISTS", - "related": { - "correlation": { - "childField": [ - "issueId", - ], - "parentField": [ - "id", - ], - }, - "subquery": { - "alias": "zsubq_labels", - "orderBy": [ - [ + "table": "issue", + "where": { + "op": "EXISTS", + "related": { + "correlation": { + "childField": [ "issueId", - "asc", ], - [ - "labelId", - "asc", + "parentField": [ + "id", ], - ], - "table": "issueLabel", - "where": { - "flip": undefined, - "op": "EXISTS", - "related": { - "correlation": { - "childField": [ - "id", - ], - "parentField": [ - "labelId", - ], - }, - "subquery": { - "alias": "zsubq_zhidden_labels", - "orderBy": [ - [ + }, + "subquery": { + "alias": "zsubq_labels", + "orderBy": [ + [ + "issueId", + "asc", + ], + [ + "labelId", + "asc", + ], + ], + "table": "issueLabel", + "where": { + "op": "EXISTS", + "related": { + "correlation": { + "childField": [ "id", - "asc", ], - ], - "table": "label", + "parentField": [ + "labelId", + ], + }, + "subquery": { + "alias": "zsubq_zhidden_labels", + "orderBy": [ + [ + "id", + "asc", + ], + ], + "table": "label", + }, + "system": "client", }, - "system": "client", + "type": "correlatedSubquery", }, - "type": "correlatedSubquery", }, + "system": "client", }, - "system": "client", + "type": "correlatedSubquery", }, - "type": "correlatedSubquery", - }, - } - `); + } + `); }); test('exists in compound condition', () => { @@ -377,7 +373,6 @@ describe('completeOrdering', () => { "type": "simple", }, { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -411,7 +406,6 @@ describe('completeOrdering', () => { "type": "simple", }, { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -440,101 +434,99 @@ describe('completeOrdering', () => { `); expect(completeOrdering(ast(issueQuery), getPrimaryKey)) .toMatchInlineSnapshot(` - { - "orderBy": [ - [ - "id", - "asc", + { + "orderBy": [ + [ + "id", + "asc", + ], ], - ], - "table": "issue", - "where": { - "conditions": [ - { - "left": { - "name": "id", - "type": "column", - }, - "op": "=", - "right": { - "type": "literal", - "value": "1", - }, - "type": "simple", - }, - { - "flip": undefined, - "op": "EXISTS", - "related": { - "correlation": { - "childField": [ - "id", - ], - "parentField": [ - "ownerId", - ], + "table": "issue", + "where": { + "conditions": [ + { + "left": { + "name": "id", + "type": "column", }, - "subquery": { - "alias": "zsubq_owner", - "orderBy": [ - [ - "id", - "asc", - ], - ], - "table": "user", + "op": "=", + "right": { + "type": "literal", + "value": "1", }, - "system": "client", + "type": "simple", }, - "type": "correlatedSubquery", - }, - { - "conditions": [ - { - "left": { - "name": "ownerId", - "type": "column", - }, - "op": "=", - "right": { - "type": "literal", - "value": "2", + { + "op": "EXISTS", + "related": { + "correlation": { + "childField": [ + "id", + ], + "parentField": [ + "ownerId", + ], }, - "type": "simple", - }, - { - "flip": undefined, - "op": "EXISTS", - "related": { - "correlation": { - "childField": [ - "issueId", - ], - "parentField": [ + "subquery": { + "alias": "zsubq_owner", + "orderBy": [ + [ "id", + "asc", ], + ], + "table": "user", + }, + "system": "client", + }, + "type": "correlatedSubquery", + }, + { + "conditions": [ + { + "left": { + "name": "ownerId", + "type": "column", }, - "subquery": { - "alias": "zsubq_comments", - "orderBy": [ - [ + "op": "=", + "right": { + "type": "literal", + "value": "2", + }, + "type": "simple", + }, + { + "op": "EXISTS", + "related": { + "correlation": { + "childField": [ + "issueId", + ], + "parentField": [ "id", - "asc", ], - ], - "table": "comment", + }, + "subquery": { + "alias": "zsubq_comments", + "orderBy": [ + [ + "id", + "asc", + ], + ], + "table": "comment", + }, + "system": "client", }, - "system": "client", + "type": "correlatedSubquery", }, - "type": "correlatedSubquery", - }, - ], - "type": "or", - }, - ], - "type": "and", - }, - } - `); + ], + "type": "or", + }, + ], + "type": "and", + }, + } + `); }); }); diff --git a/packages/zql/src/query/complete-ordering.ts b/packages/zql/src/query/complete-ordering.ts index 465af6639e..34175b0ad5 100644 --- a/packages/zql/src/query/complete-ordering.ts +++ b/packages/zql/src/query/complete-ordering.ts @@ -62,12 +62,6 @@ function completeOrderingInCondition( }, }; } - if (condition.type === 'scalarSubquery') { - return { - ...condition, - subquery: completeOrdering(condition.subquery, getPrimaryKey), - }; - } condition.type satisfies 'and' | 'or'; return { ...condition, diff --git a/packages/zql/src/query/expression-test-util.ts b/packages/zql/src/query/expression-test-util.ts index bd886a6753..fb71d58a21 100644 --- a/packages/zql/src/query/expression-test-util.ts +++ b/packages/zql/src/query/expression-test-util.ts @@ -174,8 +174,6 @@ export function stringify(c: Condition): string { .join(c.type === 'and' ? ' & ' : ' | '); case 'correlatedSubquery': return c.op + ' ()'; - case 'scalarSubquery': - return `${c.parentField} ${c.op} (SCALAR)`; } } function eat(tokens: string[], expectedToken: string) { diff --git a/packages/zql/src/query/expression.test.ts b/packages/zql/src/query/expression.test.ts index bea065cb34..df826e42a8 100644 --- a/packages/zql/src/query/expression.test.ts +++ b/packages/zql/src/query/expression.test.ts @@ -203,7 +203,6 @@ test('compare test framework to real framework', () => { const check = (c: Condition): boolean => c.type === 'simple' || c.type === 'correlatedSubquery' || - c.type === 'scalarSubquery' || c.conditions.every(child => child.type !== c.type && check(child)); expect(check(actual)).toBe(true); }), @@ -289,6 +288,59 @@ test('not', () => { ); }); +test('not preserves flip and scalar on correlatedSubquery', () => { + const base: Condition = { + type: 'correlatedSubquery', + related: { + correlation: {parentField: ['ownerId'], childField: ['id']}, + subquery: {table: 'user', alias: 'zsubq_owner'}, + }, + op: 'EXISTS', + }; + + // flip: true is preserved + const withFlipTrue = not({...base, flip: true}); + assert(withFlipTrue.type === 'correlatedSubquery'); + expect(withFlipTrue.op).toBe('NOT EXISTS'); + expect(withFlipTrue.flip).toBe(true); + + // flip: false is preserved (not dropped) + const withFlipFalse = not({...base, flip: false}); + assert(withFlipFalse.type === 'correlatedSubquery'); + expect(withFlipFalse.op).toBe('NOT EXISTS'); + expect(withFlipFalse.flip).toBe(false); + + // flip: undefined is not present + const withFlipUndefined = not({...base}); + assert(withFlipUndefined.type === 'correlatedSubquery'); + expect(withFlipUndefined.op).toBe('NOT EXISTS'); + expect('flip' in withFlipUndefined).toBe(false); + + // scalar: true is preserved + const withScalarTrue = not({...base, scalar: true}); + assert(withScalarTrue.type === 'correlatedSubquery'); + expect(withScalarTrue.op).toBe('NOT EXISTS'); + expect(withScalarTrue.scalar).toBe(true); + + // scalar: false is preserved (not dropped) + const withScalarFalse = not({...base, scalar: false}); + assert(withScalarFalse.type === 'correlatedSubquery'); + expect(withScalarFalse.op).toBe('NOT EXISTS'); + expect(withScalarFalse.scalar).toBe(false); + + // scalar: undefined is not present + const withScalarUndefined = not({...base}); + assert(withScalarUndefined.type === 'correlatedSubquery'); + expect('scalar' in withScalarUndefined).toBe(false); + + // both flip and scalar preserved together + const withBoth = not({...base, flip: false, scalar: true}); + assert(withBoth.type === 'correlatedSubquery'); + expect(withBoth.op).toBe('NOT EXISTS'); + expect(withBoth.flip).toBe(false); + expect(withBoth.scalar).toBe(true); +}); + test('bound methods/properties', () => { type Exists = ConstructorParameters[0]; const mock = vi.fn(); diff --git a/packages/zql/src/query/expression.ts b/packages/zql/src/query/expression.ts index c933ce5a4d..d2d7988a2d 100644 --- a/packages/zql/src/query/expression.ts +++ b/packages/zql/src/query/expression.ts @@ -2,15 +2,12 @@ import {must} from '../../../shared/src/must.ts'; import { toStaticParam, - SUBQ_PREFIX, - type AST, type Condition, type LiteralValue, type Parameter, type SimpleOperator, } from '../../../zero-protocol/src/ast.ts'; import type {Schema as ZeroSchema} from '../../../zero-types/src/schema.ts'; -import {asQueryInternals} from './query-internals.ts'; import type { AvailableRelationships, DestTableName, @@ -25,24 +22,6 @@ export type ParameterReference = { [toStaticParam](): Parameter; }; -export const toScalarRef = Symbol('toScalarRef'); - -export type ScalarReference = { - readonly [toScalarRef]: { - readonly ast: AST; - readonly column: string; - }; -}; - -export function isScalarReference(value: unknown): value is ScalarReference { - return ( - value !== null && - value !== undefined && - typeof value === 'object' && - toScalarRef in (value as Record) - ); -} - /** * A factory function that creates a condition. This is used to create * complex conditions that can be passed to the `where` method of a query. @@ -85,19 +64,12 @@ export class ExpressionBuilder< ) { this.#exists = exists; this.exists = this.exists.bind(this); - this.scalar = this.scalar.bind(this); } get eb() { return this; } - cmp< - TSelector extends NoCompoundTypeSelector>, - >(field: TSelector, op: '=' | 'IS NOT', value: ScalarReference): Condition; - cmp< - TSelector extends NoCompoundTypeSelector>, - >(field: TSelector, value: ScalarReference): Condition; cmp< TSelector extends NoCompoundTypeSelector>, TOperator extends SimpleOperator, @@ -120,13 +92,8 @@ export class ExpressionBuilder< ): Condition; cmp( field: string, - opOrValue: - | SimpleOperator - | ParameterReference - | ScalarReference - | LiteralValue - | undefined, - value?: ParameterReference | ScalarReference | LiteralValue | undefined, + opOrValue: SimpleOperator | ParameterReference | LiteralValue | undefined, + value?: ParameterReference | LiteralValue | undefined, ): Condition { if (arguments.length === 2) { return cmp(field, opOrValue); @@ -162,25 +129,6 @@ export class ExpressionBuilder< ) => Query, options?: ExistsOptions, ): Condition => this.#exists(relationship, cb, options); - - /** - * EXPERIMENTAL. Use at your own risk. - * Currently this has no benefit over `whereExists` - * In future versions, scalar subqueries will unlock query optimizations - * that are not possible with `whereExists` - */ - scalar = ( - query: Query, - column: string, - ): ScalarReference => { - const qi = asQueryInternals(query); - return { - [toScalarRef]: { - ast: {...qi.ast, limit: 1}, - column, - }, - }; - }; } export function and(...conditions: (Condition | undefined)[]): Condition { @@ -228,11 +176,8 @@ export function not(expression: Condition): Condition { type: 'correlatedSubquery', related: expression.related, op: negateOperator(expression.op), - }; - case 'scalarSubquery': - return { - ...expression, - op: expression.op === '=' ? 'IS NOT' : '=', + ...(expression.flip !== undefined ? {flip: expression.flip} : {}), + ...(expression.scalar !== undefined ? {scalar: expression.scalar} : {}), }; case 'simple': return { @@ -246,28 +191,15 @@ export function not(expression: Condition): Condition { export function cmp( field: string, - opOrValue: - | SimpleOperator - | ParameterReference - | ScalarReference - | LiteralValue - | undefined, - value?: ParameterReference | ScalarReference | LiteralValue | undefined, + opOrValue: SimpleOperator | ParameterReference | LiteralValue | undefined, + value?: ParameterReference | LiteralValue | undefined, ): Condition { let op: SimpleOperator; - let actualValue: - | ParameterReference - | ScalarReference - | LiteralValue - | undefined; + let actualValue: ParameterReference | LiteralValue | undefined; if (arguments.length === 2) { // 2-arg form: cmp(field, value) - defaults to '=' operator - actualValue = opOrValue as - | ParameterReference - | ScalarReference - | LiteralValue - | undefined; + actualValue = opOrValue as ParameterReference | LiteralValue | undefined; op = '='; } else { // 3-arg form: cmp(field, op, value) @@ -275,25 +207,6 @@ export function cmp( actualValue = value; } - if (isScalarReference(actualValue)) { - if (op !== '=' && op !== 'IS NOT') { - throw new Error( - `Scalar subqueries only support '=' and 'IS NOT' operators, got '${op}'`, - ); - } - const subqueryAst = actualValue[toScalarRef].ast; - return { - type: 'scalarSubquery', - op, - parentField: field, - childField: actualValue[toScalarRef].column, - subquery: { - ...subqueryAst, - alias: subqueryAst.alias ?? `${SUBQ_PREFIX}scalar_${subqueryAst.table}`, - }, - }; - } - return { type: 'simple', left: {type: 'column', name: field}, @@ -334,11 +247,7 @@ function isAlwaysFalse(condition: Condition): boolean { } export function simplifyCondition(c: Condition): Condition { - if ( - c.type === 'simple' || - c.type === 'correlatedSubquery' || - c.type === 'scalarSubquery' - ) { + if (c.type === 'simple' || c.type === 'correlatedSubquery') { return c; } if (c.conditions.length === 1) { diff --git a/packages/zql/src/query/query-impl.ast.test.ts b/packages/zql/src/query/query-impl.ast.test.ts index b66ed6fc7e..610650e3c0 100644 --- a/packages/zql/src/query/query-impl.ast.test.ts +++ b/packages/zql/src/query/query-impl.ast.test.ts @@ -6,8 +6,6 @@ import {type AnyQuery} from './query.ts'; import {newStaticQuery} from './static-query.ts'; import {schema} from './test/test-schemas.ts'; -const userQuery = newQuery(schema, 'user'); - function ast(q: AnyQuery) { return asQueryInternals(q).ast; } @@ -29,7 +27,6 @@ describe('building the AST', () => { { "table": "issue", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -44,7 +41,6 @@ describe('building the AST', () => { "alias": "zsubq_labels", "table": "issueLabel", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1404,7 +1400,6 @@ describe('exists', () => { { "table": "issue", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1431,7 +1426,6 @@ describe('exists', () => { { "table": "issue", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1462,7 +1456,6 @@ describe('exists', () => { { "table": "issue", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1506,7 +1499,6 @@ describe('exists', () => { { "table": "issue", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1565,7 +1557,6 @@ describe('exists', () => { { "table": "issue", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1580,7 +1571,6 @@ describe('exists', () => { "alias": "zsubq_labels", "table": "issueLabel", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1623,7 +1613,6 @@ describe('exists', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1643,7 +1632,6 @@ describe('exists', () => { "type": "correlatedSubquery", }, { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1723,7 +1711,6 @@ describe('exists', () => { "alias": "zsubq_labels", "table": "issueLabel", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1767,7 +1754,6 @@ describe('exists', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1787,7 +1773,6 @@ describe('exists', () => { "type": "correlatedSubquery", }, { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1807,7 +1792,6 @@ describe('exists', () => { "type": "correlatedSubquery", }, { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -1822,7 +1806,6 @@ describe('exists', () => { "alias": "zsubq_labels", "table": "issueLabel", "where": { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -2032,7 +2015,6 @@ describe('exists', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -2064,7 +2046,6 @@ describe('exists', () => { "type": "correlatedSubquery", }, { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { @@ -2126,138 +2107,89 @@ test('one in schema should not imply limit 1 in the ast -- the user needs to get }); }); -describe('scalar subquery via cmp + scalar', () => { - test('scalar with default = op', () => { - const issueQuery = newQuery(schema, 'issue'); - - expect( - ast( - issueQuery.where(({cmp, scalar}) => - cmp('ownerId', scalar(userQuery, 'id')), - ), - ), - ).toMatchInlineSnapshot(` - { - "table": "issue", - "where": { - "childField": "id", - "op": "=", - "parentField": "ownerId", - "subquery": { - "alias": "zsubq_scalar_user", - "limit": 1, - "table": "user", - }, - "type": "scalarSubquery", - }, - } - `); - }); - - test('scalar with IS NOT op', () => { - const issueQuery = newQuery(schema, 'issue'); +test('scalar option throws on two-hop relationship', () => { + const issueQuery = newQuery(schema, 'issue'); - expect( - ast( - issueQuery.where(({cmp, scalar}) => - cmp('ownerId', 'IS NOT', scalar(userQuery, 'id')), - ), - ), - ).toMatchInlineSnapshot(` - { - "table": "issue", - "where": { - "childField": "id", - "op": "IS NOT", - "parentField": "ownerId", - "subquery": { - "alias": "zsubq_scalar_user", - "limit": 1, - "table": "user", - }, - "type": "scalarSubquery", - }, - } - `); - }); + expect(() => issueQuery.whereExists('labels', {scalar: true})).toThrow( + 'scalar option only supports one-hop relationships', + ); +}); - test('scalar with where condition on subquery', () => { +describe('whereExists with scalar option', () => { + test('basic scalar exists', () => { const issueQuery = newQuery(schema, 'issue'); - expect( - ast( - issueQuery.where(({cmp, scalar}) => - cmp('ownerId', scalar(userQuery.where('name', 'Alice'), 'id')), - ), - ), - ).toMatchInlineSnapshot(` + expect(ast(issueQuery.whereExists('owner', {scalar: true}))) + .toMatchInlineSnapshot(` { "table": "issue", "where": { - "childField": "id", - "op": "=", - "parentField": "ownerId", - "subquery": { - "alias": "zsubq_scalar_user", - "limit": 1, - "table": "user", - "where": { - "left": { - "name": "name", - "type": "column", - }, - "op": "=", - "right": { - "type": "literal", - "value": "Alice", - }, - "type": "simple", + "op": "EXISTS", + "related": { + "correlation": { + "childField": [ + "id", + ], + "parentField": [ + "ownerId", + ], }, + "subquery": { + "alias": "zsubq_owner", + "table": "user", + }, + "system": "client", }, - "type": "scalarSubquery", + "scalar": true, + "type": "correlatedSubquery", }, } `); }); - test('scalar with IS NOT and where condition', () => { + test('scalar with where condition on subquery', () => { const issueQuery = newQuery(schema, 'issue'); expect( ast( - issueQuery.where(({cmp, scalar}) => - cmp( - 'ownerId', - 'IS NOT', - scalar(userQuery.where('name', 'Alice'), 'id'), - ), - ), + issueQuery.whereExists('owner', q => q.where('name', 'Alice'), { + scalar: true, + }), ), ).toMatchInlineSnapshot(` { "table": "issue", "where": { - "childField": "id", - "op": "IS NOT", - "parentField": "ownerId", - "subquery": { - "alias": "zsubq_scalar_user", - "limit": 1, - "table": "user", - "where": { - "left": { - "name": "name", - "type": "column", - }, - "op": "=", - "right": { - "type": "literal", - "value": "Alice", + "op": "EXISTS", + "related": { + "correlation": { + "childField": [ + "id", + ], + "parentField": [ + "ownerId", + ], + }, + "subquery": { + "alias": "zsubq_owner", + "table": "user", + "where": { + "left": { + "name": "name", + "type": "column", + }, + "op": "=", + "right": { + "type": "literal", + "value": "Alice", + }, + "type": "simple", }, - "type": "simple", }, + "system": "client", }, - "type": "scalarSubquery", + "scalar": true, + "type": "correlatedSubquery", }, } `); @@ -2268,21 +2200,17 @@ describe('scalar subquery via cmp + scalar', () => { expect( ast( - issueQuery.where(({and, cmp, scalar}) => - and( - cmp('ownerId', scalar(userQuery.where('name', 'Alice'), 'id')), - cmp('title', 'LIKE', '%bug%'), - ), - ), + issueQuery + .whereExists('owner', q => q.where('name', 'Alice'), {scalar: true}) + .where('title', 'LIKE', '%bug%'), ).where, ).toMatchObject({ type: 'and', conditions: [ { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'id', + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, }, { type: 'simple', @@ -2292,97 +2220,49 @@ describe('scalar subquery via cmp + scalar', () => { }); }); - test('not(cmp(..., scalar(...)))', () => { + test('not(exists(..., {scalar: true}))', () => { const issueQuery = newQuery(schema, 'issue'); expect( ast( - issueQuery.where(({not, cmp, scalar}) => - not(cmp('ownerId', scalar(userQuery.where('name', 'Alice'), 'id'))), + issueQuery.where(({not, exists}) => + not(exists('owner', q => q.where('name', 'Alice'), {scalar: true})), ), ), ).toMatchInlineSnapshot(` { "table": "issue", "where": { - "childField": "id", - "op": "IS NOT", - "parentField": "ownerId", - "subquery": { - "alias": "zsubq_scalar_user", - "limit": 1, - "table": "user", - "where": { - "left": { - "name": "name", - "type": "column", - }, - "op": "=", - "right": { - "type": "literal", - "value": "Alice", - }, - "type": "simple", + "op": "NOT EXISTS", + "related": { + "correlation": { + "childField": [ + "id", + ], + "parentField": [ + "ownerId", + ], }, - }, - "type": "scalarSubquery", - }, - } - `); - }); -}); - -describe('whereScalar', () => { - test('basic (no callback)', () => { - const issueQuery = newQuery(schema, 'issue'); - - expect(ast(issueQuery.whereScalar('owner'))).toMatchInlineSnapshot(` - { - "table": "issue", - "where": { - "childField": "id", - "op": "=", - "parentField": "ownerId", - "subquery": { - "alias": "zsubq_owner", - "limit": 1, - "table": "user", - }, - "type": "scalarSubquery", - }, - } - `); - }); - - test('with callback', () => { - const issueQuery = newQuery(schema, 'issue'); - - expect(ast(issueQuery.whereScalar('owner', q => q.where('name', 'Alice')))) - .toMatchInlineSnapshot(` - { - "table": "issue", - "where": { - "childField": "id", - "op": "=", - "parentField": "ownerId", - "subquery": { - "alias": "zsubq_owner", - "limit": 1, - "table": "user", - "where": { - "left": { - "name": "name", - "type": "column", - }, - "op": "=", - "right": { - "type": "literal", - "value": "Alice", + "subquery": { + "alias": "zsubq_owner", + "table": "user", + "where": { + "left": { + "name": "name", + "type": "column", + }, + "op": "=", + "right": { + "type": "literal", + "value": "Alice", + }, + "type": "simple", }, - "type": "simple", }, + "system": "client", }, - "type": "scalarSubquery", + "scalar": true, + "type": "correlatedSubquery", }, } `); @@ -2392,17 +2272,16 @@ describe('whereScalar', () => { const issueQuery = newQuery(schema, 'issue'); const q = issueQuery - .whereScalar('owner', q => q.where('name', 'Alice')) + .whereExists('owner', q => q.where('name', 'Alice'), {scalar: true}) .where('closed', false); expect(ast(q).where).toMatchObject({ type: 'and', conditions: [ { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'id', + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, }, { type: 'simple', @@ -2411,12 +2290,4 @@ describe('whereScalar', () => { ], }); }); - - test('two-hop relationship throws', () => { - const issueQuery = newQuery(schema, 'issue'); - - expect(() => issueQuery.whereScalar('labels')).toThrow( - 'whereScalar only supports one-hop relationships', - ); - }); }); diff --git a/packages/zql/src/query/query-impl.ts b/packages/zql/src/query/query-impl.ts index 57550ae47c..7eaa2eb567 100644 --- a/packages/zql/src/query/query-impl.ts +++ b/packages/zql/src/query/query-impl.ts @@ -199,25 +199,12 @@ export class QueryImpl< ): Query => { const cb = typeof cbOrOptions === 'function' ? cbOrOptions : undefined; const opts = typeof cbOrOptions === 'function' ? options : cbOrOptions; - const flipped = opts?.flip; - return this.where(({exists}) => - exists( - relationship, - cb, - flipped !== undefined ? {flip: flipped} : undefined, - ), - ) as Query; - }; - - whereScalar = ( - relationship: string, - cb?: (q: AnyQuery) => AnyQuery, - ): Query => - this.where(() => this.#scalarSubquery(relationship, cb)) as Query< + return this.where(({exists}) => exists(relationship, cb, opts)) as Query< TTable, TSchema, TReturn >; + }; related = ( relationship: string, @@ -480,6 +467,7 @@ export class QueryImpl< ): Condition => { cb = cb ?? (q => q); const flip = options?.flip; + const scalar = options?.scalar; const related = this.#schema.relationships[this.#tableName][relationship]; assert(related, 'Invalid relationship'); @@ -513,10 +501,13 @@ export class QueryImpl< subquery: subQuery.#ast, }, op: 'EXISTS', - flip, + ...(flip !== undefined ? {flip} : {}), + ...(scalar !== undefined ? {scalar} : {}), }; } + assert(!scalar, 'scalar option only supports one-hop relationships'); + if (isTwoHop(related)) { const [firstRelation, secondRelation] = related; assert(isCompoundKey(firstRelation.sourceField), 'Invalid relationship'); @@ -560,62 +551,18 @@ export class QueryImpl< subquery: asQueryImpl(queryToDest).#ast, }, op: 'EXISTS', - flip, + ...(flip !== undefined ? {flip} : {}), }, }, }, op: 'EXISTS', - flip, + ...(flip !== undefined ? {flip} : {}), }; } throw new Error(`Invalid relationship ${relationship}`); }; - #scalarSubquery = ( - relationship: string, - cb: ((query: AnyQuery) => AnyQuery) | undefined, - ): Condition => { - cb = cb ?? (q => q); - const related = this.#schema.relationships[this.#tableName][relationship]; - assert(related, 'Invalid relationship'); - assert( - isOneHop(related), - 'whereScalar only supports one-hop relationships', - ); - - const {destSchema: destTableName, sourceField, destField} = related[0]; - assert(isCompoundKey(sourceField), 'Invalid relationship'); - assert(isCompoundKey(destField), 'Invalid relationship'); - assert( - sourceField.length === 1 && destField.length === 1, - 'whereScalar only supports single-field relationships', - ); - - const subQuery = asQueryImpl( - cb( - this.#newQuery( - destTableName, - { - table: destTableName, - alias: `${SUBQ_PREFIX}${relationship}`, - }, - defaultFormat, - this.customQueryID, - undefined, - ), - ), - ); - - return { - type: 'scalarSubquery', - op: '=', - parentField: sourceField[0], - childField: destField[0], - subquery: {...subQuery.#ast, limit: 1}, - }; - }; - get ast(): AST { return this.#ast; } diff --git a/packages/zql/src/query/query.test.ts b/packages/zql/src/query/query.test.ts index 15db6eedb1..fa6696ad3b 100644 --- a/packages/zql/src/query/query.test.ts +++ b/packages/zql/src/query/query.test.ts @@ -967,40 +967,6 @@ describe('Where expression factory and builder', () => { query.where(({not, exists}) => not(exists('self'))); }); - test('scalar', () => { - const query = mockQuery as unknown as Query< - 'testWithMoreRelationships', - Schema - >; - - const selfQuery = mockQuery as unknown as Query< - 'testWithMoreRelationships', - Schema - >; - - const testRelQuery = mockQuery as unknown as Query< - 'testWithRelationships', - Schema - >; - - const testQuery = mockQuery as unknown as Query<'test', Schema>; - - // scalar in cmp - valid destination table (self) - query.where(({cmp, scalar}) => cmp('s', scalar(selfQuery, 's'))); - - // scalar in cmp with IS NOT op - query.where(({cmp, scalar}) => cmp('s', 'IS NOT', scalar(selfQuery, 's'))); - - // scalar with a related table - query.where(({cmp, scalar}) => cmp('a', scalar(testRelQuery, 'a'))); - - // scalar with test table - query.where(({cmp, scalar}) => cmp('s', scalar(testQuery, 's'))); - - // not(cmp(..., scalar(...))) - query.where(({not, cmp, scalar}) => not(cmp('s', scalar(selfQuery, 's')))); - }); - describe('allow undefined terms', () => { test('and', () => { const query = mockQuery as unknown as Query<'test', Schema>; diff --git a/packages/zql/src/query/query.ts b/packages/zql/src/query/query.ts index 8484d447f2..967bc1f04a 100644 --- a/packages/zql/src/query/query.ts +++ b/packages/zql/src/query/query.ts @@ -40,7 +40,33 @@ export type QueryReturn = Q extends Query ? R : never; export type QueryTable = Q extends Query ? T : never; -export type ExistsOptions = {flip: boolean}; +export type ExistsOptions = { + /** + * Controls the join direction. + * - `true`: Force the join to be flipped (child drives the join). + * - `false`: Force the join to stay as a semi-join (parent drives). + * - `undefined`: Let the planner decide the optimal direction. + */ + flip?: boolean; + + /** + * @experimental + * + * When true and the subquery is known to return at most one row, the + * server pre-resolves the matching value from the related table and + * rewrites the condition as a direct field comparison at hydration time. + * This avoids a join at query time, and provides more information + * to the query planner, often resulting in more efficient query plans. + * + * However, this can be less efficient if the subquery's result changes + * frequently, as the query will need to be rehydrated whenever the + * subquery's result changes. + * + * Only supported for one-hop relationships. Throws if used with + * junction (two-hop) relationships. + */ + scalar?: boolean; +}; export type GetFilterType< TSchema extends TableSchema, @@ -275,28 +301,6 @@ export interface Query< options?: ExistsOptions, ): Query; - /** - * EXPERIMENTAL: Support for scalar subqueries in WHERE clauses. - * Do not use unless you know what you are doing. - * API is unstable. - * Use at your own risk. - */ - whereScalar( - relationship: AvailableRelationships, - ): Query; - /** - * EXPERIMENTAL: Support for scalar subqueries in WHERE clauses. - * Do not use unless you know what you are doing. - * API is unstable. - * Use at your own risk. - */ - whereScalar>( - relationship: TRelationship, - cb: ( - q: Query, TSchema>, - ) => Query, - ): Query; - start( row: Partial>, opts?: {inclusive: boolean}, diff --git a/packages/zql/src/query/test/query-gen.test.ts b/packages/zql/src/query/test/query-gen.test.ts index 3e5bd44c24..1b041caec8 100644 --- a/packages/zql/src/query/test/query-gen.test.ts +++ b/packages/zql/src/query/test/query-gen.test.ts @@ -128,7 +128,6 @@ test('stable generation', () => { "where": { "conditions": [ { - "flip": undefined, "op": "EXISTS", "related": { "correlation": { diff --git a/packages/zqlite/src/query-builder.ts b/packages/zqlite/src/query-builder.ts index 2c39a23c85..9e8d38af4f 100644 --- a/packages/zqlite/src/query-builder.ts +++ b/packages/zqlite/src/query-builder.ts @@ -19,7 +19,7 @@ import type {Start} from '../../zql/src/ivm/operator.ts'; */ export type NoSubqueryCondition = Exclude< Condition, - {type: 'correlatedSubquery'} | {type: 'scalarSubquery'} + {type: 'correlatedSubquery'} >; export function buildSelectQuery( diff --git a/packages/zqlite/src/resolve-scalar-subqueries.test.ts b/packages/zqlite/src/resolve-scalar-subqueries.test.ts index 8e463d3ca5..528de337e6 100644 --- a/packages/zqlite/src/resolve-scalar-subqueries.test.ts +++ b/packages/zqlite/src/resolve-scalar-subqueries.test.ts @@ -2,6 +2,7 @@ import {expect, test} from 'vitest'; import type { AST, Condition, + CorrelatedSubqueryCondition, SimpleCondition, } from '../../zero-protocol/src/ast.ts'; import type {PrimaryKey} from '../../zero-protocol/src/primary-key.ts'; @@ -217,17 +218,22 @@ test('resolves a simple scalar subquery to a literal condition', () => { const ast: AST = { table: 'issues', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'name', - subquery: { - table: 'users', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '0001'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['name'], + }, + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, }, }, }, @@ -249,22 +255,27 @@ test('resolves a simple scalar subquery to a literal condition', () => { expect(companions[0].ast.table).toBe('users'); }); -test('preserves the operator from the scalar subquery condition', () => { +test('NOT EXISTS scalar resolves with IS NOT operator', () => { const specs = makeTableSpecs({users: [['id']]}); const ast: AST = { table: 'issues', where: { - type: 'scalarSubquery', - op: 'IS NOT', - parentField: 'ownerId', - childField: 'name', - subquery: { - table: 'users', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '0001'}, + type: 'correlatedSubquery', + op: 'NOT EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['name'], + }, + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, }, }, }, @@ -284,17 +295,22 @@ test('returns ALWAYS_FALSE when executor returns undefined', () => { const ast: AST = { table: 'issues', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'name', - subquery: { - table: 'users', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: 'nonexistent'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['name'], + }, + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 'nonexistent'}, + }, }, }, }, @@ -315,17 +331,22 @@ test('returns ALWAYS_FALSE when executor returns null', () => { const ast: AST = { table: 'issues', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'name', - subquery: { - table: 'users', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '0001'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['name'], + }, + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, }, }, }, @@ -341,13 +362,18 @@ test('leaves non-simple scalar subquery untouched', () => { const ast: AST = { table: 'issues', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'name', - subquery: { - // No where clause → not simple - table: 'users', + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['name'], + }, + subquery: { + // No where clause → not simple + table: 'users', + }, }, }, }; @@ -376,17 +402,22 @@ test('resolves scalar subqueries inside AND conditions', () => { right: {type: 'literal', value: false}, }, { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'id', - subquery: { - table: 'users', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '0001'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, }, }, }, @@ -427,17 +458,22 @@ test('resolves scalar subqueries inside OR conditions', () => { type: 'or', conditions: [ { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'id', - subquery: { - table: 'users', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '0001'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, }, }, }, @@ -489,17 +525,22 @@ test('resolves scalar subqueries in related subqueries', () => { subquery: { table: 'users', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'name', - childField: 'name', - subquery: { - table: 'users', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '0002'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['name'], + childField: ['name'], + }, + subquery: { + table: 'users', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0002'}, + }, }, }, }, @@ -563,17 +604,22 @@ test('resolves scalar subqueries inside correlatedSubquery (EXISTS) conditions', subquery: { table: 'issueLabel', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'labelID', - childField: 'id', - subquery: { - table: 'label', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: 'label-001'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['labelID'], + childField: ['id'], + }, + subquery: { + table: 'label', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: 'label-001'}, + }, }, }, }, @@ -588,8 +634,8 @@ test('resolves scalar subqueries inside correlatedSubquery (EXISTS) conditions', () => 'resolved-label-id', ); - // The correlatedSubquery condition should still be present, but its inner - // subquery's WHERE should be resolved from scalarSubquery to simple. + // The outer correlatedSubquery condition should still be present, but its inner + // subquery's WHERE should be resolved from scalar to simple. expect(resolved.where).toEqual({ type: 'correlatedSubquery', op: 'EXISTS', @@ -618,6 +664,29 @@ test('resolves scalar subqueries inside AND of correlatedSubquery conditions', ( label: [['id']], }); + const scalarLabelCondition = ( + labelIdValue: string, + ): CorrelatedSubqueryCondition => ({ + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['labelID'], + childField: ['id'], + }, + subquery: { + table: 'label', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: labelIdValue}, + }, + }, + }, + }); + const ast: AST = { table: 'issue', where: { @@ -633,21 +702,7 @@ test('resolves scalar subqueries inside AND of correlatedSubquery conditions', ( }, subquery: { table: 'issueLabel', - where: { - type: 'scalarSubquery', - op: '=', - parentField: 'labelID', - childField: 'id', - subquery: { - table: 'label', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: 'label-bug'}, - }, - }, - }, + where: scalarLabelCondition('label-bug'), }, }, }, @@ -661,21 +716,7 @@ test('resolves scalar subqueries inside AND of correlatedSubquery conditions', ( }, subquery: { table: 'issueLabel', - where: { - type: 'scalarSubquery', - op: '=', - parentField: 'labelID', - childField: 'id', - subquery: { - table: 'label', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: 'label-software'}, - }, - }, - }, + where: scalarLabelCondition('label-software'), }, }, }, @@ -765,37 +806,47 @@ test('resolves nested scalar subqueries in subquery where clause', () => { const ast: AST = { table: 'issues', where: { - type: 'scalarSubquery', - op: '=', - parentField: 'ownerId', - childField: 'id', - subquery: { - table: 'users', - where: { - type: 'and', - conditions: [ - { - type: 'simple', - op: '=', - left: {type: 'column', name: 'id'}, - right: {type: 'literal', value: '0001'}, - }, - { - type: 'scalarSubquery', - op: '=', - parentField: 'role', - childField: 'value', - subquery: { - table: 'config', - where: { - type: 'simple', - op: '=', - left: {type: 'column', name: 'key'}, - right: {type: 'literal', value: 'default_role'}, + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['ownerId'], + childField: ['id'], + }, + subquery: { + table: 'users', + where: { + type: 'and', + conditions: [ + { + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '0001'}, + }, + { + type: 'correlatedSubquery', + op: 'EXISTS', + scalar: true, + related: { + correlation: { + parentField: ['role'], + childField: ['value'], + }, + subquery: { + table: 'config', + where: { + type: 'simple', + op: '=', + left: {type: 'column', name: 'key'}, + right: {type: 'literal', value: 'default_role'}, + }, + }, }, }, - }, - ], + ], + }, }, }, }, diff --git a/packages/zqlite/src/resolve-scalar-subqueries.ts b/packages/zqlite/src/resolve-scalar-subqueries.ts index 7be526b780..740df15ac5 100644 --- a/packages/zqlite/src/resolve-scalar-subqueries.ts +++ b/packages/zqlite/src/resolve-scalar-subqueries.ts @@ -1,8 +1,8 @@ import type { AST, Condition, + CorrelatedSubqueryCondition, LiteralValue, - ScalarSubqueryCondition, SimpleCondition, } from '../../zero-protocol/src/ast.ts'; import type {PrimaryKey} from '../../zero-protocol/src/primary-key.ts'; @@ -89,8 +89,31 @@ function resolveCondition( companions: CompanionSubquery[], ): Condition { switch (condition.type) { - case 'scalarSubquery': - return resolveScalarSubquery(condition, tableSpecs, execute, companions); + case 'correlatedSubquery': + if (condition.scalar) { + return resolveScalarSubquery( + condition, + tableSpecs, + execute, + companions, + ); + } + // Non-scalar correlated subquery: recurse into its subquery + { + const resolvedSubquery = resolveASTRecursive( + condition.related.subquery, + tableSpecs, + execute, + companions, + ); + if (resolvedSubquery !== condition.related.subquery) { + return { + ...condition, + related: {...condition.related, subquery: resolvedSubquery}, + }; + } + return condition; + } case 'and': case 'or': { const resolved = condition.conditions.map(c => @@ -101,36 +124,24 @@ function resolveCondition( } return {type: condition.type, conditions: resolved}; } - case 'correlatedSubquery': { - const resolvedSubquery = resolveASTRecursive( - condition.related.subquery, - tableSpecs, - execute, - companions, - ); - if (resolvedSubquery !== condition.related.subquery) { - return { - ...condition, - related: {...condition.related, subquery: resolvedSubquery}, - }; - } - return condition; - } default: return condition; } } function resolveScalarSubquery( - condition: ScalarSubqueryCondition, + condition: CorrelatedSubqueryCondition, tableSpecs: Map, execute: ScalarExecutor, companions: CompanionSubquery[], ): Condition { + const parentField = condition.related.correlation.parentField[0]; + const childField = condition.related.correlation.childField[0]; + // Recursively resolve any scalar subqueries nested in the // subquery's own WHERE (and related) before evaluating this one. const subquery = resolveASTRecursive( - condition.subquery, + condition.related.subquery, tableSpecs, execute, companions, @@ -138,19 +149,22 @@ function resolveScalarSubquery( if (!isSimpleSubquery(subquery, tableSpecs)) { // Return with the (possibly partially-resolved) subquery. - if (subquery !== condition.subquery) { - return {...condition, subquery}; + if (subquery !== condition.related.subquery) { + return { + ...condition, + related: {...condition.related, subquery}, + }; } return condition; } - const value = execute(subquery, condition.childField); + const value = execute(subquery, childField); // Record the companion subquery AST so its rows are synced to the client. // The client rewrites scalar subqueries to EXISTS and needs those rows. companions.push({ ast: subquery, - childField: condition.childField, + childField, resolvedValue: value, }); @@ -159,10 +173,11 @@ function resolveScalarSubquery( return ALWAYS_FALSE; } + const op = condition.op === 'EXISTS' ? '=' : 'IS NOT'; return { type: 'simple', - op: condition.op, - left: {type: 'column', name: condition.parentField}, + op, + left: {type: 'column', name: parentField}, right: {type: 'literal', value}, } satisfies SimpleCondition; } @@ -235,7 +250,7 @@ function collectConstraints( collectConstraints(c, constraints); } break; - // OR, correlatedSubquery, scalarSubquery — don't contribute constraints + // OR, correlatedSubquery (non-scalar) — don't contribute constraints default: break; } diff --git a/packages/zqlite/src/sqlite-cost-model.ts b/packages/zqlite/src/sqlite-cost-model.ts index 5c10e1906c..6899774655 100644 --- a/packages/zqlite/src/sqlite-cost-model.ts +++ b/packages/zqlite/src/sqlite-cost-model.ts @@ -104,7 +104,6 @@ function removeCorrelatedSubqueries( ): NoSubqueryCondition | undefined { switch (condition.type) { case 'correlatedSubquery': - case 'scalarSubquery': // Remove subqueries - we can't estimate their cost via scanstatus return undefined; case 'simple': From a222271f5ffbbd5a00c71a08dc292ccadba48d91 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 20 Feb 2026 10:33:39 +0100 Subject: [PATCH 086/495] chore(zero-cache): Ensure backup monitor is aborted (#5587) The existing code does not abort the `fetch` request when the backup monitor is stopped, potentially leaving in-flight request potentially updating the state of a stopped monitor. This change adds an `AbortController` to the `fetch` request and ensures it is aborted when the monitor is stopped. --- .../change-streamer/backup-monitor.test.ts | 37 ++++++++++++ .../change-streamer/backup-monitor.ts | 60 +++++++++++++------ .../zero-cache/src/services/running-state.ts | 4 ++ 3 files changed, 83 insertions(+), 18 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts b/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts index 1b1dde7f72..895b0fbf1c 100644 --- a/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts +++ b/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts @@ -256,4 +256,41 @@ litestream_replica_validation_total{db="/tmp/zbugs-sync-replica.db",name="file", await monitor.checkWatermarksAndScheduleCleanup(); expect(scheduled).toEqual(['618p0bw8']); }); + + test('aborts in-flight fetch on stop', async () => { + nock.cleanAll(); + const {promise: requestReceived, resolve: signalRequestReceived} = + resolver(); + const {promise: allowResponse, resolve: letResponseThrough} = + resolver(); + + setMetricsResponse('618ocqq8', '1.74545644476593e+09'); + + nock('http://localhost:4850') + .get('/metrics') + .reply(200, async () => { + signalRequestReceived(); + await allowResponse; + return metricsResponse; + }); + + const checkPromise = monitor.checkWatermarksAndScheduleCleanup(); + + // Wait until the fetch is in-flight before aborting. + await requestReceived; + + // Aborting the signal by stopping the monitor should cause the + // in-flight fetch to reject with an AbortError, which is handled + // gracefully (no warning logged, no cleanup scheduled). + const stopPromise = monitor.stop(); + + // Unblock the nock response handler so it doesn't hang. + letResponseThrough(); + + await checkPromise; + await stopPromise; + + // Since the fetch was aborted, no watermarks were processed. + expect(scheduled).toEqual([]); + }); }); diff --git a/packages/zero-cache/src/services/change-streamer/backup-monitor.ts b/packages/zero-cache/src/services/change-streamer/backup-monitor.ts index cfd1c14386..bd7adfd113 100644 --- a/packages/zero-cache/src/services/change-streamer/backup-monitor.ts +++ b/packages/zero-cache/src/services/change-streamer/backup-monitor.ts @@ -7,8 +7,8 @@ import type {Service} from '../service.ts'; import type {ChangeStreamerService} from './change-streamer.ts'; import type {SnapshotMessage} from './snapshot.ts'; -export const CHECK_INTERVAL_MS = 60 * 1000; -const MIN_CLEANUP_DELAY_MS = 30 * 1000; +export const CHECK_INTERVAL_MS = 60_000; +const MIN_CLEANUP_DELAY_MS = 30_000; type Reservation = { start: Date; @@ -20,7 +20,7 @@ type Reservation = { * watermark (label) value of the `litestream_replica_progress` gauge and * schedules cleanup of change log entries that can be purged as a result. * - * See: https: *github.com/rocicorp/litestream/pull/3 + * See: https://github.com/rocicorp/litestream/pull/3 * * Note that change log entries cannot simply be purged as soon as they * have been applied and backed up by litestream. Consider the case in which @@ -156,15 +156,33 @@ export class BackupMonitor implements Service { } }; - async #checkWatermarks() { - const resp = await fetch(this.#metricsEndpoint); + async *#fetchWatermarks(): AsyncGenerator<{ + watermark: string; + time: Date; + name?: string | undefined; + }> { + const metricsEndpoint = this.#metricsEndpoint; + const signal = this.#state.signal; + let resp; + try { + resp = await fetch(metricsEndpoint, {signal}); + } catch (e) { + if (signal.aborted) { + // not an error. + return; + } + // Treat exceptions from fetch (e.g. network errors) as non-fatal, and simply + // log them and skip the watermark check until the next interval. + this.#lc.warn?.(`unable to fetch metrics at ${this.#metricsEndpoint}`, e); + return; + } if (!resp.ok) { this.#lc.warn?.( - `unable to fetch metrics at ${this.#metricsEndpoint}`, - await resp.text(), + `unable to fetch metrics at ${this.#metricsEndpoint}: ${await resp.text()}`, ); return; } + const families = parsePrometheusTextFormat(await resp.text()); for (const family of families) { if ( @@ -173,23 +191,29 @@ export class BackupMonitor implements Service { ) { for (const metric of family.metrics) { const watermark = metric.labels?.watermark; - if ( - watermark && - watermark > this.#lastWatermark && - !this.#watermarks.has(watermark) - ) { - const time = new Date(parseFloat(metric.value) * 1000); - this.#lc.info?.( - `replicated watermark=${watermark} to ${metric.labels?.name}` + - ` at ${time.toISOString()}.`, - ); - this.#watermarks.set(watermark, time); + const name = metric.labels?.name; + const time = new Date(parseFloat(metric.value) * 1000); + + if (watermark) { + yield {watermark, time, name}; } } } } } + async #checkWatermarks() { + for await (const {watermark, name, time} of this.#fetchWatermarks()) { + if (watermark > this.#lastWatermark && !this.#watermarks.has(watermark)) { + this.#lc.info?.( + `replicated watermark=${watermark} to ${name}` + + ` at ${time.toISOString()}.`, + ); + this.#watermarks.set(watermark, time); + } + } + } + #scheduleCleanup() { if (this.#reservations.size > 0) { this.#lc.info?.( diff --git a/packages/zero-cache/src/services/running-state.ts b/packages/zero-cache/src/services/running-state.ts index a1b300c433..7ddc39544e 100644 --- a/packages/zero-cache/src/services/running-state.ts +++ b/packages/zero-cache/src/services/running-state.ts @@ -67,6 +67,10 @@ export class RunningState { ); } + get signal(): AbortSignal { + return this.#controller.signal; + } + /** * Returns `true` until {@link stop()} has been called. * From 23e3702461af1950c330bb1e9fba6b9753a2c98a Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Fri, 20 Feb 2026 10:17:22 -0700 Subject: [PATCH 087/495] feat(zero-client): add `delete()` to zero client (#5579) - Added zero.delete() that: - closes the instance first, - deletes all local DBs with matching `replicacheName`, - returns {deleted, errors}. The current docs are awkward about dropping all databases, and this is a core workflow for Zero client. Currently it requires passing the same kvStore as initialized in the Zero client. https://zero.rocicorp.dev/docs/auth#logging-out --- ...{zero-idbname.test.ts => zero-idb.test.ts} | 62 +++++++++++++++++++ packages/zero-client/src/client/zero.ts | 45 +++++++++++++- 2 files changed, 105 insertions(+), 2 deletions(-) rename packages/zero-client/src/client/{zero-idbname.test.ts => zero-idb.test.ts} (61%) diff --git a/packages/zero-client/src/client/zero-idbname.test.ts b/packages/zero-client/src/client/zero-idb.test.ts similarity index 61% rename from packages/zero-client/src/client/zero-idbname.test.ts rename to packages/zero-client/src/client/zero-idb.test.ts index fcb485ed61..c17068c814 100644 --- a/packages/zero-client/src/client/zero-idbname.test.ts +++ b/packages/zero-client/src/client/zero-idb.test.ts @@ -1,4 +1,5 @@ import {expect, test} from 'vitest'; +import {hasMemStore} from '../../../replicache/src/kv/mem-store.ts'; import {h64} from '../../../shared/src/hash.ts'; import {createSchema} from '../../../zero-schema/src/builder/schema-builder.ts'; import {string, table} from '../../../zero-schema/src/builder/table-builder.ts'; @@ -15,6 +16,18 @@ const schema = createSchema({ ], }); +const schemaV2 = createSchema({ + tables: [ + table('foo') + .columns({ + id: string(), + value: string(), + value2: string(), + }) + .primaryKey('id'), + ], +}); + const userID = 'test-user'; const storageKey = 'test-storage'; @@ -95,3 +108,52 @@ test('idbName generation with URL configuration', async () => { await zero.close(); } }); + +test('delete closes and removes all databases for the same zero instance', async () => { + const userIDForDrop = 'drop-db-user'; + const storageKeyForDrop = 'drop-db-storage'; + + const zOld = new Zero({ + userID: userIDForDrop, + storageKey: storageKeyForDrop, + schema, + kvStore: 'mem', + }); + const oldDBName = zOld.idbName; + await zOld.close(); + + const zCurrent = new Zero({ + userID: userIDForDrop, + storageKey: storageKeyForDrop, + schema: schemaV2, + kvStore: 'mem', + }); + const currentDBName = zCurrent.idbName; + + const zOther = new Zero({ + userID: 'drop-db-other-user', + storageKey: 'drop-db-other-storage', + schema, + kvStore: 'mem', + }); + const otherDBName = zOther.idbName; + + expect(zCurrent.closed).toBe(false); + expect(hasMemStore(oldDBName)).toBe(true); + expect(hasMemStore(currentDBName)).toBe(true); + expect(hasMemStore(otherDBName)).toBe(true); + + const result = await zCurrent.delete(); + + expect(zCurrent.closed).toBe(true); + expect(result.errors).toHaveLength(0); + expect(result.deleted).toContain(oldDBName); + expect(result.deleted).toContain(currentDBName); + expect(hasMemStore(oldDBName)).toBe(false); + expect(hasMemStore(currentDBName)).toBe(false); + + expect(hasMemStore(otherDBName)).toBe(true); + + await zOther.close(); + await zOther.delete(); +}); diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index e7b335c797..6db317702c 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -1,11 +1,13 @@ import {LogContext, type LogLevel} from '@rocicorp/logger'; import {type Resolver, resolver} from '@rocicorp/resolver'; import {type DeletedClients} from '../../../replicache/src/deleted-clients.ts'; +import {getKVStoreProvider} from '../../../replicache/src/get-kv-store-provider.ts'; import { ReplicacheImpl, type ReplicacheImplOptions, } from '../../../replicache/src/impl.ts'; -import {dropDatabase} from '../../../replicache/src/persist/collect-idb-databases.ts'; +import {dropDatabase as dropReplicacheDatabase} from '../../../replicache/src/persist/collect-idb-databases.ts'; +import {IDBDatabasesStore} from '../../../replicache/src/persist/idb-databases-store.ts'; import type {Puller, PullerResult} from '../../../replicache/src/puller.ts'; import type {Pusher, PusherResult} from '../../../replicache/src/pusher.ts'; import type {ReplicacheOptions} from '../../../replicache/src/replicache-options.ts'; @@ -430,6 +432,7 @@ export class Zero< #totalToConnectStart: number | undefined = undefined; readonly #options: ZeroOptions; + readonly #kvStore: ZeroOptions['kvStore']; /** * Query builders for each table in the schema. @@ -496,6 +499,8 @@ export class Zero< }); } + this.#kvStore = kvStore; + this.pingTimeoutMs = pingTimeoutMs; this.#onlineManager = new OnlineManager(); @@ -1409,7 +1414,9 @@ export class Zero< kind === ErrorKind.InvalidConnectionRequestLastMutationID || kind === ErrorKind.InvalidConnectionRequestBaseCookie ) { - await dropDatabase(this.#rep.idbName); + await dropReplicacheDatabase(this.#rep.idbName, { + kvStore: this.#kvStore, + }); reloadWithReason(lc, this.#reload, kind, serverAheadReloadReason); } } @@ -2387,6 +2394,40 @@ export class Zero< } } + async delete(): Promise<{deleted: string[]; errors: unknown[]}> { + await this.close(); + + const kvStoreProvider = getKVStoreProvider(this.#lc, this.#kvStore); + const idbDatabasesStore = new IDBDatabasesStore(kvStoreProvider.create); + try { + const databases = await idbDatabasesStore.getDatabases(); + const dbNamesToDelete = Object.values(databases) + .filter(database => database.replicacheName === this.#rep.name) + .map(database => database.name); + + const deleteResults = await Promise.allSettled( + dbNamesToDelete.map(async dbName => { + await dropReplicacheDatabase(dbName, {kvStore: this.#kvStore}); + return dbName; + }), + ); + + const deleted: string[] = []; + const errors: unknown[] = []; + for (const result of deleteResults) { + if (result.status === 'fulfilled') { + deleted.push(result.value); + } else { + errors.push(result.reason); + } + } + + return {deleted, errors}; + } finally { + await idbDatabasesStore.close(); + } + } + #addMetric: ( metric: K, value: number, From 2cc22f0dbdbe34dea7961158b6157512800b8160 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Fri, 20 Feb 2026 12:31:15 -0700 Subject: [PATCH 088/495] fix(zero-client + zql): require correct context/schema when defined in default types (#5375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduce `BaseDefaultSchema`/`BaseDefaultContext` and use them across Zero options/hooks so defaults propagate without erasing custom types. - Make `ZeroOptions` require context when the context type isn’t `unknown`, and align generics in zero-react/zero-solid helpers to the new base defaults. Screenshot 2025-12-23 at 12 12
15 PM Screenshot 2025-12-23 at 12 11
44 PM Screenshot 2025-12-23 at 12 11
28 PM --- apps/zbugs/src/zero-init.tsx | 19 ++++---- packages/zero-client/src/client/options.ts | 43 ++++++++++++------- packages/zero-client/src/client/test-utils.ts | 14 +++--- packages/zero-client/src/client/zero.ts | 10 +++-- packages/zero-client/src/mod.ts | 2 + packages/zero-react/src/use-query.tsx | 35 +++++++-------- packages/zero-react/src/zero-provider.tsx | 19 ++++---- packages/zero-solid/src/use-query.ts | 19 ++++---- packages/zero-solid/src/use-zero.ts | 21 ++++----- packages/zero-types/src/default-types.test.ts | 18 +++++++- packages/zero-types/src/default-types.ts | 9 ++++ packages/zql/src/mutate/mutator-registry.ts | 9 ++-- packages/zql/src/query/query-registry.ts | 5 ++- packages/zql/src/query/query.ts | 30 ++++++------- 14 files changed, 150 insertions(+), 103 deletions(-) diff --git a/apps/zbugs/src/zero-init.tsx b/apps/zbugs/src/zero-init.tsx index f23bf8515a..7b5fdc53b1 100644 --- a/apps/zbugs/src/zero-init.tsx +++ b/apps/zbugs/src/zero-init.tsx @@ -1,5 +1,6 @@ +import type {ZeroOptions} from '@rocicorp/zero'; import {ZeroProvider} from '@rocicorp/zero/react'; -import {type ReactNode} from 'react'; +import {useMemo, type ReactNode} from 'react'; import {mutators} from '../shared/mutators.ts'; import {schema} from '../shared/schema.ts'; import {useLogin} from './hooks/use-login.tsx'; @@ -7,22 +8,22 @@ import {useLogin} from './hooks/use-login.tsx'; export function ZeroInit({children}: {children: ReactNode}) { const login = useLogin(); - return ( - + ({ schema, cacheURL: import.meta.env.VITE_PUBLIC_SERVER, userID: login.loginState?.decoded?.sub ?? 'anon', mutators, - logLevel: 'info' as const, + logLevel: 'info', // changing the auth token will cause ZeroProvider to call connection.connect auth: login.loginState?.encoded, mutateURL: `${window.location.origin}/api/mutate`, queryURL: `${window.location.origin}/api/query`, context: login.loginState?.decoded, - }} - > - {children} - + }) as const satisfies ZeroOptions, + [login.loginState], ); + + return {children}; } diff --git a/packages/zero-client/src/client/options.ts b/packages/zero-client/src/client/options.ts index 82079f3a4f..2500658db7 100644 --- a/packages/zero-client/src/client/options.ts +++ b/packages/zero-client/src/client/options.ts @@ -2,22 +2,20 @@ import type {LogLevel} from '@rocicorp/logger'; import type {StoreProvider} from '../../../replicache/src/kv/store.ts'; import * as v from '../../../shared/src/valita.ts'; import type { + BaseDefaultContext, + BaseDefaultSchema, DefaultContext, DefaultSchema, } from '../../../zero-types/src/default-types.ts'; -import type {Schema} from '../../../zero-types/src/schema.ts'; import type {AnyMutatorRegistry} from '../../../zql/src/mutate/mutator-registry.ts'; import type {CustomMutatorDefs} from './custom.ts'; import {UpdateNeededReasonType} from './update-needed-reason-type.ts'; -/** - * Configuration for {@linkcode Zero}. - */ -export interface ZeroOptions< - S extends Schema = DefaultSchema, - MD extends CustomMutatorDefs | undefined = undefined, - C = DefaultContext, -> { +type ZeroOptionsBase< + S extends BaseDefaultSchema, + MD extends CustomMutatorDefs | undefined, + C extends BaseDefaultContext, +> = { /** * URL to the zero-cache. This can be a simple hostname, e.g. * - "https://myapp-myteam.zero.ms" @@ -318,20 +316,33 @@ export interface ZeroOptions< queryChangeThrottleMs?: number | undefined; /** - * Context is passed to Synced Queries when they are executed + * Context is passed to queries when they are executed. */ - // TODO(arv): Mutators should also get context. context?: C | undefined; -} +}; + +/** + * Configuration for {@linkcode Zero}. + */ +export type ZeroOptions< + S extends BaseDefaultSchema = DefaultSchema, + MD extends CustomMutatorDefs | undefined = undefined, + C extends BaseDefaultContext = DefaultContext, +> = ZeroOptionsBase & + (unknown extends DefaultContext + ? {} + : { + context: C; + }); /** * @deprecated Use {@link ZeroOptions} instead. */ -export interface ZeroAdvancedOptions< - S extends Schema, +export type ZeroAdvancedOptions< + S extends BaseDefaultSchema, MD extends CustomMutatorDefs | undefined, - Context, -> extends ZeroOptions {} + Context extends BaseDefaultContext, +> = ZeroOptions; type UpdateNeededReasonBase = { message?: string; diff --git a/packages/zero-client/src/client/test-utils.ts b/packages/zero-client/src/client/test-utils.ts index 95c11c61a8..9c0e96d782 100644 --- a/packages/zero-client/src/client/test-utils.ts +++ b/packages/zero-client/src/client/test-utils.ts @@ -360,12 +360,7 @@ export function zeroForTest< ): TestZero { // Special case kvStore. If not present we default to 'mem'. This allows // passing `undefined` to get the default behavior. - const newOptions = {...options}; - if (!('kvStore' in options)) { - newOptions.kvStore = 'mem'; - } - - return new TestZero({ + const newOptions = { cacheURL: 'https://example.com/', // Make sure we do not reuse IDB instances between tests by default userID: options.userID ?? 'test-user-id-' + testZeroCounter++, @@ -378,8 +373,11 @@ export function zeroForTest< throw new Error(`Unexpected update needed: ${reason.type}`); } : undefined, - ...newOptions, - } satisfies ZeroOptions); + kvStore: options.kvStore ?? 'mem', + ...options, + } satisfies ZeroOptions; + + return new TestZero(newOptions); } export async function waitForUpstreamMessage( diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index 6db317702c..2faf8e0eeb 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -81,6 +81,8 @@ import { clientToServer, } from '../../../zero-schema/src/name-mapper.ts'; import type { + BaseDefaultContext, + BaseDefaultSchema, DefaultContext, DefaultSchema, } from '../../../zero-types/src/default-types.ts'; @@ -212,9 +214,9 @@ interface TestZero { } function asTestZero< - S extends Schema, + S extends BaseDefaultSchema, MD extends CustomMutatorDefs | undefined, - C, + C extends BaseDefaultContext, >(z: Zero): TestZero { return z as TestZero; } @@ -320,9 +322,9 @@ export type ZeroMutate< ((mr: MutateRequest) => MutatorResult); export class Zero< - const S extends Schema = DefaultSchema, + const S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - C = DefaultContext, + C extends BaseDefaultContext = DefaultContext, > { readonly version = version; diff --git a/packages/zero-client/src/mod.ts b/packages/zero-client/src/mod.ts index b9f5293e29..1a4c500268 100644 --- a/packages/zero-client/src/mod.ts +++ b/packages/zero-client/src/mod.ts @@ -100,6 +100,8 @@ export type { ValueType, } from '../../zero-schema/src/table-schema.ts'; export type { + BaseDefaultContext, + BaseDefaultSchema, DefaultContext, DefaultSchema, DefaultTypes, diff --git a/packages/zero-react/src/use-query.tsx b/packages/zero-react/src/use-query.tsx index 77b00c4c14..790cd14768 100644 --- a/packages/zero-react/src/use-query.tsx +++ b/packages/zero-react/src/use-query.tsx @@ -9,6 +9,8 @@ import { import {useZero} from './zero-provider.tsx'; import type { AnyMutatorRegistry, + BaseDefaultContext, + BaseDefaultSchema, CustomMutatorDefs, DefaultContext, DefaultSchema, @@ -22,7 +24,6 @@ import type { QueryResultDetails, ReadonlyJSONValue, ResultType, - Schema, TTL, TypedView, Zero, @@ -80,9 +81,9 @@ export function useQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( query: QueryOrQueryRequest< TTable, @@ -100,9 +101,9 @@ export function useQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( query: | QueryOrQueryRequest @@ -115,9 +116,9 @@ export function useQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( query: | QueryOrQueryRequest @@ -154,9 +155,9 @@ export function useSuspenseQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( query: QueryOrQueryRequest< TTable, @@ -174,9 +175,9 @@ export function useSuspenseQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( query: | QueryOrQueryRequest @@ -189,9 +190,9 @@ export function useSuspenseQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( query: | QueryOrQueryRequest @@ -416,10 +417,10 @@ export class ViewStore { getView< TTable extends keyof TSchema['tables'] & string, - TSchema extends Schema, + TSchema extends BaseDefaultSchema, TReturn, MD extends CustomMutatorDefs | undefined, - TContext, + TContext extends BaseDefaultContext, >( zero: Zero, q: Query, @@ -496,10 +497,10 @@ const viewStore = new ViewStore(); */ class ViewWrapper< TTable extends keyof TSchema['tables'] & string, - TSchema extends Schema, + TSchema extends BaseDefaultSchema, TReturn, MD extends AnyMutatorRegistry | CustomMutatorDefs | undefined, - TContext, + TContext extends BaseDefaultContext, > { #view: TypedView> | undefined; readonly #onDematerialized; diff --git a/packages/zero-react/src/zero-provider.tsx b/packages/zero-react/src/zero-provider.tsx index 626f2af945..45d2da1167 100644 --- a/packages/zero-react/src/zero-provider.tsx +++ b/packages/zero-react/src/zero-provider.tsx @@ -10,10 +10,11 @@ import { import {stringCompare} from '../../shared/src/string-compare.ts'; import { Zero, + type BaseDefaultContext, + type BaseDefaultSchema, type CustomMutatorDefs, type DefaultContext, type DefaultSchema, - type Schema, type ZeroOptions, } from './zero.ts'; @@ -23,9 +24,9 @@ export const ZeroContext = createContext | undefined>( ); export function useZero< - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - Context = DefaultContext, + Context extends BaseDefaultContext = DefaultContext, >(): Zero { const zero = useContext(ZeroContext); if (zero === undefined) { @@ -46,17 +47,17 @@ export function useZero< * } */ export function createUseZero< - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - Context = DefaultContext, + Context extends BaseDefaultContext = DefaultContext, >() { return () => useZero(); } export type ZeroProviderProps< - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - Context = DefaultContext, + Context extends BaseDefaultContext = DefaultContext, > = (ZeroOptions | {zero: Zero}) & { init?: (zero: Zero) => void; children: ReactNode; @@ -65,9 +66,9 @@ export type ZeroProviderProps< const NO_AUTH_SET = Symbol(); export function ZeroProvider< - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - Context = DefaultContext, + Context extends BaseDefaultContext = DefaultContext, >({children, init, ...props}: ZeroProviderProps) { const isExternalZero = 'zero' in props; diff --git a/packages/zero-solid/src/use-query.ts b/packages/zero-solid/src/use-query.ts index 85e53178e9..5f0973b8b5 100644 --- a/packages/zero-solid/src/use-query.ts +++ b/packages/zero-solid/src/use-query.ts @@ -16,6 +16,8 @@ import { import {createSolidViewFactory, UNKNOWN, type State} from './solid-view.ts'; import {useZero} from './use-zero.ts'; import { + type BaseDefaultContext, + type BaseDefaultSchema, type DefaultContext, type DefaultSchema, type Falsy, @@ -24,7 +26,6 @@ import { type QueryOrQueryRequest, type QueryResultDetails, type ReadonlyJSONValue, - type Schema, type TTL, } from './zero.ts'; @@ -62,9 +63,9 @@ export function createQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( querySignal: Accessor< QueryOrQueryRequest @@ -79,9 +80,9 @@ export function useQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( querySignal: Accessor< QueryOrQueryRequest @@ -94,9 +95,9 @@ export function useQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( querySignal: Accessor< | QueryOrQueryRequest @@ -110,9 +111,9 @@ export function useQuery< TTable extends keyof TSchema['tables'] & string, TInput extends ReadonlyJSONValue | undefined, TOutput extends ReadonlyJSONValue | undefined, - TSchema extends Schema = DefaultSchema, + TSchema extends BaseDefaultSchema = DefaultSchema, TReturn = PullRow, - TContext = DefaultContext, + TContext extends BaseDefaultContext = DefaultContext, >( querySignal: Accessor< | QueryOrQueryRequest diff --git a/packages/zero-solid/src/use-zero.ts b/packages/zero-solid/src/use-zero.ts index 0472846d55..b09c7f5171 100644 --- a/packages/zero-solid/src/use-zero.ts +++ b/packages/zero-solid/src/use-zero.ts @@ -12,10 +12,11 @@ import { } from 'solid-js'; import { Zero, + type BaseDefaultContext, + type BaseDefaultSchema, type CustomMutatorDefs, type DefaultContext, type DefaultSchema, - type Schema, type ZeroOptions, } from './zero.ts'; @@ -28,21 +29,21 @@ const ZeroContext = createContext< * @deprecated Use {@linkcode ZeroProvider} instead of managing your own Zero instance. */ export function createZero< - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - Context = DefaultContext, + Context extends BaseDefaultContext = DefaultContext, >(options: ZeroOptions): Zero { const opts = { ...options, batchViewUpdates: batch, }; - return new Zero(opts); + return new Zero(opts); } export function useZero< - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - Context = DefaultContext, + Context extends BaseDefaultContext = DefaultContext, >(): () => Zero { const zero = useContext(ZeroContext); @@ -64,9 +65,9 @@ export function useZero< * } */ export function createUseZero< - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - Context = DefaultContext, + Context extends BaseDefaultContext = DefaultContext, >() { return () => useZero(); } @@ -74,9 +75,9 @@ export function createUseZero< const NO_AUTH_SET = Symbol(); export function ZeroProvider< - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, - Context = DefaultContext, + Context extends BaseDefaultContext = DefaultContext, >( props: { children: JSX.Element; diff --git a/packages/zero-types/src/default-types.test.ts b/packages/zero-types/src/default-types.test.ts index b3d985f226..c755984b37 100644 --- a/packages/zero-types/src/default-types.test.ts +++ b/packages/zero-types/src/default-types.test.ts @@ -1,5 +1,7 @@ import {expectTypeOf, test} from 'vitest'; import type { + BaseDefaultContext, + BaseDefaultSchema, DefaultContext, DefaultSchema, DefaultTypes, @@ -29,11 +31,25 @@ test('DefaultSchema uses registered schema and falls back to Schema', () => { expectTypeOf().toEqualTypeOf(); }); +test('BaseDefaultSchema uses registered schema and falls back to Schema', () => { + expectTypeOf< + BaseDefaultSchema + >().toEqualTypeOf(); + expectTypeOf().toEqualTypeOf(); +}); + test('DefaultContext uses registered context with undefined and defaults to unknown', () => { expectTypeOf>().toEqualTypeOf<{ readonly userId: string; }>(); - expectTypeOf().toEqualTypeOf(); + expectTypeOf().toBeUnknown(); +}); + +test('BaseDefaultContext uses registered context and falls back to any', () => { + expectTypeOf>().toEqualTypeOf< + Readonly + >(); + expectTypeOf().toBeAny(); }); test('InferTransactionFromDbProvider extracts transaction argument type', () => { diff --git a/packages/zero-types/src/default-types.ts b/packages/zero-types/src/default-types.ts index cf806acd27..a82ce53f7b 100644 --- a/packages/zero-types/src/default-types.ts +++ b/packages/zero-types/src/default-types.ts @@ -24,6 +24,9 @@ export type DefaultSchema = ? S : Schema; +export type BaseDefaultSchema = + DefaultSchema; + export type DefaultContext = TDefaultTypes extends { readonly context: infer C; @@ -31,6 +34,12 @@ export type DefaultContext = ? Expand> : unknown; +export type BaseDefaultContext = + unknown extends DefaultContext + ? // oxlint-disable-next-line no-explicit-any + any + : DefaultContext; + export type InferTransactionFromDbProvider = TDbProvider extends { transaction: ( // oxlint-disable-next-line no-explicit-any diff --git a/packages/zql/src/mutate/mutator-registry.ts b/packages/zql/src/mutate/mutator-registry.ts index 1b6ee3dac5..540e696166 100644 --- a/packages/zql/src/mutate/mutator-registry.ts +++ b/packages/zql/src/mutate/mutator-registry.ts @@ -8,7 +8,10 @@ import { getValueAtPath, iterateLeaves, } from '../../../shared/src/object-traversal.ts'; -import type {DefaultSchema} from '../../../zero-types/src/default-types.ts'; +import type { + BaseDefaultSchema, + DefaultSchema, +} from '../../../zero-types/src/default-types.ts'; import type {Schema} from '../../../zero-types/src/schema.ts'; import {validateInput} from '../query/validate-input.ts'; import type {Transaction} from './custom.ts'; @@ -66,7 +69,7 @@ import { export function defineMutators< // let MD infer freely so defaults aren't erased by a MutatorDefinitions constraint const MD, - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, >( // we assert types here for clear error messages definitions: MD & AssertMutatorDefinitions, @@ -76,7 +79,7 @@ export function defineMutators< // same as MD above, but for TBase and TOverrides const TBase, const TOverrides, - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, >( base: | MutatorRegistry, S> diff --git a/packages/zql/src/query/query-registry.ts b/packages/zql/src/query/query-registry.ts index 61e51d328b..3c0c58cd3e 100644 --- a/packages/zql/src/query/query-registry.ts +++ b/packages/zql/src/query/query-registry.ts @@ -8,6 +8,7 @@ import type {ReadonlyJSONValue} from '../../../shared/src/json.ts'; import {must} from '../../../shared/src/must.ts'; import {getValueAtPath} from '../../../shared/src/object-traversal.ts'; import type { + BaseDefaultSchema, DefaultContext, DefaultSchema, } from '../../../zero-types/src/default-types.ts'; @@ -610,7 +611,7 @@ export function createQuery< export function defineQueries< // let QD infer freely so defaults aren't erased by a QueryDefinitions constraint const QD, - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, >( defs: QD & AssertQueryDefinitions, ): QueryRegistry, S>; @@ -618,7 +619,7 @@ export function defineQueries< export function defineQueries< const TBase, const TOverrides, - S extends Schema = DefaultSchema, + S extends BaseDefaultSchema = DefaultSchema, >( base: | QueryRegistry, S> diff --git a/packages/zql/src/query/query.ts b/packages/zql/src/query/query.ts index 967bc1f04a..19eb1c5674 100644 --- a/packages/zql/src/query/query.ts +++ b/packages/zql/src/query/query.ts @@ -8,7 +8,6 @@ import type { } from '../../../zero-types/src/schema-value.ts'; import type { LastInTuple, - Schema, TableSchema, Schema as ZeroSchema, } from '../../../zero-types/src/schema.ts'; @@ -132,7 +131,7 @@ export type PullRow< >; } & {}; -type RowNamespace = S extends Schema +type RowNamespace = S extends ZeroSchema ? { readonly [K in keyof S['tables'] & string]: S['tables'][K] extends TableSchema @@ -144,18 +143,19 @@ type RowNamespace = S extends Schema } : S; -export type Row = - T extends Schema - ? RowNamespace - : T extends TableSchema - ? { - readonly [K in keyof T['columns']]: SchemaValueToTSType< - T['columns'][K] - >; - } - : T extends AnyQueryLike - ? QueryRowType - : never; +export type Row< + T extends ZeroSchema | TableSchema | AnyQueryLike = DefaultSchema, +> = T extends ZeroSchema + ? RowNamespace + : T extends TableSchema + ? { + readonly [K in keyof T['columns']]: SchemaValueToTSType< + T['columns'][K] + >; + } + : T extends AnyQueryLike + ? QueryRowType + : never; /** * The shape of a CustomQuery's phantom type property. @@ -393,4 +393,4 @@ export const DEFAULT_RUN_OPTIONS_COMPLETE = { type: 'complete', } as const; -export type AnyQuery = Query; +export type AnyQuery = Query; From 89f618d341760afa7279e9272661f8155750a122 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 20 Feb 2026 20:11:05 -0800 Subject: [PATCH 089/495] fix(zero-cache): fix logic for checking subscriber watermarks (#5589) Fix a fence-post error in the logic for determining whether a subscriber (e.g. a view-syncer that restored a backup from litestream) can subscribe to changes from the replication-manager. The original logic was bifurcated into two scenarios: * An empty changeLog meant that no changes have been replicated, in which case the `replicaVersion` was used as the earliest syncable watermark * A non-empty changeLog means that changes have been replicated, and the earliest watermark in the changeLog was used as the earliest syncable watermark. * When a replica at watermark `n` is successfully backed up to litestream, all changes before `n` can be purged from the changeLog, with the entries at `n` kept in the changeLog to act as the indicator of the earliest watermark that new subscribers can replicate from (i.e. the latest litestream backup). The fence-post condition that this did not account for is when changes have been replicated to the changeLog but not yet purged. In this case, a replica restored from litestream will be at the watermark of the initial sync, which will be _earlier_ than the watermark of the first changeLog entry. view-syncers with that replica will be incorrectly rejected with an error of the form: ``` Local replica watermark 81oi7tpjsg is earlier than change-streamer minWatermark 81oi7u6uzc ``` and will continue retrying in a loop. (The condition eventually resolves itself after the next litestream backup, by default happening every 15 minutes, which results in a changeLog purge that aligns the versions correctly.) The surgical fix is to seed a new changeLog with entries that mark the watermark of initial sync. This is the least disruptive fix, chosen for patchability into earlier versions of zero. A better, forthcoming fix, will be to change the cdc schema to explicitly track the earliest syncable watermark, without relying on the bifurcated conditions above. User reports: * https://discord.com/channels/830183651022471199/1288232858795769917/1458143773799223358 * https://discord.com/channels/830183651022471199/1387485021685944431/1473670499182710804 --- .../change-streamer-service.pg.test.ts | 77 +++++++++++++++++-- .../change-streamer-service.ts | 5 ++ .../change-streamer/schema/tables.pg.test.ts | 12 ++- .../services/change-streamer/schema/tables.ts | 18 +++++ .../change-streamer/storer.pg.test.ts | 36 ++++++++- 5 files changed, 139 insertions(+), 9 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index 23e5081722..5d66f28b87 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -174,6 +174,14 @@ describe('change-streamer/service', () => { await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), ).toMatchInlineSnapshot(` Result [ + [ + "01", + "begin", + ], + [ + "01", + "commit", + ], [ "09", "begin", @@ -272,6 +280,14 @@ describe('change-streamer/service', () => { await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), ).toMatchInlineSnapshot(` Result [ + [ + "01", + "begin", + ], + [ + "01", + "commit", + ], [ "09", "begin", @@ -374,6 +390,14 @@ describe('change-streamer/service', () => { await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), ).toMatchInlineSnapshot(` Result [ + [ + "01", + "begin", + ], + [ + "01", + "commit", + ], [ "09", "begin", @@ -464,6 +488,14 @@ describe('change-streamer/service', () => { await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), ).toMatchInlineSnapshot(` Result [ + [ + "01", + "begin", + ], + [ + "01", + "commit", + ], [ "09", "begin", @@ -570,6 +602,18 @@ describe('change-streamer/service', () => { await sql`SELECT watermark, change FROM "zoro_3/cdc"."changeLog"`.values(), ).toMatchInlineSnapshot(` Result [ + [ + "01", + { + "tag": "begin", + }, + ], + [ + "01", + { + "tag": "commit", + }, + ], [ "09", { @@ -721,7 +765,7 @@ describe('change-streamer/service', () => { expect(await streamer.getChangeLogState()).toEqual({ replicaVersion: '01', - minWatermark: '03', + minWatermark: '01', }); // Start two subscribers: one at 06 and one at 04 @@ -747,7 +791,7 @@ describe('change-streamer/service', () => { expect( await sql`SELECT watermark FROM "zoro_3/cdc"."changeLog"`.values(), - ).toEqual([['03'], ['04'], ['05'], ['06'], ['07'], ['08']]); + ).toEqual([['01'], ['01'], ['03'], ['04'], ['05'], ['06'], ['07'], ['08']]); expect(setTimeoutFn).toHaveBeenCalledTimes(1); expect(setTimeoutFn.mock.calls[0][1]).toBe(30000); @@ -1133,6 +1177,14 @@ describe('change-streamer/service', () => { await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), ).toMatchInlineSnapshot(` Result [ + [ + "01", + "begin", + ], + [ + "01", + "commit", + ], [ "0d", "begin", @@ -1188,6 +1240,14 @@ describe('change-streamer/service', () => { await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), ).toMatchInlineSnapshot(` Result [ + [ + "01", + "begin", + ], + [ + "01", + "commit", + ], [ "0d", "begin", @@ -1256,9 +1316,10 @@ describe('change-streamer/service', () => { await streamerDone; // Nothing should be committed - expect(await sql`SELECT watermark FROM "zoro_3/cdc"."changeLog"`).toEqual( - [], - ); + expect(await sql`SELECT watermark FROM "zoro_3/cdc"."changeLog"`).toEqual([ + {watermark: '01'}, + {watermark: '01'}, + ]); }); test('shutdown on unexpected storage error', async () => { @@ -1277,7 +1338,11 @@ describe('change-streamer/service', () => { // Commit should not have succeeded expect( await sql`SELECT watermark, pos FROM "zoro_3/cdc"."changeLog"`, - ).toEqual([{watermark: '05', pos: 3n}]); + ).toEqual([ + {watermark: '01', pos: 0n}, + {watermark: '01', pos: 1n}, + {watermark: '05', pos: 3n}, + ]); }); test('transaction aborted on unexpected termination', async () => { diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 10a45b00d0..6e754786b6 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -486,6 +486,11 @@ class ChangeStreamerImpl implements ChangeStreamerService { minWatermark: string; }> { const minWatermark = await this.#storer.getMinWatermarkForCatchup(); + if (!minWatermark) { + this.#lc.warn?.( + `Unexpected empty changeLog. Resync if "Local replica watermark" errors arise`, + ); + } return { replicaVersion: this.#replicaVersion, minWatermark: minWatermark ?? this.#replicaVersion, diff --git a/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts b/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts index 499c29f40c..da96583160 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts @@ -59,7 +59,10 @@ describe('change-streamer/schema/tables', () => { lock: 1, }, ], - ['rezo_8/cdc.changeLog']: [], + ['rezo_8/cdc.changeLog']: [ + {watermark: '183', pos: 0n, change: {tag: 'begin'}, precommit: null}, + {watermark: '183', pos: 1n, change: {tag: 'commit'}, precommit: null}, + ], }); await sql` @@ -104,6 +107,8 @@ describe('change-streamer/schema/tables', () => { }, ], ['rezo_8/cdc.changeLog']: [ + {watermark: '183', pos: 0n, change: {tag: 'begin'}, precommit: null}, + {watermark: '183', pos: 1n, change: {tag: 'commit'}, precommit: null}, { watermark: '184', pos: 1n, @@ -221,7 +226,10 @@ describe('change-streamer/schema/tables', () => { lock: 1, }, ], - ['rezo_8/cdc.changeLog']: [], + ['rezo_8/cdc.changeLog']: [ + {watermark: '1g8', pos: 0n, change: {tag: 'begin'}, precommit: null}, + {watermark: '1g8', pos: 1n, change: {tag: 'commit'}, precommit: null}, + ], ['rezo_8/cdc.tableMetadata']: [], ['rezo_8/cdc.backfilling']: [], }); diff --git a/packages/zero-cache/src/services/change-streamer/schema/tables.ts b/packages/zero-cache/src/services/change-streamer/schema/tables.ts index fc041880cc..aed3b50480 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/tables.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/tables.ts @@ -31,6 +31,8 @@ export type ChangeLogEntry = { change: Change; }; +type FullChangeLogEntry = ChangeLogEntry & {pos: number}; + function createChangeLogTable(shard: ShardID) { // Note: The "change" column used to be JSONB, but that was problematic in that // it does not handle the NULL unicode character. @@ -220,10 +222,26 @@ export async function ensureReplicationConfig( } // Initialize (or re-initialize TRUNCATED) tables if (results.length === 0 || stmts.length > 0) { + // The storer uses the earliest changeLog entry as the safe watermark + // from which subscribers can be resumed. These initial entries ensure + // that subscribers can start from a freshly synced replica, even if + // new changes have been replicated and not purged from the changeLog. + // + // TODO: Replace this with an explicit `firstWatermark` column in the + // change db. + const watermark = replicaConfig.replicaVersion; + const initialTx: FullChangeLogEntry[] = [ + {watermark, pos: 0, change: {tag: 'begin'}}, + {watermark, pos: 1, change: {tag: 'commit'}}, + ]; + stmts.push( sql`INSERT INTO ${sql(schema)}."replicationConfig" ${sql(replicaConfig)}`, sql`INSERT INTO ${sql(schema)}."replicationState" ${sql(replicationState)} ON CONFLICT (lock) DO UPDATE SET ${sql(replicationState)}`, + ...initialTx.map( + change => sql`INSERT INTO ${sql(schema)}."changeLog" ${sql(change)}`, + ), ); return Promise.all(stmts); } diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index d2d255223c..f0b947a133 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -111,7 +111,7 @@ describe('change-streamer/storer', () => { }); test('purge', async () => { - expect(await storer.purgeRecordsBefore('02')).toBe(0); + expect(await storer.purgeRecordsBefore('02')).toBe(2); expect( await db`SELECT watermark, pos FROM "xero_5/cdc"."changeLog"`, ).toEqual([ @@ -806,6 +806,8 @@ describe('change-streamer/storer', () => { expect( await db`SELECT watermark, pos FROM "xero_5/cdc"."changeLog"`, ).toEqual([ + {watermark: '00', pos: 0n}, + {watermark: '00', pos: 1n}, {watermark: '03', pos: 0n}, {watermark: '03', pos: 1n}, {watermark: '03', pos: 2n}, @@ -1200,6 +1202,22 @@ describe('change-streamer/storer', () => { await db`SELECT * FROM "xero_5/cdc"."changeLog" ORDER BY watermark, pos`, ).toMatchInlineSnapshot(` Result [ + { + "change": { + "tag": "begin", + }, + "pos": 0n, + "precommit": null, + "watermark": "00", + }, + { + "change": { + "tag": "commit", + }, + "pos": 1n, + "precommit": null, + "watermark": "00", + }, { "change": { "foo": "bar", @@ -1406,6 +1424,22 @@ describe('change-streamer/storer', () => { await db`SELECT * FROM "xero_5/cdc"."changeLog" ORDER BY watermark, pos`, ).toMatchInlineSnapshot(` Result [ + { + "change": { + "tag": "begin", + }, + "pos": 0n, + "precommit": null, + "watermark": "00", + }, + { + "change": { + "tag": "commit", + }, + "pos": 1n, + "precommit": null, + "watermark": "00", + }, { "change": { "foo": "bar", From 55853dce7cdb2a2cd482bc542c1f70d7db8bacd6 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 20 Feb 2026 21:14:59 -0800 Subject: [PATCH 090/495] fix(zero-cache): fix cleanup of replica state after a non-disruptive resync (#5590) The non-disruptive resync logic leaves replication slots untouched while syncing a new one, and then deletes older ones when the sync is complete. The logic incorrectly deleted _all_ other rows from the `replicas` metadata table, rather than only the older ones, as was done for replication slots. --- .../change-source/pg/change-source.pg.test.ts | 17 +++++++++++------ .../services/change-source/pg/change-source.ts | 4 ++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index 2190bf4922..42816b63de 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -867,10 +867,10 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { `.values(); expect(slots1).toHaveLength(2); - const replicas1 = await upstream.unsafe(` + const replicas2 = await upstream.unsafe(` SELECT slot FROM "${APP_ID}_${SHARD_NUM}".replicas `); - expect(replicas1).toHaveLength(2); + expect(replicas2).toHaveLength(2); // The original stream should still be active and receiving changes. const downstream1 = drainToQueue(changes1); @@ -904,12 +904,16 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { {tableCopyWorkers: 5}, ); - // There should now be 3 replication slot2. + // There should now be 3 replication slots. const slots2 = await upstream<{slot: string}[]>` SELECT slot_name as slot FROM pg_replication_slots WHERE slot_name LIKE ${APP_ID + '\\_' + SHARD_NUM + '\\_%'} `.values(); expect(slots2).toHaveLength(3); + const replicas3 = await upstream.unsafe(` + SELECT slot FROM "${APP_ID}_${SHARD_NUM}".replicas + `); + expect(replicas3).toHaveLength(3); // Starting a subscription on the new slot should kill the old // subscription and drop the first replication slot. @@ -937,11 +941,12 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { changes2.cancel(); - // Verify that the replica rows have been cleaned up. - const replicas2 = await upstream.unsafe(` + // Verify that the older replica state has been cleaned up. + // The newer replica state should remain. + const replicasAfterTakeover = await upstream.unsafe(` SELECT slot FROM "${APP_ID}_${SHARD_NUM}".replicas `); - expect(replicas2).toEqual(replicas1.slice(1)); + expect(replicasAfterTakeover).toEqual(replicas3.slice(1)); // Verify that the two latter slots remain. (Use waitFor to reduce // flakiness because the drop is non-transactional.) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 3fd926940f..552be27441 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -412,9 +412,9 @@ class PostgresChangeSource implements ChangeSource { `replication slot.`, ); } - // Clean up the replicas table. + // Clear the state of the older replicas. const replicasTable = `${upstreamSchema(this.#shard)}.replicas`; - await sql`DELETE FROM ${sql(replicasTable)} WHERE slot != ${slotToKeep}`; + await sql`DELETE FROM ${sql(replicasTable)} WHERE slot < ${slotToKeep}`; const pids = result.filter(({pid}) => pid !== null).map(({pid}) => pid); if (pids.length) { From ecfbc1c8063255cbfc4abb974ea598ad0a3e5f01 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Sun, 22 Feb 2026 10:33:07 -1000 Subject: [PATCH 091/495] Logging improvements to track down replication slot not found at version errors (#5591) This is a cleaned up and simplified version of some hasty logging improvements I made already direct to 0.25 (55853dce7). My plan is to overwrite those 0.25 improvements with this commit. I know we might already know the cause of this replication slot issue but I figured the logging improvements might still be useful in the future. --- packages/zero-cache/src/server/main.ts | 2 +- .../change-source/pg/change-source.ts | 41 +++++++++++++++++-- .../services/change-source/pg/schema/shard.ts | 2 +- .../src/services/litestream/commands.ts | 6 ++- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/packages/zero-cache/src/server/main.ts b/packages/zero-cache/src/server/main.ts index e278e07fbc..bc6c8824f8 100644 --- a/packages/zero-cache/src/server/main.ts +++ b/packages/zero-cache/src/server/main.ts @@ -146,7 +146,7 @@ export default async function runWorker( 'message', () => { processes.addSubprocess( - startReplicaBackupProcess(config), + startReplicaBackupProcess(lc, config), 'supporting', 'litestream', ); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 552be27441..878d57ff88 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -400,12 +400,31 @@ class PostgresChangeSource implements ChangeSource { // Note: `slot_name <= slotToKeep` uses a string compare of the millisecond // timestamp, which works until it exceeds 13 digits (sometime in 2286). - const result = await sql<{slot: string; pid: string | null}[]>` - SELECT slot_name as slot, pg_terminate_backend(active_pid), active_pid as pid + const result = await sql< + {slot: string; pid: string | null; terminated: boolean | null}[] + >` + SELECT slot_name as slot, pg_terminate_backend(active_pid) as terminated, active_pid as pid FROM pg_replication_slots WHERE (slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName}) AND slot_name <= ${slotToKeep}`; + this.#lc.info?.(`terminated replication slots: ${JSON.stringify(result)}`); if (result.length === 0) { + const shardSlots = await sql< + { + slot: string; + active: boolean; + pid: string | null; + }[] + >` + SELECT slot_name as slot, active, active_pid as pid + FROM pg_replication_slots + WHERE slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName} + ORDER BY slot_name`; + this.#lc.warn?.( + `slot ${slotToKeep} not found while cleaning subscribers; shard slots at time of failure: ${JSON.stringify( + shardSlots, + )}`, + ); throw new AbortError( `replication slot ${slotToKeep} is missing. A different ` + `replication-manager should now be running on a new ` + @@ -414,7 +433,23 @@ class PostgresChangeSource implements ChangeSource { } // Clear the state of the older replicas. const replicasTable = `${upstreamSchema(this.#shard)}.replicas`; - await sql`DELETE FROM ${sql(replicasTable)} WHERE slot < ${slotToKeep}`; + const replicasBefore = await sql<{slot: string; version: string}[]>` + SELECT slot, version FROM ${sql(replicasTable)} ORDER BY slot`; + this.#lc.info?.( + `replicas before cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify( + replicasBefore, + )}`, + ); + await sql<{slot: string; version: string}[]>` + DELETE FROM ${sql(replicasTable)} + WHERE slot < ${slotToKeep}`; + const replicasAfter = await sql<{slot: string; version: string}[]>` + SELECT slot, version FROM ${sql(replicasTable)} ORDER BY slot`; + this.#lc.info?.( + `replicas after cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify( + replicasAfter, + )}`, + ); const pids = result.filter(({pid}) => pid !== null).map(({pid}) => pid); if (pids.length) { diff --git a/packages/zero-cache/src/services/change-source/pg/schema/shard.ts b/packages/zero-cache/src/services/change-source/pg/schema/shard.ts index 93865d6e96..64cf0f40e7 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/shard.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/shard.ts @@ -268,7 +268,7 @@ export async function getReplicaAtVersion( // log out all the replicas and the joined shardConfig const allReplicas = await sql` SELECT * FROM ${schema}.replicas JOIN ${schema}."shardConfig" ON true`; - lc.debug?.(`Replica not found in: ${JSON.stringify(allReplicas)}`); + lc.info?.(`Replica not found in: ${JSON.stringify(allReplicas)}`); return null; } return v.parse(result[0], replicaSchema, 'passthrough'); diff --git a/packages/zero-cache/src/services/litestream/commands.ts b/packages/zero-cache/src/services/litestream/commands.ts index 32a793545a..86bee623be 100644 --- a/packages/zero-cache/src/services/litestream/commands.ts +++ b/packages/zero-cache/src/services/litestream/commands.ts @@ -213,8 +213,12 @@ function replicaIsValid( } } -export function startReplicaBackupProcess(config: ZeroConfig): ChildProcess { +export function startReplicaBackupProcess( + lc: LogContext, + config: ZeroConfig, +): ChildProcess { const {litestream, env} = getLitestream(config); + lc.info?.(`starting litestream backup to ${config.litestream.backupURL}`); return spawn(litestream, ['replicate'], { env, stdio: 'inherit', From bbbdcd0ab1be1182de239d50f2e1623e29539a76 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Mon, 23 Feb 2026 10:36:55 -0700 Subject: [PATCH 092/495] chore(zero-client): fix zero options to not rely on internal type (#5592) --- packages/zero-client/src/client/options.ts | 31 +++++++++------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/packages/zero-client/src/client/options.ts b/packages/zero-client/src/client/options.ts index 2500658db7..ea8e0be6da 100644 --- a/packages/zero-client/src/client/options.ts +++ b/packages/zero-client/src/client/options.ts @@ -11,10 +11,13 @@ import type {AnyMutatorRegistry} from '../../../zql/src/mutate/mutator-registry. import type {CustomMutatorDefs} from './custom.ts'; import {UpdateNeededReasonType} from './update-needed-reason-type.ts'; -type ZeroOptionsBase< - S extends BaseDefaultSchema, - MD extends CustomMutatorDefs | undefined, - C extends BaseDefaultContext, +/** + * Configuration for {@linkcode Zero}. + */ +export type ZeroOptions< + S extends BaseDefaultSchema = DefaultSchema, + MD extends CustomMutatorDefs | undefined = undefined, + C extends BaseDefaultContext = DefaultContext, > = { /** * URL to the zero-cache. This can be a simple hostname, e.g. @@ -319,21 +322,11 @@ type ZeroOptionsBase< * Context is passed to queries when they are executed. */ context?: C | undefined; -}; - -/** - * Configuration for {@linkcode Zero}. - */ -export type ZeroOptions< - S extends BaseDefaultSchema = DefaultSchema, - MD extends CustomMutatorDefs | undefined = undefined, - C extends BaseDefaultContext = DefaultContext, -> = ZeroOptionsBase & - (unknown extends DefaultContext - ? {} - : { - context: C; - }); +} & (unknown extends DefaultContext + ? {} + : { + context: C; + }); /** * @deprecated Use {@link ZeroOptions} instead. From 672c502c0d5ff5837096c78718ce2433f616aeb4 Mon Sep 17 00:00:00 2001 From: Cesar Alaestante Date: Mon, 23 Feb 2026 12:12:43 -0700 Subject: [PATCH 093/495] chore (replication-manager): convert error to warn for db econn resets (#5593) higher levels will log this at the appropriate error level when it retries --- .../src/services/change-source/pg/logical-replication/stream.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts index 87b67de0ec..1b3eaf5832 100644 --- a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts @@ -127,7 +127,7 @@ export async function subscribe( // Don't log the shutdown signal. This is the expected way for upstream // to close the connection (and will be logged downstream). (e instanceof postgres.PostgresError && e.code === PG_ADMIN_SHUTDOWN) || - lc.error?.(`error from ${db.options.host}`, e), + lc.warn?.(`error from ${db.options.host}`, e), ); pipe({ From e85c00d36c847614c6fcbdf7859a03c44d197287 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 23 Feb 2026 12:04:26 -0800 Subject: [PATCH 094/495] chore(zero-cache): address PR comments (#5594) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thank you for the many reviews! 🙏 --- .../change-source/common/backfill-manager.ts | 2 +- .../pg/logical-replication/stream.ts | 8 ++-- .../src/services/change-streamer/forwarder.ts | 2 +- .../change-streamer/storer.pg.test.ts | 39 +++++++++++++++---- .../src/services/change-streamer/storer.ts | 13 ++++--- 5 files changed, 47 insertions(+), 17 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts index c846c8ea4b..5efadd1b0c 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -597,7 +597,7 @@ class MissingRowKeyError extends BackfillStreamError { /** * Error type for backfill stream implementations to throw indicating that - * the backfill request failed to due a schema incompatibility error. This + * the backfill request failed due to a schema incompatibility error. This * type of error does not need exponential backoff, as the retry happens * naturally once the invalidating schema change is processed and committed. */ diff --git a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts index 1b3eaf5832..e8cd8ff7dd 100644 --- a/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts @@ -211,17 +211,19 @@ function parseStreamMessage( buffer: Buffer, parser: PgoutputParser, ): StreamMessage | null { - // https://www.postgresql.org/docs/current/protocol-replication.html#PROTOCOL-REPLICATION-XLOGDATA + // https://www.postgresql.org/docs/current/protocol-replication.html#PROTOCOL-REPLICATION-START-REPLICATION if (buffer[0] !== 0x77 && buffer[0] !== 0x6b) { lc.warn?.('Unknown message', buffer[0]); return null; } const lsn = buffer.readBigUInt64BE(1); if (buffer[0] === 0x77) { - // XLogData + // https://www.postgresql.org/docs/current/protocol-replication.html#PROTOCOL-REPLICATION-XLOGDATA + // (Byte 25 is where the WAL data begins) return [lsn, parser.parse(buffer.subarray(25))]; } - // Primary keepalive message: shouldRespond + // https://www.postgresql.org/docs/current/protocol-replication.html#PROTOCOL-REPLICATION-PRIMARY-KEEPALIVE-MESSAGE + // (Byte 17: shouldRespond) const shouldRespond = buffer.readInt8(17) !== 0; return [lsn, {tag: 'keepalive', shouldRespond}]; } diff --git a/packages/zero-cache/src/services/change-streamer/forwarder.ts b/packages/zero-cache/src/services/change-streamer/forwarder.ts index deeaac84d6..b8d45ed47a 100644 --- a/packages/zero-cache/src/services/change-streamer/forwarder.ts +++ b/packages/zero-cache/src/services/change-streamer/forwarder.ts @@ -33,7 +33,7 @@ export class Forwarder { */ async forward(entry: WatermarkedChange) { const [type] = entry[1]; - const results = [...this.#active.values()].map(sub => sub.send(entry)); + const results = Array.from(this.#active.values(), sub => sub.send(entry)); switch (type) { case 'begin': // While in a Transaction, all added subscribers are "queued" so that no diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index f0b947a133..9f6c019dd1 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -223,6 +223,7 @@ describe('change-streamer/storer', () => { backfill: { a: {fooID: 987, barID: 'zoo'}, b: {fooID: 843, barID: 'ozz'}, + d: {fooID: 777, barID: 'zoz'}, }, }, ], @@ -245,6 +246,10 @@ describe('change-streamer/storer', () => { "barID": "ozz", "fooID": 843, }, + "d": { + "barID": "zoz", + "fooID": 777, + }, }, "table": { "metadata": null, @@ -295,6 +300,10 @@ describe('change-streamer/storer', () => { "barID": "ozz", "fooID": 843, }, + "d": { + "barID": "zoz", + "fooID": 777, + }, }, "table": { "metadata": null, @@ -391,6 +400,10 @@ describe('change-streamer/storer', () => { "barID": "ozz", "fooID": 843, }, + "d": { + "barID": "zoz", + "fooID": 777, + }, }, "table": { "metadata": null, @@ -467,6 +480,10 @@ describe('change-streamer/storer', () => { "barID": "ozz", "fooID": 843, }, + "d": { + "barID": "zoz", + "fooID": 777, + }, }, "table": { "metadata": { @@ -548,6 +565,10 @@ describe('change-streamer/storer', () => { "barID": "zoo", "fooID": 987, }, + "d": { + "barID": "zoz", + "fooID": 777, + }, "newName": { "barID": "ozz", "fooID": 843, @@ -626,6 +647,10 @@ describe('change-streamer/storer', () => { "barID": "zoo", "fooID": 987, }, + "d": { + "barID": "zoz", + "fooID": 777, + }, }, "table": { "metadata": { @@ -645,7 +670,7 @@ describe('change-streamer/storer', () => { } `); - // Set the other backfilling column to completed + // Set the other backfilling columns to completed storer.store([ '110', ['begin', messages.begin(), {commitWatermark: '110'}], @@ -661,7 +686,7 @@ describe('change-streamer/storer', () => { name: 'bar', rowKey: {columns: ['a']}, }, - columns: [], + columns: ['d'], watermark: '0f', }, ], @@ -792,11 +817,11 @@ describe('change-streamer/storer', () => { expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` - { - "backfillRequests": Result [], - "lastWatermark": "112", - } - `); + { + "backfillRequests": Result [], + "lastWatermark": "112", + } + `); }); test('non-owner purge prevented', async () => { diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 29e5750123..fd7649fedc 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -184,7 +184,7 @@ export class Storer implements Service { this.#queue.enqueue(['ready', resolve]); await ready; - const [[{lastWatermark}], backfillRequests] = await this.#db.begin( + const [[{lastWatermark}], result] = await this.#db.begin( Mode.READONLY, sql => [ sql<{lastWatermark: string}[]>` @@ -193,7 +193,7 @@ export class Storer implements Service { // Formats a BackfillRequest using json_object_agg() to construct the // `columns` object. It is LEFT JOIN'ed with the `tableMetadata` table // to make it optional and possibly `null`. - sql` + sql` SELECT json_build_object( 'schema', b."schema", @@ -206,11 +206,14 @@ export class Storer implements Service { LEFT JOIN ${this.#cdc('tableMetadata')} as t ON (b."schema" = t."schema" AND b."table" = t."table") GROUP BY b."schema", b."table", t."metadata" - `.then(result => v.parse(result, backfillRequestsSchema)), + `, ], ); - return {lastWatermark, backfillRequests}; + return { + lastWatermark, + backfillRequests: v.parse(result, backfillRequestsSchema), + }; } async getMinWatermarkForCatchup(): Promise { @@ -696,7 +699,7 @@ export class Storer implements Service { relation: {schema, name: table, rowKey}, columns, } = change; - const cols = [...rowKey.columns, columns]; + const cols = [...rowKey.columns, ...columns]; stmts.push( sql`DELETE FROM ${this.#cdc('backfilling')} WHERE "schema" = ${schema} AND "table" = ${table} AND "column" IN ${sql(cols)}`, From cc32aa9044b032f430dd2fa765f1be48d5545978 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 09:06:07 +0000 Subject: [PATCH 095/495] Remove @rocicorp/prettier-config dependency (#5595) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `@rocicorp/prettier-config` is a trivial wrapper around 5 prettier settings. Inline the config directly instead of taking an external dependency. ## Changes - Add root `.prettierrc` with the settings previously exported by `@rocicorp/prettier-config`: ```json { "singleQuote": true, "trailingComma": "all", "arrowParens": "avoid", "bracketSpacing": false, "quoteProps": "consistent" } ``` - Remove `"prettier": "@rocicorp/prettier-config"` and `@rocicorp/prettier-config` devDependency from all `package.json` files — prettier discovers the root `.prettierrc` automatically via directory traversal - Merge base settings into `prod/package.json`'s existing prettier config (which has YAML-specific overrides) to preserve equivalent behavior > [!WARNING] > >

> Firewall rules blocked me from connecting to one or more addresses (expand for details) > > #### I tried to connect to the following addresses, but was blocked by firewall rules: > > - `checkpoint.prisma.io` > - Triggering command: `/opt/hostedtoolcache/node/24.13.0/x64/bin/node /opt/hostedtoolcache/node/24.13.0/x64/bin/node /home/REDACTED/work/mono/mono/node_modules/prisma/build/child {"product":"prisma","version":"7.2.0","cli_install_type":"local","information":"","local_timestamp":"2026-02-24T08:29:14Z","project_hash":"4d170c0b","cli_path":"/home/REDACTED/work/mono/mono/node_modules/.bin/prisma","cli_path_hash":"2ea86ac5","endpoint":"h` (dns block) > > If you need me to access, download, or install something from one of these locations, you can either: > > - Configure [Actions setup steps](https://gh.io/copilot/actions-setup-steps) to set up my environment, which run before the firewall is enabled > - Add the appropriate URLs or hosts to the custom allowlist in this repository's [Copilot coding agent settings](https://github.com/rocicorp/mono/settings/copilot/coding_agent) (admins only) > >
Original prompt > Can you get rid of the dependency on `@rocicorp/prettier-config`. All it does is export this: > > ```json > { > "singleQuote": true, > "trailingComma": "all", > "arrowParens": "avoid", > "bracketSpacing": false, > "quoteProps": "consistent" > } > ``` > > The user has attached the following file paths as relevant context: > - AGENTS.md > - CLAUDE.md
Created from [VS Code](https://code.visualstudio.com/docs/copilot/copilot-coding-agent). --- ✨ Let Copilot coding agent [set things up for you](https://github.com/rocicorp/mono/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arv <45845+arv@users.noreply.github.com> Co-authored-by: Erik Arvidsson --- .prettierrc | 7 + apps/otel-proxy/package.json | 4 +- apps/zbugs/package.json | 4 +- package-lock.json | 1555 +++++++++++++----- package.json | 4 +- packages/analyze-query/package.json | 4 +- packages/ast-to-zql/package.json | 4 +- packages/datadog/package.json | 4 +- packages/otel/package.json | 1 - packages/replicache-perf/package.json | 4 +- packages/replicache/package.json | 4 +- packages/shared/package.json | 4 +- packages/z2s/package.json | 4 +- packages/zero-cache/package.json | 4 +- packages/zero-client/package.json | 4 +- packages/zero-events/package.json | 4 +- packages/zero-pg/package.json | 2 - packages/zero-protocol/package.json | 4 +- packages/zero-react-native/package.json | 4 +- packages/zero-react/package.json | 4 +- packages/zero-schema/package.json | 4 +- packages/zero-server/package.json | 2 - packages/zero-solid/package.json | 4 +- packages/zero-types/package.json | 4 +- packages/zero/package.json | 4 +- packages/zql-benchmarks/package.json | 2 - packages/zql-integration-tests/package.json | 4 +- packages/zql/package.json | 2 - packages/zqlite-zql-test/package.json | 2 - packages/zqlite/package.json | 2 - prod/functions/package.json | 5 +- prod/package.json | 5 + prod/sst/package.json | 4 +- tools/client-simulator/package.json | 4 +- tools/load-generator/package.json | 4 +- tools/process-tracker/package.json | 4 +- tools/sqlite-io-yield-simulator/package.json | 4 +- tools/verify-package-deps/package.json | 4 +- 38 files changed, 1142 insertions(+), 551 deletions(-) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000..8eefecaa40 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "arrowParens": "avoid", + "bracketSpacing": false, + "quoteProps": "consistent" +} diff --git a/apps/otel-proxy/package.json b/apps/otel-proxy/package.json index 8a486757ed..eaac195e7c 100644 --- a/apps/otel-proxy/package.json +++ b/apps/otel-proxy/package.json @@ -17,11 +17,9 @@ "@vercel/node": "^3.0.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/node": "^22.10.5", "@vitest/coverage-v8": "4.0.15", "typescript": "~5.9.3", "vitest": "4.0.15" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 1b26357d1c..d3cd6efbf0 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -71,7 +71,6 @@ "zod": "^4.1.11" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@tailwindcss/forms": "^0.5.0", "@types/js-cookie": "^3.0.6", "@types/k6": "^0.53.2", @@ -96,6 +95,5 @@ "vite-plugin-svgr": "^4.5.0", "vite-tsconfig-paths": "^5.1.4", "vitest": "4.0.15" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/package-lock.json b/package-lock.json index cce67b2914..a818f76975 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "tools/*" ], "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@vitest/browser-playwright": "^4.0.15", "@vitest/coverage-v8": "4.0.15", "@vitest/runner": "4.0.15", @@ -36,7 +35,6 @@ "@vercel/node": "^3.0.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/node": "^22.10.5", "@vitest/coverage-v8": "4.0.15", "typescript": "~5.9.3", @@ -100,7 +98,6 @@ "zod": "^4.1.11" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@tailwindcss/forms": "^0.5.0", "@types/js-cookie": "^3.0.6", "@types/k6": "^0.53.2", @@ -196,7 +193,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -224,7 +220,6 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -384,7 +379,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -487,6 +481,7 @@ "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -702,7 +697,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -1766,7 +1760,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2120,6 +2113,7 @@ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -2136,6 +2130,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2149,6 +2144,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2164,6 +2160,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2173,7 +2170,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -2181,6 +2179,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -2191,6 +2190,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -2201,6 +2201,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2308,6 +2309,7 @@ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2326,6 +2328,7 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2354,6 +2357,7 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2367,6 +2371,7 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2380,6 +2385,7 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2393,6 +2399,7 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2409,6 +2416,7 @@ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2437,6 +2445,7 @@ "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2453,6 +2462,7 @@ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2499,6 +2509,7 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2512,6 +2523,7 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2540,6 +2552,7 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2553,6 +2566,7 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2566,6 +2580,7 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2579,6 +2594,7 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2592,6 +2608,7 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2605,6 +2622,7 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2618,6 +2636,7 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2634,6 +2653,7 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2952,6 +2972,7 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -3879,6 +3900,7 @@ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -4105,7 +4127,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -4128,7 +4149,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -6645,7 +6665,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6861,7 +6880,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7374,7 +7392,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7476,8 +7493,7 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.6", @@ -8391,6 +8407,7 @@ "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -8402,6 +8419,7 @@ "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -8424,6 +8442,7 @@ "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -8447,6 +8466,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8465,6 +8485,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -8475,6 +8496,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8491,6 +8513,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8507,7 +8530,8 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/config/node_modules/@babel/code-frame": { "version": "7.10.4", @@ -8515,6 +8539,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8525,6 +8550,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8543,6 +8569,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -8553,6 +8580,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8569,6 +8597,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8586,6 +8615,7 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8597,6 +8627,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8607,6 +8638,7 @@ "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8621,6 +8653,7 @@ "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -8643,7 +8676,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/fingerprint/node_modules/brace-expansion": { "version": "2.0.2", @@ -8651,6 +8685,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8661,6 +8696,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8677,6 +8713,7 @@ "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8696,6 +8733,7 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8706,6 +8744,7 @@ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -8719,6 +8758,7 @@ "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -8730,6 +8770,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8740,6 +8781,7 @@ "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -8760,6 +8802,7 @@ "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -8781,6 +8824,7 @@ "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -8795,6 +8839,7 @@ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -8810,6 +8855,7 @@ "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -8821,14 +8867,16 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8836,6 +8884,7 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8848,14 +8897,16 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/xcpretty": { "version": "4.3.2", @@ -8863,6 +8914,7 @@ "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -8879,6 +8931,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8889,6 +8942,7 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8906,6 +8960,7 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8922,6 +8977,7 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9572,6 +9628,7 @@ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -9585,6 +9642,7 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -9595,6 +9653,7 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9612,6 +9671,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -9622,6 +9682,7 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9632,6 +9693,7 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9646,6 +9708,7 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9660,6 +9723,7 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9673,6 +9737,7 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9689,6 +9754,7 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9701,6 +9767,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -9711,6 +9778,7 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9724,6 +9792,7 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9740,6 +9809,7 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9770,6 +9840,7 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9797,6 +9868,7 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10125,7 +10197,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10248,7 +10319,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10482,7 +10552,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10579,7 +10648,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12508,7 +12576,6 @@ "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.2.0" }, @@ -12896,6 +12963,7 @@ "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -12906,6 +12974,7 @@ "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -12920,6 +12989,7 @@ "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -12980,6 +13050,7 @@ "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -13003,6 +13074,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13024,6 +13096,7 @@ "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -13055,6 +13128,7 @@ "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13065,6 +13139,7 @@ "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -13089,6 +13164,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13106,6 +13182,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13116,6 +13193,7 @@ "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13126,6 +13204,7 @@ "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -13140,6 +13219,7 @@ "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -13163,6 +13243,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13180,6 +13261,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13190,6 +13272,7 @@ "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13200,6 +13283,7 @@ "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13209,7 +13293,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@react-stately/utils": { "version": "3.10.4", @@ -13248,14 +13333,6 @@ "integrity": "sha512-kmMR5iLrwRIsvPZ+UXnmyAM3Mlvz6rCHrYfMsrMPgFYKLfo7amUH1RwHo6tuuqJiAvUbeaCoDtc8e+V0Mr4PSA==", "license": "Apache-2.0" }, - "node_modules/@rocicorp/prettier-config": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@rocicorp/prettier-config/-/prettier-config-0.4.0.tgz", - "integrity": "sha512-4/x0hpZVZmxzRNlK/gY8NdkyvSXeAT87n41X3honNLe1R+rSHXBEXP6IYMIWWVL2OF4+NxYsd7K6KLd0BpAdbw==", - "dependencies": { - "prettier": "^3.6.2" - } - }, "node_modules/@rocicorp/resolver": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@rocicorp/resolver/-/resolver-1.0.2.tgz", @@ -13624,7 +13701,6 @@ "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -13847,6 +13923,7 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -13857,6 +13934,7 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -14853,7 +14931,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -14987,7 +15064,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", "license": "MIT", - "peer": true, "dependencies": { "@tanstack/virtual-core": "3.10.9" }, @@ -15106,7 +15182,6 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15506,6 +15581,7 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -15646,7 +15722,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15680,7 +15755,6 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -15738,7 +15812,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -15889,7 +15962,8 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -15961,6 +16035,7 @@ "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -15972,6 +16047,7 @@ "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -16251,7 +16327,6 @@ "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -16275,7 +16350,6 @@ "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -16631,6 +16705,7 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" } @@ -16751,7 +16826,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16837,7 +16911,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16899,7 +16972,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -16941,7 +17013,8 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ansi-align": { "version": "3.0.1", @@ -17234,7 +17307,8 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/asn1": { "version": "0.2.6", @@ -17337,7 +17411,8 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/async-listen": { "version": "3.0.0", @@ -17479,6 +17554,7 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -17527,6 +17603,7 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -17545,6 +17622,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17566,6 +17644,7 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17581,6 +17660,7 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -17683,6 +17763,7 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -17692,7 +17773,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.29.1", @@ -17700,6 +17782,7 @@ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.29.1" } @@ -17710,6 +17793,7 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -17720,6 +17804,7 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -17747,6 +17832,7 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -17978,6 +18064,7 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -17991,6 +18078,7 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">=0.6" } @@ -18257,6 +18345,7 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -18267,6 +18356,7 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -18325,7 +18415,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -18346,6 +18435,7 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -18523,6 +18613,7 @@ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -18536,6 +18627,7 @@ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -18546,6 +18638,7 @@ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -18798,6 +18891,7 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -18826,6 +18920,7 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -18924,6 +19019,7 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -18936,6 +19032,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "peer": true, "engines": { "node": ">=6" }, @@ -18981,6 +19078,7 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8" } @@ -20241,7 +20339,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -20481,6 +20578,7 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -20904,6 +21002,7 @@ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "dotenv": "^16.4.5" }, @@ -21282,6 +21381,7 @@ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -21300,6 +21400,7 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -21378,7 +21479,6 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22078,7 +22178,8 @@ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/execa": { "version": "5.1.1", @@ -22127,6 +22228,7 @@ "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -22145,6 +22247,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -22155,6 +22258,7 @@ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.16.0" } @@ -22164,7 +22268,8 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/express": { "version": "4.22.1", @@ -22523,6 +22628,7 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", + "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -22536,6 +22642,7 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "bser": "2.1.1" } @@ -22819,7 +22926,8 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -22846,7 +22954,8 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/for-each": { "version": "0.3.5", @@ -22943,6 +23052,7 @@ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23161,6 +23271,7 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -23242,6 +23353,7 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -23877,14 +23989,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-parser": { "version": "0.29.1", @@ -23892,6 +24006,7 @@ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.29.1" } @@ -23931,7 +24046,6 @@ "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -24377,6 +24491,7 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -24622,6 +24737,7 @@ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -24996,6 +25112,7 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -25013,6 +25130,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -25088,6 +25206,7 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -25106,6 +25225,7 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25116,6 +25236,7 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -25142,6 +25263,7 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -25163,6 +25285,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25176,6 +25299,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25190,7 +25314,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-mock": { "version": "29.7.0", @@ -25198,6 +25323,7 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -25213,6 +25339,7 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25240,6 +25367,7 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -25258,6 +25386,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25271,6 +25400,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25285,7 +25415,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-worker": { "version": "29.7.0", @@ -25322,7 +25453,8 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jiti": { "version": "1.21.0", @@ -25401,7 +25533,8 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/jsdom": { "version": "26.1.0", @@ -25530,7 +25663,8 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -25634,6 +25768,7 @@ "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -25757,6 +25892,7 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -25768,6 +25904,7 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -25777,7 +25914,8 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lightningcss": { "version": "1.30.2", @@ -25817,12 +25955,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "android" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25838,12 +25976,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25859,12 +25997,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25880,12 +26018,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25901,12 +26039,12 @@ "cpu": [ "arm" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25922,12 +26060,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25943,12 +26081,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25964,12 +26102,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -25985,12 +26123,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26006,12 +26144,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26027,12 +26165,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26135,7 +26273,8 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -26149,6 +26288,7 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -26162,6 +26302,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -26175,6 +26316,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26190,6 +26332,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -26199,7 +26342,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -26207,6 +26351,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -26217,6 +26362,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -26227,6 +26373,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -26363,7 +26510,6 @@ "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -26397,6 +26543,7 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -26457,7 +26604,8 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -26846,7 +26994,8 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/merge-anything": { "version": "5.1.7", @@ -26902,6 +27051,7 @@ "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -26957,6 +27107,7 @@ "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -26973,6 +27124,7 @@ "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -26989,6 +27141,7 @@ "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27002,6 +27155,7 @@ "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -27022,6 +27176,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -27032,6 +27187,7 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -27048,6 +27204,7 @@ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -27062,6 +27219,7 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -27076,6 +27234,7 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -27090,6 +27249,7 @@ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -27100,6 +27260,7 @@ "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27115,6 +27276,7 @@ "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27136,6 +27298,7 @@ "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27150,6 +27313,7 @@ "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27163,6 +27327,7 @@ "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27177,6 +27342,7 @@ "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27199,6 +27365,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27209,6 +27376,7 @@ "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27230,6 +27398,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27240,6 +27409,7 @@ "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27258,6 +27428,7 @@ "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27282,7 +27453,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", @@ -27290,6 +27462,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -27300,6 +27473,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -27313,6 +27487,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27323,6 +27498,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28339,7 +28515,6 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10.x" } @@ -28397,8 +28572,7 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", @@ -28443,7 +28617,6 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -28557,7 +28730,8 @@ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/netmask": { "version": "2.0.2", @@ -28688,7 +28862,8 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/node-releases": { "version": "2.0.27", @@ -28737,6 +28912,7 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -28753,6 +28929,7 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -28765,7 +28942,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -28853,7 +29031,8 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/nwsapi": { "version": "2.2.22", @@ -28888,6 +29067,7 @@ "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29074,6 +29254,7 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -29092,6 +29273,7 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -29102,6 +29284,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -29115,6 +29298,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29130,6 +29314,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -29139,7 +29324,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -29147,6 +29333,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -29157,6 +29344,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -29167,6 +29355,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -29180,6 +29369,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -29275,7 +29465,6 @@ "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -29311,6 +29500,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -29435,6 +29625,7 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -29619,6 +29810,7 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -29690,6 +29882,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -29780,7 +29973,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -30011,7 +30203,6 @@ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright-core": "1.53.2" }, @@ -30043,6 +30234,7 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -30058,6 +30250,7 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0.0" } @@ -30104,7 +30297,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31241,7 +31433,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31411,6 +31602,7 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -31500,7 +31692,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -31543,6 +31734,7 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -31590,6 +31782,7 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.4.0" } @@ -31600,6 +31793,7 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -31833,6 +32027,7 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, + "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -31858,6 +32053,7 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -32007,7 +32203,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32021,6 +32216,7 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -32032,6 +32228,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -32053,7 +32250,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32128,7 +32324,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -32203,7 +32398,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -32920,6 +33114,7 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, + "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -32935,6 +33130,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "path-parse": "^1.0.5" } @@ -32986,6 +33182,7 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "global-dirs": "^0.1.1" }, @@ -32999,6 +33196,7 @@ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -33025,7 +33223,8 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/resolve.exports": { "version": "2.0.3", @@ -33033,6 +33232,7 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -33058,6 +33258,7 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -33072,6 +33273,7 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -33082,6 +33284,7 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -33160,7 +33363,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33369,7 +33571,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -33567,6 +33768,7 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -33585,7 +33787,6 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" } @@ -33953,6 +34154,7 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -34042,6 +34244,7 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -34126,7 +34329,6 @@ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -34332,6 +34534,7 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -34345,6 +34548,7 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -34361,7 +34565,8 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -34369,6 +34574,7 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34382,6 +34588,7 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=8" } @@ -34412,6 +34619,7 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">= 0.10.0" } @@ -34583,7 +34791,8 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/style-to-js": { "version": "1.1.21", @@ -34669,6 +34878,7 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -34779,7 +34989,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -34926,6 +35135,7 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -34936,6 +35146,7 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -34952,7 +35163,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -35159,7 +35369,8 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/throttleit": { "version": "2.1.0", @@ -35261,7 +35472,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -35323,7 +35533,8 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -35500,15 +35711,13 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -36139,6 +36348,7 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -36250,7 +36460,6 @@ "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 18" }, @@ -36955,6 +37164,7 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -37033,7 +37243,6 @@ "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -37279,7 +37488,8 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -37300,6 +37510,7 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -37332,6 +37543,7 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -37347,7 +37559,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -37766,7 +37977,8 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/whatwg-mimetype": { "version": "4.0.0", @@ -37794,6 +38006,7 @@ "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -37809,6 +38022,7 @@ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=8" } @@ -37950,7 +38164,8 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/wordwrapjs": { "version": "5.1.0", @@ -38031,7 +38246,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -38092,6 +38306,7 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -38106,6 +38321,7 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -38150,6 +38366,7 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -38164,6 +38381,7 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0" } @@ -38174,6 +38392,7 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0" } @@ -38262,6 +38481,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -38400,6 +38620,7 @@ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", + "peer": true, "peerDependencies": { "zod": "^3.24.1" } @@ -38479,7 +38700,6 @@ "chalk": "^5.3.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "ast-to-zql": "0.0.0", "otel": "0.0.0", "shared": "0.0.0", @@ -38520,7 +38740,6 @@ }, "devDependencies": { "@faker-js/faker": "^9.6.0", - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", @@ -38549,7 +38768,6 @@ "devDependencies": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "shared": "0.0.0", "typescript": "~5.9.3", @@ -38603,7 +38821,6 @@ }, "devDependencies": { "@op-engineering/op-sqlite": ">=15", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/zero-sqlite3": "^1.0.15", "@types/command-line-usage": "^5.0.2", "@vitest/runner": "4.0.15", @@ -38677,7 +38894,6 @@ }, "packages/replicache-perf": { "dependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/command-line-args": "^5.2.3", "@types/command-line-usage": "^5.0.2", "command-line-args": "^6.0.1", @@ -38731,7 +38947,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -38832,6 +39047,7 @@ "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -38920,6 +39136,7 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -38930,6 +39147,7 @@ "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -38952,6 +39170,7 @@ "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -38975,6 +39194,7 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -38998,6 +39218,7 @@ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -39036,6 +39257,7 @@ "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -39058,6 +39280,7 @@ "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -39084,6 +39307,7 @@ "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39094,6 +39318,7 @@ "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -39108,6 +39333,7 @@ "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -39168,6 +39394,7 @@ "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -39190,6 +39417,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -39202,6 +39430,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -39223,6 +39452,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39236,6 +39466,7 @@ "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -39267,6 +39498,7 @@ "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39277,6 +39509,7 @@ "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -39301,6 +39534,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39323,6 +39557,7 @@ "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39333,6 +39568,7 @@ "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -39347,6 +39583,7 @@ "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -39370,6 +39607,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -39380,6 +39618,7 @@ "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39390,6 +39629,7 @@ "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39399,7 +39639,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/@react-native/virtualized-lists": { "version": "0.83.1", @@ -39407,6 +39648,7 @@ "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -39431,6 +39673,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -39443,7 +39686,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/babel-preset-expo": { "version": "54.0.10", @@ -39451,6 +39695,7 @@ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -39495,6 +39740,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -39505,6 +39751,7 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -39515,6 +39762,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -39579,6 +39827,7 @@ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -39595,6 +39844,7 @@ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -39610,6 +39860,7 @@ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -39637,6 +39888,7 @@ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -39648,6 +39900,7 @@ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -39665,6 +39918,7 @@ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -39694,6 +39948,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -39712,6 +39967,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -39727,14 +39983,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/lru-cache": { "version": "11.2.4", @@ -39742,6 +40000,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -39752,6 +40011,7 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -39807,6 +40067,7 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -39823,6 +40084,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -39833,6 +40095,7 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -39849,6 +40112,7 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39862,6 +40126,7 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -39882,6 +40147,7 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -39897,6 +40163,7 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -39918,6 +40185,7 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -39932,6 +40200,7 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -39945,6 +40214,7 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -39959,6 +40229,7 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -39981,6 +40252,7 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -40002,6 +40274,7 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40020,6 +40293,7 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40044,7 +40318,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/metro/node_modules/hermes-parser": { "version": "0.32.0", @@ -40052,6 +40327,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40062,6 +40338,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40084,6 +40361,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -40094,6 +40372,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -40107,6 +40386,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -40123,6 +40403,7 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -40136,6 +40417,7 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40149,6 +40431,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -40166,6 +40449,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -40183,6 +40467,7 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -40210,6 +40495,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -40225,6 +40511,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -40250,7 +40537,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native": { "version": "0.83.1", @@ -40318,6 +40606,7 @@ "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -40339,7 +40628,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -40347,6 +40637,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -40357,6 +40648,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -40368,6 +40660,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -40379,6 +40672,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40400,6 +40694,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40410,6 +40705,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -40423,6 +40719,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40444,14 +40741,16 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/source-map": { "version": "0.5.7", @@ -40459,6 +40758,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -40469,6 +40769,7 @@ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -40500,6 +40801,7 @@ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18.17" } @@ -40510,6 +40812,7 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -40530,7 +40833,6 @@ "semver": "^7.5.4" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/semver": "^7.5.1", "@types/strip-ansi": "^3.0.0", "@vitest/runner": "4.0.15", @@ -40592,7 +40894,6 @@ }, "devDependencies": { "@faker-js/faker": "^9.6.0", - "@rocicorp/prettier-config": "^0.4.0", "@types/pg": "^8.11.11", "@vitest/runner": "4.0.15", "pg": "^8.16.3", @@ -40672,7 +40973,6 @@ }, "devDependencies": { "@op-engineering/op-sqlite": ">=15", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", @@ -40754,7 +41054,6 @@ "zqlite": "0.0.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/zero-events": "0.0.3", "@testcontainers/postgresql": "^10.9.0", "@types/node": "^22.10.5", @@ -40825,7 +41124,6 @@ "@rocicorp/resolver": "^1.0.2" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@vitest/ui": "^4.0.15", "ast-to-zql": "0.0.0", "datadog": "0.0.0", @@ -40859,7 +41157,6 @@ "version": "0.0.3", "license": "Apache-2.0", "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3" } @@ -40899,7 +41196,6 @@ "@rocicorp/logger": "^5.4.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "vitest": "4.0.15", "zero-cache": "0.0.0", @@ -40912,7 +41208,6 @@ "@badrap/valita": "0.3.11" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-types": "0.0.0" @@ -40935,7 +41230,6 @@ "packages/zero-react": { "version": "0.0.0", "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@testing-library/react": "^16.3.2", "@types/react": "^18.3.18", "react": "^18.3.1", @@ -40957,7 +41251,6 @@ "@rocicorp/resolver": "^1.0.2" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "replicache": "15.2.1", "shared": "0.0.0" } @@ -40965,7 +41258,6 @@ "packages/zero-schema": { "version": "0.0.0", "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "zero-protocol": "0.0.0", "zero-types": "0.0.0", @@ -40981,7 +41273,6 @@ "devDependencies": { "@prisma/adapter-pg": "^7.2.0", "@prisma/client": "^7.2.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "drizzle-orm": "^0.44.2", "pg": "^8.16.3", @@ -41000,7 +41291,6 @@ "packages/zero-solid": { "version": "0.0.0", "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@solidjs/testing-library": "^0.8.10", "jsdom": "^26.1.0", "shared": "0.0.0", @@ -41015,7 +41305,6 @@ "packages/zero-types": { "version": "0.0.0", "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.0.15" @@ -41041,6 +41330,7 @@ "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -41130,6 +41420,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41147,6 +41438,7 @@ "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -41169,6 +41461,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41186,6 +41479,7 @@ "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -41224,6 +41518,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41241,6 +41536,7 @@ "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -41263,6 +41559,7 @@ "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -41289,6 +41586,7 @@ "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -41311,6 +41609,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41323,6 +41622,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41344,6 +41644,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41354,6 +41655,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41367,6 +41669,7 @@ "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -41390,7 +41693,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/babel-preset-expo": { "version": "54.0.4", @@ -41398,6 +41702,7 @@ "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -41442,6 +41747,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -41492,6 +41798,7 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -41502,6 +41809,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -41566,6 +41874,7 @@ "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -41582,6 +41891,7 @@ "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -41597,6 +41907,7 @@ "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -41624,6 +41935,7 @@ "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -41635,6 +41947,7 @@ "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -41696,7 +42009,8 @@ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/minimatch": { "version": "9.0.5", @@ -41704,6 +42018,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -41720,6 +42035,7 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -41751,6 +42067,7 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -41778,6 +42095,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -41799,6 +42117,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -41812,6 +42131,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -41827,6 +42147,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -41850,7 +42171,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native": { "version": "0.82.0", @@ -41917,7 +42239,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -41925,6 +42248,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -41935,6 +42259,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41947,6 +42272,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41968,6 +42294,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41978,6 +42305,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41991,6 +42319,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -42012,14 +42341,16 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/tar": { "version": "7.5.1", @@ -42027,6 +42358,7 @@ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -42058,6 +42390,7 @@ "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18.17" } @@ -42204,6 +42537,7 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -42217,7 +42551,6 @@ "devDependencies": { "@faker-js/faker": "^9.6.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@standard-schema/spec": "^1.0.0", "fast-check": "^3.18.0", "nanoid": "^5.1.2", @@ -42233,7 +42566,6 @@ "mitata": "^1.0.34" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/tmp": "^0.2.6", "otel": "0.0.0", "shared": "0.0.0", @@ -42264,7 +42596,6 @@ "packages/zql-integration-tests": { "version": "0.0.0", "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/tmp": "^0.2.6", "otel": "0.0.0", "shared": "0.0.0", @@ -42346,7 +42677,6 @@ }, "devDependencies": { "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "fast-check": "^3.18.0", "nanoid": "^5.1.2", "otel": "0.0.0", @@ -42377,7 +42707,6 @@ }, "devDependencies": { "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "shared": "0.0.0", "typescript": "~5.9.3", @@ -42458,7 +42787,6 @@ "ws": "^8.18.1" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "zero-protocol": "0.0.0" } @@ -42491,7 +42819,6 @@ "postgres": "3.4.7" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0" } }, @@ -42521,7 +42848,6 @@ "pidusage": "^4.0.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/pidusage": "^2.0.5", "shared": "0.0.0" } @@ -42535,7 +42861,6 @@ "zqlite": "0.0.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0" } }, @@ -42545,7 +42870,6 @@ "oxc-parser": "^0.94.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/node": "^22.10.5", "typescript": "~5.9.3" }, @@ -42574,6 +42898,7 @@ "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, + "peer": true, "requires": {} }, "@ai-sdk/gateway": { @@ -42713,7 +43038,6 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", - "peer": true, "requires": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -43548,7 +43872,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -43790,6 +44113,7 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, + "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -43802,6 +44126,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -43811,6 +44136,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -43822,6 +44148,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -43830,25 +44157,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -43912,6 +44243,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, + "peer": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -43923,6 +44255,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43938,6 +44271,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43947,6 +44281,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -43956,6 +44291,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -43965,6 +44301,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -43974,6 +44311,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -43991,6 +44329,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44000,6 +44339,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44025,6 +44365,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44034,6 +44375,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44051,6 +44393,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44060,6 +44403,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44069,6 +44413,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44078,6 +44423,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44087,6 +44433,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44096,6 +44443,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44105,6 +44453,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44114,6 +44463,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44292,6 +44642,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -44861,6 +45212,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -44985,14 +45337,12 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "peer": true + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -46026,7 +46376,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -46191,7 +46540,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "peer": true, "requires": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -46550,8 +46898,7 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "peer": true + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" }, "which": { "version": "4.0.0", @@ -46612,8 +46959,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true, - "peer": true + "dev": true }, "@electric-sql/pglite-socket": { "version": "0.0.6", @@ -47024,6 +47370,7 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -47034,6 +47381,7 @@ "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -47055,6 +47403,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47064,6 +47413,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47074,13 +47424,15 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47090,6 +47442,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47102,6 +47455,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, + "peer": true, "requires": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -47124,6 +47478,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47134,13 +47489,15 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47150,6 +47507,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47161,13 +47519,15 @@ "version": "54.0.10", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true + "dev": true, + "peer": true }, "@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, + "peer": true, "requires": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -47178,6 +47538,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "peer": true, "requires": { "ms": "^2.1.1" } @@ -47189,6 +47550,7 @@ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, + "peer": true, "requires": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -47202,6 +47564,7 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -47220,13 +47583,15 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -47236,6 +47601,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -47247,6 +47613,7 @@ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -47264,13 +47631,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true + "dev": true, + "peer": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -47282,6 +47651,7 @@ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -47292,6 +47662,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47303,6 +47674,7 @@ "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, + "peer": true, "requires": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -47314,6 +47686,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, + "peer": true, "requires": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -47334,6 +47707,7 @@ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -47344,6 +47718,7 @@ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, + "peer": true, "requires": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -47358,6 +47733,7 @@ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, + "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -47368,19 +47744,22 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true + "dev": true, + "peer": true }, "@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true + "dev": true, + "peer": true }, "@expo/spawn-async": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.3" } @@ -47389,19 +47768,22 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true + "dev": true, + "peer": true }, "@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true + "dev": true, + "peer": true }, "@expo/xcpretty": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -47414,6 +47796,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47423,6 +47806,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -47433,6 +47817,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -47442,6 +47827,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -47945,6 +48331,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "peer": true, "requires": { "minipass": "^7.0.4" } @@ -47953,13 +48340,15 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true + "dev": true, + "peer": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "peer": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -47973,6 +48362,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -47981,13 +48371,15 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "peer": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -47998,6 +48390,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -48008,6 +48401,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -48017,6 +48411,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "requires": { "p-try": "^2.0.0" } @@ -48026,6 +48421,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -48036,13 +48432,15 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true + "dev": true, + "peer": true }, "@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3" } @@ -48052,6 +48450,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "peer": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -48064,6 +48463,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -48086,6 +48486,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -48109,6 +48510,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -48332,7 +48734,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "peer": true, "requires": { "@types/mdx": "^2.0.0" } @@ -48426,8 +48827,7 @@ "@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "peer": true + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" }, "@noble/curves": { "version": "1.8.1", @@ -48606,8 +49006,7 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "peer": true + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, "@opentelemetry/api-logs": { "version": "0.203.0", @@ -48682,7 +49081,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", - "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -49823,7 +50221,6 @@ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, - "peer": true, "requires": { "@prisma/client-runtime-utils": "7.2.0" } @@ -50125,13 +50522,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -50142,6 +50541,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -50195,6 +50595,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50210,6 +50611,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50226,6 +50628,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, + "peer": true, "requires": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -50240,13 +50643,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true + "dev": true, + "peer": true }, "@react-native/dev-middleware": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -50267,6 +50672,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50277,6 +50683,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50287,13 +50694,15 @@ "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true + "dev": true, + "peer": true }, "@react-native/debugger-shell": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -50304,6 +50713,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -50323,6 +50733,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50333,6 +50744,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50343,19 +50755,22 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/js-polyfills": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/normalize-colors": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true + "dev": true, + "peer": true }, "@react-stately/utils": { "version": "3.10.4", @@ -50384,14 +50799,6 @@ "resolved": "https://registry.npmjs.org/@rocicorp/logger/-/logger-5.4.0.tgz", "integrity": "sha512-kmMR5iLrwRIsvPZ+UXnmyAM3Mlvz6rCHrYfMsrMPgFYKLfo7amUH1RwHo6tuuqJiAvUbeaCoDtc8e+V0Mr4PSA==" }, - "@rocicorp/prettier-config": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@rocicorp/prettier-config/-/prettier-config-0.4.0.tgz", - "integrity": "sha512-4/x0hpZVZmxzRNlK/gY8NdkyvSXeAT87n41X3honNLe1R+rSHXBEXP6IYMIWWVL2OF4+NxYsd7K6KLd0BpAdbw==", - "requires": { - "prettier": "^3.6.2" - } - }, "@rocicorp/resolver": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@rocicorp/resolver/-/resolver-1.0.2.tgz", @@ -50420,7 +50827,6 @@ "@postgresql-typed/oids": "^0.2.0", "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/resolver": "^1.0.2", "@rocicorp/zero-sqlite3": "^1.0.15", "@standard-schema/spec": "^1.0.0", @@ -50476,6 +50882,7 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -50548,6 +50955,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50560,6 +50968,7 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, + "peer": true, "requires": { "chalk": "^4.1.2" }, @@ -50569,6 +50978,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50581,6 +50991,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -50610,6 +51021,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50622,6 +51034,7 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -50640,6 +51053,7 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, + "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -50654,6 +51068,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50669,6 +51084,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -50679,6 +51095,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50693,6 +51110,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -50702,6 +51120,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -50713,6 +51132,7 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -50722,13 +51142,15 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "babel-preset-expo": { "version": "54.0.4", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -50759,6 +51181,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -50788,13 +51211,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true + "dev": true, + "peer": true }, "expo": { "version": "54.0.13", @@ -50831,6 +51256,7 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, + "peer": true, "requires": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -50841,6 +51267,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -50851,6 +51278,7 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, + "peer": true, "requires": {} }, "expo-font": { @@ -50868,6 +51296,7 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, + "peer": true, "requires": {} }, "expo-modules-core": { @@ -50875,6 +51304,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4" } @@ -50906,13 +51336,15 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -50922,6 +51354,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "peer": true, "requires": { "minipass": "^7.1.2" } @@ -50935,13 +51368,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true + "dev": true, + "peer": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -50952,7 +51387,8 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -50961,6 +51397,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -50971,7 +51408,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -50986,7 +51424,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true }, "react-native": { "version": "0.82.0", @@ -51036,13 +51475,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -51052,6 +51493,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51062,6 +51504,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51076,6 +51519,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51085,6 +51529,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51094,6 +51539,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51109,19 +51555,22 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true + "dev": true, + "peer": true }, "tar": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, + "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -51140,7 +51589,8 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true + "dev": true, + "peer": true }, "vite": { "version": "7.2.7", @@ -51186,14 +51636,14 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true + "dev": true, + "peer": true } } }, "@rocicorp/zero-events": { "version": "file:packages/zero-events", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3" }, @@ -51381,7 +51831,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -51557,6 +52006,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "peer": true, "requires": { "type-detect": "4.0.8" } @@ -51566,6 +52016,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "peer": true, "requires": { "@sinonjs/commons": "^3.0.0" } @@ -52217,7 +52668,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "requires": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -52300,7 +52750,6 @@ "version": "3.10.9", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", - "peer": true, "requires": { "@tanstack/virtual-core": "3.10.9" } @@ -52377,7 +52826,6 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -52722,6 +53170,7 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -52848,7 +53297,6 @@ "version": "22.18.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", - "peer": true, "requires": { "undici-types": "~6.21.0" }, @@ -52880,7 +53328,6 @@ "version": "8.15.4", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", - "peer": true, "requires": { "@types/node": "*", "pg-protocol": "*", @@ -52931,7 +53378,6 @@ "version": "18.3.23", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", - "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -53070,7 +53516,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "peer": true }, "@types/strip-ansi": { "version": "3.0.0", @@ -53133,6 +53580,7 @@ "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -53143,6 +53591,7 @@ "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, + "peer": true, "requires": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -53350,7 +53799,6 @@ "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, - "peer": true, "requires": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -53375,7 +53823,6 @@ "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, - "peer": true, "requires": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -53633,7 +54080,8 @@ "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true + "dev": true, + "peer": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -53722,8 +54170,7 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "peer": true + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" }, "acorn-import-attributes": { "version": "1.9.5", @@ -53776,7 +54223,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -53820,7 +54266,6 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", - "peer": true, "requires": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -53850,7 +54295,6 @@ "version": "file:packages/analyze-query", "requires": { "@dotenvx/dotenvx": "^1.39.0", - "@rocicorp/prettier-config": "^0.4.0", "ast-to-zql": "0.0.0", "chalk": "^5.3.0", "otel": "0.0.0", @@ -53875,7 +54319,8 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true + "dev": true, + "peer": true }, "ansi-align": { "version": "3.0.1", @@ -54076,7 +54521,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "dev": true, + "peer": true }, "asn1": { "version": "0.2.6", @@ -54108,7 +54554,6 @@ "version": "file:packages/ast-to-zql", "requires": { "@faker-js/faker": "^9.6.0", - "@rocicorp/prettier-config": "^0.4.0", "prettier": "^3.5.3", "shared": "0.0.0", "zero-cache": "0.0.0", @@ -54169,7 +54614,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "dev": true, + "peer": true }, "async-listen": { "version": "3.0.0", @@ -54253,6 +54699,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "peer": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -54285,6 +54732,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -54298,6 +54746,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -54312,6 +54761,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "peer": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -54325,6 +54775,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -54402,6 +54853,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, + "peer": true, "requires": { "@babel/types": "^7.26.0" } @@ -54410,13 +54862,15 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.29.1" } @@ -54426,6 +54880,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, + "peer": true, "requires": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -54435,6 +54890,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, + "peer": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -54458,6 +54914,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "peer": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -54607,6 +55064,7 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, + "peer": true, "requires": { "open": "^8.0.4" } @@ -54615,7 +55073,8 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true + "dev": true, + "peer": true }, "big.js": { "version": "5.2.2", @@ -54795,6 +55254,7 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, + "peer": true, "requires": { "stream-buffers": "2.2.x" } @@ -54804,6 +55264,7 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, + "peer": true, "requires": { "big-integer": "1.6.x" } @@ -54835,7 +55296,6 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "peer": true, "requires": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -54849,6 +55309,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "peer": true, "requires": { "node-int64": "^0.4.0" } @@ -54959,6 +55420,7 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, + "peer": true, "requires": { "callsites": "^2.0.0" }, @@ -54967,7 +55429,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -54976,6 +55439,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, + "peer": true, "requires": { "caller-callsite": "^2.0.0" } @@ -55135,6 +55599,7 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55152,6 +55617,7 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55220,6 +55686,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -55228,7 +55695,8 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true + "dev": true, + "peer": true }, "cli-table3": { "version": "0.6.5", @@ -55244,7 +55712,6 @@ "requires": { "@dotenvx/dotenvx": "^1.39.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "nanoid": "^5.1.2", "shared": "0.0.0", "ws": "^8.18.1", @@ -55272,7 +55739,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true + "dev": true, + "peer": true }, "clone-deep": { "version": "4.0.1", @@ -56072,8 +56540,7 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "peer": true + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-timer": { "version": "3.0.1", @@ -56152,7 +56619,6 @@ "requires": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "shared": "0.0.0", "typescript": "~5.9.3", @@ -56244,6 +56710,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "peer": true, "requires": { "clone": "^1.0.2" } @@ -56529,6 +56996,7 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, + "peer": true, "requires": { "dotenv": "^16.4.5" } @@ -56714,7 +57182,8 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true + "dev": true, + "peer": true }, "error-ex": { "version": "1.3.2", @@ -56729,6 +57198,7 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, + "peer": true, "requires": { "stackframe": "^1.3.4" } @@ -56782,7 +57252,6 @@ "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "peer": true, "requires": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", @@ -57155,7 +57624,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true + "dev": true, + "peer": true }, "execa": { "version": "5.1.1", @@ -57189,6 +57659,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -57202,7 +57673,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -57210,13 +57682,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true + "dev": true, + "peer": true }, "exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true + "dev": true, + "peer": true }, "express": { "version": "4.22.1", @@ -57486,13 +57960,15 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true + "dev": true, + "peer": true }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "peer": true, "requires": { "bser": "2.1.1" } @@ -57681,7 +58157,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true + "dev": true, + "peer": true }, "follow-redirects": { "version": "1.15.11", @@ -57692,7 +58169,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true + "dev": true, + "peer": true }, "for-each": { "version": "0.3.5", @@ -57749,7 +58227,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true + "dev": true, + "peer": true }, "fresh": { "version": "0.5.2", @@ -57902,7 +58381,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "peer": true }, "get-port": { "version": "7.1.0", @@ -57952,7 +58432,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true + "dev": true, + "peer": true }, "giget": { "version": "2.0.0", @@ -58395,19 +58876,22 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true + "dev": true, + "peer": true }, "hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true + "dev": true, + "peer": true }, "hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.29.1" } @@ -58444,8 +58928,7 @@ "version": "4.10.6", "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true, - "peer": true + "dev": true }, "hpack.js": { "version": "2.1.6", @@ -58739,6 +59222,7 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, + "peer": true, "requires": { "queue": "6.0.2" } @@ -58899,7 +59383,8 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true + "dev": true, + "peer": true }, "is-docker": { "version": "2.2.1", @@ -59116,6 +59601,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -59128,7 +59614,8 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59185,6 +59672,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -59198,13 +59686,15 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true + "dev": true, + "peer": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -59225,6 +59715,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -59241,13 +59732,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59258,7 +59751,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59267,6 +59761,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -59277,7 +59772,8 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true + "dev": true, + "peer": true }, "jest-util": { "version": "29.7.0", @@ -59297,6 +59793,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -59310,13 +59807,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59327,7 +59826,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59356,7 +59856,8 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true + "dev": true, + "peer": true }, "jiti": { "version": "1.21.0", @@ -59420,7 +59921,8 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true + "dev": true, + "peer": true }, "jsdom": { "version": "26.1.0", @@ -59513,7 +60015,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "peer": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -59596,7 +60099,8 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true + "dev": true, + "peer": true }, "latest-version": { "version": "7.0.0", @@ -59689,6 +60193,7 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, + "peer": true, "requires": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -59699,6 +60204,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "requires": { "ms": "2.0.0" } @@ -59707,7 +60213,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59736,78 +60243,78 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-freebsd-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-x64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-x64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-win32-arm64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-win32-x64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lilconfig": { "version": "2.1.0", @@ -59834,7 +60341,6 @@ "requires": { "@dotenvx/dotenvx": "^1.39.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "nanoid": "^5.1.2", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", @@ -59895,7 +60401,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true + "dev": true, + "peer": true }, "lodash.uniq": { "version": "4.5.0", @@ -59907,6 +60414,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, + "peer": true, "requires": { "chalk": "^2.0.1" }, @@ -59916,6 +60424,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -59925,6 +60434,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -59936,6 +60446,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -59944,25 +60455,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -60052,7 +60567,6 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, - "peer": true, "requires": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -60078,6 +60592,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "peer": true, "requires": { "tmpl": "1.0.5" } @@ -60115,7 +60630,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true + "dev": true, + "peer": true }, "math-intrinsics": { "version": "1.1.0", @@ -60404,7 +60920,8 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true + "dev": true, + "peer": true }, "merge-anything": { "version": "5.1.7", @@ -60440,6 +60957,7 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -60487,19 +61005,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "peer": true, "requires": { "mime-db": "1.52.0" } @@ -60508,13 +61029,15 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -60524,6 +61047,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -60536,6 +61060,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, + "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -60548,6 +61073,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60557,6 +61083,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, + "peer": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -60573,6 +61100,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -60582,6 +61110,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, + "peer": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -60594,6 +61123,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, + "peer": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -60604,6 +61134,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -60614,6 +61145,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "peer": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -60623,7 +61155,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60632,6 +61165,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -60643,6 +61177,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, + "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -60660,6 +61195,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -60670,6 +61206,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60679,6 +61216,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -60689,6 +61227,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -60706,7 +61245,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60715,6 +61255,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -60728,7 +61269,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60737,6 +61279,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -60751,6 +61294,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61385,8 +61929,7 @@ "version": "15.10.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true, - "peer": true + "dev": true }, "graphql-subscriptions": { "version": "1.2.1", @@ -61429,8 +61972,7 @@ "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "peer": true + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" }, "mri": { "version": "1.2.0", @@ -61461,7 +62003,6 @@ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, - "peer": true, "requires": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -61542,7 +62083,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true + "dev": true, + "peer": true }, "netmask": { "version": "2.0.2", @@ -61633,7 +62175,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "peer": true }, "node-releases": { "version": "2.0.27", @@ -61663,6 +62206,7 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, + "peer": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -61675,6 +62219,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, + "peer": true, "requires": { "lru-cache": "^10.0.1" } @@ -61683,7 +62228,8 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -61744,7 +62290,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true + "dev": true, + "peer": true }, "nwsapi": { "version": "2.2.22", @@ -61770,6 +62317,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -61889,6 +62437,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, + "peer": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -61902,13 +62451,15 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true + "dev": true, + "peer": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -61918,6 +62469,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -61929,6 +62481,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -61937,25 +62490,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -61965,6 +62522,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -61981,7 +62539,6 @@ "otel-proxy": { "version": "file:apps/otel-proxy", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "@types/node": "^22.10.5", "@vercel/node": "^3.0.0", "@vitest/coverage-v8": "4.0.15", @@ -62047,7 +62604,6 @@ "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.8.5.tgz", "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", "dev": true, - "peer": true, "requires": { "@oxlint-tsgolint/darwin-arm64": "0.8.5", "@oxlint-tsgolint/darwin-x64": "0.8.5", @@ -62072,6 +62628,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -62145,7 +62702,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "peer": true }, "pac-proxy-agent": { "version": "7.2.0", @@ -62282,6 +62840,7 @@ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, + "peer": true, "requires": { "pngjs": "^3.3.0" } @@ -62334,7 +62893,8 @@ "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 + "dev": true, + "peer": true }, "path-is-absolute": { "version": "1.0.1", @@ -62401,7 +62961,6 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -62564,7 +63123,6 @@ "version": "1.53.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", - "peer": true, "requires": { "fsevents": "2.3.2", "playwright-core": "1.53.2" @@ -62580,6 +63138,7 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, + "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -62590,7 +63149,8 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true + "dev": true, + "peer": true }, "portfinder": { "version": "1.0.38", @@ -62611,7 +63171,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -63239,7 +63798,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -63337,7 +63895,8 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true + "dev": true, + "peer": true }, "pretty-error": { "version": "4.0.0", @@ -63394,7 +63953,6 @@ "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", "dev": true, - "peer": true, "requires": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -63413,7 +63971,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true + "dev": true, + "peer": true }, "process": { "version": "0.11.10", @@ -63429,7 +63988,6 @@ "version": "file:tools/process-tracker", "requires": { "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@types/pidusage": "^2.0.5", "find-process": "^1.4.10", "pidusage": "^4.0.0", @@ -63448,13 +64006,15 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "peer": true }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "peer": true, "requires": { "asap": "~2.0.6" } @@ -63624,7 +64184,8 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true + "dev": true, + "peer": true }, "qs": { "version": "6.14.0", @@ -63639,6 +64200,7 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, + "peer": true, "requires": { "inherits": "~2.0.3" } @@ -63738,7 +64300,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -63748,6 +64309,7 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, + "peer": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -63758,6 +64320,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -63766,7 +64329,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -63815,7 +64377,6 @@ "version": "npm:@docusaurus/react-loadable@6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "peer": true, "requires": { "@types/react": "*" } @@ -63862,7 +64423,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "peer": true, "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -64345,7 +64905,6 @@ "@op-engineering/op-sqlite": ">=15", "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/resolver": "^1.0.2", "@rocicorp/zero-sqlite3": "^1.0.15", "@types/command-line-usage": "^5.0.2", @@ -64366,6 +64925,7 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -64437,6 +64997,7 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.3.3" } @@ -64446,6 +65007,7 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, + "peer": true, "requires": { "chalk": "^4.1.2" } @@ -64455,6 +65017,7 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -64474,6 +65037,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, + "peer": true, "requires": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -64496,6 +65060,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -64525,6 +65090,7 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -64543,6 +65109,7 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, + "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -64556,13 +65123,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true + "dev": true, + "peer": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -64573,6 +65142,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -64626,6 +65196,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -64641,6 +65212,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -64651,6 +65223,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -64665,6 +65238,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -64676,6 +65250,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, + "peer": true, "requires": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -64690,13 +65265,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true + "dev": true, + "peer": true }, "@react-native/dev-middleware": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -64717,6 +65294,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -64725,13 +65303,15 @@ "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true + "dev": true, + "peer": true }, "@react-native/debugger-shell": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -64742,6 +65322,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -64761,6 +65342,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -64771,25 +65353,29 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true + "dev": true, + "peer": true }, "@react-native/js-polyfills": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true + "dev": true, + "peer": true }, "@react-native/normalize-colors": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true + "dev": true, + "peer": true }, "@react-native/virtualized-lists": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -64799,19 +65385,22 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "babel-preset-expo": { "version": "54.0.10", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -64842,6 +65431,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -64850,13 +65440,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true }, "expo": { "version": "54.0.32", @@ -64893,6 +65485,7 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, + "peer": true, "requires": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -64903,6 +65496,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -64913,6 +65507,7 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, + "peer": true, "requires": {} }, "expo-font": { @@ -64930,6 +65525,7 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, + "peer": true, "requires": {} }, "expo-modules-autolinking": { @@ -64937,6 +65533,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -64950,6 +65547,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4" } @@ -64968,6 +65566,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -64979,6 +65578,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -64989,25 +65589,29 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true + "dev": true, + "peer": true }, "hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true + "dev": true, + "peer": true }, "lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -65055,13 +65659,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65071,6 +65677,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -65080,6 +65687,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -65092,6 +65700,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65103,6 +65712,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, + "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -65115,6 +65725,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65124,6 +65735,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, + "peer": true, "requires": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -65140,6 +65752,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -65151,6 +65764,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, + "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -65168,6 +65782,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -65178,6 +65793,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65187,6 +65803,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -65197,6 +65814,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -65215,6 +65833,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -65229,6 +65848,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65243,6 +65863,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65263,13 +65884,15 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "peer": true, "requires": { "mime-db": "1.52.0" } @@ -65279,6 +65902,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -65288,6 +65912,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "peer": true, "requires": { "minipass": "^7.1.2" } @@ -65297,6 +65922,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65306,6 +65932,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -65316,6 +65943,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -65325,13 +65953,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true + "dev": true, + "peer": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -65343,6 +65973,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -65360,7 +65991,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true }, "react-native": { "version": "0.83.1", @@ -65411,6 +66043,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -65425,13 +66058,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -65441,6 +66076,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -65450,13 +66086,15 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true + "dev": true, + "peer": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -65471,6 +66109,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65480,6 +66119,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65489,6 +66129,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -65497,25 +66138,29 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true + "dev": true, + "peer": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true }, "tar": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, + "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -65534,13 +66179,15 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true + "dev": true, + "peer": true }, "yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -65577,7 +66224,6 @@ "replicache-perf": { "version": "file:packages/replicache-perf", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "@types/command-line-args": "^5.2.3", "@types/command-line-usage": "^5.0.2", "command-line-args": "^6.0.1", @@ -65610,8 +66256,7 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "peer": true + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" }, "typescript": { "version": "5.9.3", @@ -65664,6 +66309,7 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, + "peer": true, "requires": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -65675,6 +66321,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, + "peer": true, "requires": { "path-parse": "^1.0.5" } @@ -65711,6 +66358,7 @@ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, + "peer": true, "requires": { "global-dirs": "^0.1.1" }, @@ -65720,6 +66368,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, + "peer": true, "requires": { "ini": "^1.3.4" } @@ -65740,13 +66389,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true + "dev": true, + "peer": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true + "dev": true, + "peer": true }, "responselike": { "version": "3.0.0", @@ -65761,6 +66412,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -65770,13 +66422,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "dev": true, + "peer": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -65830,7 +66484,6 @@ "version": "4.46.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", - "peer": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", @@ -65961,7 +66614,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -66096,7 +66748,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true + "dev": true, + "peer": true }, "serialize-javascript": { "version": "6.0.2", @@ -66110,8 +66763,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true, - "peer": true + "dev": true }, "seroval-plugins": { "version": "1.1.1", @@ -66264,7 +66916,6 @@ "@badrap/valita": "0.3.11", "@dotenvx/dotenvx": "^1.39.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/resolver": "^1.0.2", "@types/semver": "^7.5.1", "@types/strip-ansi": "^3.0.0", @@ -66410,6 +67061,7 @@ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, + "peer": true, "requires": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -66477,7 +67129,8 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true + "dev": true, + "peer": true }, "smart-buffer": { "version": "4.2.0", @@ -66541,7 +67194,6 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, - "peer": true, "requires": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -66649,7 +67301,6 @@ "requires": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "ws": "^8.18.1", "zqlite": "0.0.0" @@ -66705,6 +67356,7 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "peer": true, "requires": { "escape-string-regexp": "^2.0.0" }, @@ -66713,7 +67365,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -66727,13 +67380,15 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "dev": true, + "peer": true }, "stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, + "peer": true, "requires": { "type-fest": "^0.7.1" }, @@ -66742,7 +67397,8 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -66765,7 +67421,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true + "dev": true, + "peer": true }, "stream-shift": { "version": "1.0.3", @@ -66884,7 +67541,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true + "dev": true, + "peer": true }, "style-to-js": { "version": "1.1.21", @@ -66947,6 +67605,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -67023,7 +67682,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, - "peer": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -67132,13 +67790,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true + "dev": true, + "peer": true }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -67148,7 +67808,6 @@ "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", - "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -67296,7 +67955,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true + "dev": true, + "peer": true }, "throttleit": { "version": "2.1.0", @@ -67356,8 +68016,7 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "peer": true + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" } } }, @@ -67397,7 +68056,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "peer": true }, "to-regex-range": { "version": "5.0.1", @@ -67500,14 +68160,12 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "peer": true + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "peer": true, "requires": { "esbuild": "~0.27.0", "fsevents": "~2.3.3", @@ -67802,7 +68460,8 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "peer": true }, "type-fest": { "version": "4.41.0", @@ -67893,7 +68552,6 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, - "peer": true, "requires": {} }, "typescript": { @@ -68303,7 +68961,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true + "dev": true, + "peer": true }, "value-equal": { "version": "1.0.1", @@ -68324,7 +68983,6 @@ "verify-package-deps": { "version": "file:tools/verify-package-deps", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "@types/node": "^22.10.5", "oxc-parser": "^0.94.0", "typescript": "~5.9.3" @@ -68370,7 +69028,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fsevents": "~2.3.3", @@ -68465,7 +69122,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true + "dev": true, + "peer": true }, "w3c-xmlserializer": { "version": "5.0.0", @@ -68481,6 +69139,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "peer": true, "requires": { "makeerror": "1.0.12" } @@ -68507,6 +69166,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "peer": true, "requires": { "defaults": "^1.0.3" } @@ -68520,7 +69180,6 @@ "version": "5.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", - "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -68784,7 +69443,8 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true + "dev": true, + "peer": true }, "whatwg-mimetype": { "version": "4.0.0", @@ -68806,6 +69466,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, + "peer": true, "requires": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -68816,7 +69477,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -68907,7 +69569,8 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true + "dev": true, + "peer": true }, "wordwrapjs": { "version": "5.1.0", @@ -68965,7 +69628,6 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "peer": true, "requires": {} }, "wsl-utils": { @@ -68996,6 +69658,7 @@ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, + "peer": true, "requires": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -69005,7 +69668,8 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -69033,6 +69697,7 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "peer": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -69042,7 +69707,8 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -69050,7 +69716,8 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true + "dev": true, + "peer": true }, "xmlchars": { "version": "2.2.0", @@ -69107,7 +69774,8 @@ "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 + "dev": true, + "peer": true }, "z2s": { "version": "file:packages/z2s", @@ -69115,7 +69783,6 @@ "@databases/escape-identifier": "^1.0.3", "@databases/sql": "^3.3.0", "@faker-js/faker": "^9.6.0", - "@rocicorp/prettier-config": "^0.4.0", "@types/pg": "^8.11.11", "@vitest/runner": "4.0.15", "pg": "^8.16.3", @@ -69140,7 +69807,6 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/zero": "0.26.0", "@schickling/fps-meter": "^0.1.2", "@tailwindcss/forms": "^0.5.0", @@ -69226,8 +69892,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "peer": true + "dev": true }, "typescript": { "version": "5.9.3", @@ -69240,7 +69905,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -69297,7 +69961,6 @@ "@postgresql-typed/oids": "^0.2.0", "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/resolver": "^1.0.2", "@rocicorp/zero-events": "0.0.3", "@rocicorp/zero-sqlite3": "^1.0.15", @@ -69362,7 +70025,6 @@ "requires": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/resolver": "^1.0.2", "@vitest/ui": "^4.0.15", "ast-to-zql": "0.0.0", @@ -69390,7 +70052,6 @@ "version": "file:packages/zero-pg", "requires": { "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "vitest": "4.0.15", "zero-cache": "0.0.0", @@ -69401,7 +70062,6 @@ "version": "file:packages/zero-protocol", "requires": { "@badrap/valita": "0.3.11", - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-types": "0.0.0" @@ -69418,7 +70078,6 @@ "zero-react": { "version": "file:packages/zero-react", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "@testing-library/react": "^16.3.2", "@types/react": "^18.3.18", "react": "^18.3.1", @@ -69432,7 +70091,6 @@ "zero-react-native": { "version": "file:packages/zero-react-native", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/resolver": "^1.0.2", "replicache": "15.2.1", "shared": "0.0.0" @@ -69441,7 +70099,6 @@ "zero-schema": { "version": "file:packages/zero-schema", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "zero-protocol": "0.0.0", "zero-types": "0.0.0", @@ -69454,7 +70111,6 @@ "@prisma/adapter-pg": "^7.2.0", "@prisma/client": "^7.2.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "drizzle-orm": "^0.44.2", "pg": "^8.16.3", @@ -69473,7 +70129,6 @@ "zero-solid": { "version": "file:packages/zero-solid", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "@solidjs/testing-library": "^0.8.10", "jsdom": "^26.1.0", "shared": "0.0.0", @@ -69485,7 +70140,6 @@ "zero-types": { "version": "file:packages/zero-types", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.0.15" @@ -69546,6 +70200,7 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, + "peer": true, "requires": {} }, "zql": { @@ -69553,7 +70208,6 @@ "requires": { "@faker-js/faker": "^9.6.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/resolver": "^1.0.2", "@standard-schema/spec": "^1.0.0", "compare-utf8": "^0.1.1", @@ -69582,7 +70236,6 @@ "zql-benchmarks": { "version": "file:packages/zql-benchmarks", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "@types/tmp": "^0.2.6", "mitata": "^1.0.34", "otel": "0.0.0", @@ -69608,7 +70261,6 @@ "zql-integration-tests": { "version": "file:packages/zql-integration-tests", "requires": { - "@rocicorp/prettier-config": "^0.4.0", "@types/tmp": "^0.2.6", "otel": "0.0.0", "shared": "0.0.0", @@ -69669,8 +70321,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "peer": true + "dev": true }, "typescript": { "version": "5.9.3", @@ -69701,7 +70352,6 @@ "@databases/escape-identifier": "^1.0.3", "@databases/sql": "^3.3.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/zero-sqlite3": "^1.0.15", "fast-check": "^3.18.0", "nanoid": "^5.1.2", @@ -69732,7 +70382,6 @@ "version": "file:packages/zqlite-zql-test", "requires": { "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "shared": "0.0.0", "typescript": "~5.9.3", diff --git a/package.json b/package.json index 887894308a..9a140e72c1 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ "verify-deps:fix": "cd tools/verify-package-deps && npm run verify:fix" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@vitest/browser-playwright": "^4.0.15", "@vitest/coverage-v8": "4.0.15", "@vitest/runner": "4.0.15", @@ -41,6 +40,5 @@ "tsx": "^4.21.0", "turbo": "^2.4.4", "vitest": "4.0.15" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/analyze-query/package.json b/packages/analyze-query/package.json index aaf1070034..66a5ca3ef1 100644 --- a/packages/analyze-query/package.json +++ b/packages/analyze-query/package.json @@ -17,7 +17,6 @@ "chalk": "^5.3.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "ast-to-zql": "0.0.0", "otel": "0.0.0", "shared": "0.0.0", @@ -28,6 +27,5 @@ "zero-types": "0.0.0", "zql": "0.0.0", "zqlite": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/ast-to-zql/package.json b/packages/ast-to-zql/package.json index fb6531bbaa..5d91d71f38 100644 --- a/packages/ast-to-zql/package.json +++ b/packages/ast-to-zql/package.json @@ -17,12 +17,10 @@ }, "devDependencies": { "@faker-js/faker": "^9.6.0", - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zero-types": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/datadog/package.json b/packages/datadog/package.json index 566780ab4b..7bb5850ca4 100644 --- a/packages/datadog/package.json +++ b/packages/datadog/package.json @@ -6,7 +6,6 @@ "devDependencies": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "shared": "0.0.0", "typescript": "~5.9.3", @@ -20,6 +19,5 @@ "format": "prettier --write .", "check-format": "prettier --check .", "lint": "oxlint --type-aware src/" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/otel/package.json b/packages/otel/package.json index 7ff220e585..6de078bc02 100644 --- a/packages/otel/package.json +++ b/packages/otel/package.json @@ -13,7 +13,6 @@ "dependencies": { "@opentelemetry/api": "^1.9.0" }, - "prettier": "@rocicorp/prettier-config", "devDependencies": { "shared": "0.0.0" } diff --git a/packages/replicache-perf/package.json b/packages/replicache-perf/package.json index b4996fa6d0..8a46201995 100644 --- a/packages/replicache-perf/package.json +++ b/packages/replicache-perf/package.json @@ -12,7 +12,6 @@ }, "type": "module", "dependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/command-line-args": "^5.2.3", "@types/command-line-usage": "^5.0.2", "command-line-args": "^6.0.1", @@ -28,6 +27,5 @@ "typescript": "~5.9.3", "vite": "7.2.7", "xbytes": "^1.7.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/replicache/package.json b/packages/replicache/package.json index 7277d74081..7f37ae561b 100644 --- a/packages/replicache/package.json +++ b/packages/replicache/package.json @@ -38,7 +38,6 @@ }, "devDependencies": { "@op-engineering/op-sqlite": ">=15", - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/zero-sqlite3": "^1.0.15", "@types/command-line-usage": "^5.0.2", "@vitest/runner": "4.0.15", @@ -100,6 +99,5 @@ "files": [ "out", "!*.tsbuildinfo" - ], - "prettier": "@rocicorp/prettier-config" + ] } diff --git a/packages/shared/package.json b/packages/shared/package.json index ba7cf50ef7..57bd89878d 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -26,7 +26,6 @@ "semver": "^7.5.4" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/semver": "^7.5.1", "@types/strip-ansi": "^3.0.0", "@vitest/runner": "4.0.15", @@ -37,6 +36,5 @@ "type-fest": "^4.30.0", "typescript": "~5.9.3", "vitest": "4.0.15" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/z2s/package.json b/packages/z2s/package.json index b4adf028bc..337b9fa527 100644 --- a/packages/z2s/package.json +++ b/packages/z2s/package.json @@ -19,7 +19,6 @@ }, "devDependencies": { "@faker-js/faker": "^9.6.0", - "@rocicorp/prettier-config": "^0.4.0", "@types/pg": "^8.11.11", "@vitest/runner": "4.0.15", "pg": "^8.16.3", @@ -30,6 +29,5 @@ "zero-schema": "0.0.0", "zero-types": "0.0.0", "zql": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index 2bc0b8fc15..f1829de17f 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -71,7 +71,6 @@ "zqlite": "0.0.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@rocicorp/zero-events": "0.0.3", "@testcontainers/postgresql": "^10.9.0", "@types/node": "^22.10.5", @@ -88,6 +87,5 @@ "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zql": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-client/package.json b/packages/zero-client/package.json index 018db6d617..5be53988d5 100644 --- a/packages/zero-client/package.json +++ b/packages/zero-client/package.json @@ -21,7 +21,6 @@ "@rocicorp/resolver": "^1.0.2" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@vitest/ui": "^4.0.15", "ast-to-zql": "0.0.0", "datadog": "0.0.0", @@ -34,6 +33,5 @@ "zero-schema": "0.0.0", "zero-types": "0.0.0", "zql": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-events/package.json b/packages/zero-events/package.json index 5e4df87092..5a277cc0be 100644 --- a/packages/zero-events/package.json +++ b/packages/zero-events/package.json @@ -32,9 +32,7 @@ "test": "vitest run" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-pg/package.json b/packages/zero-pg/package.json index c248a3390d..8dec0c5333 100644 --- a/packages/zero-pg/package.json +++ b/packages/zero-pg/package.json @@ -13,12 +13,10 @@ "test": "vitest run", "test:watch": "vitest watch" }, - "prettier": "@rocicorp/prettier-config", "dependencies": { "@rocicorp/logger": "^5.4.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "vitest": "4.0.15", "zero-cache": "0.0.0", diff --git a/packages/zero-protocol/package.json b/packages/zero-protocol/package.json index 2921a35937..f74ea1881a 100644 --- a/packages/zero-protocol/package.json +++ b/packages/zero-protocol/package.json @@ -16,10 +16,8 @@ "@badrap/valita": "0.3.11" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-types": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-react-native/package.json b/packages/zero-react-native/package.json index 6a71221c4d..48698d6577 100644 --- a/packages/zero-react-native/package.json +++ b/packages/zero-react-native/package.json @@ -17,9 +17,7 @@ "@rocicorp/resolver": "^1.0.2" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "replicache": "15.2.1", "shared": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-react/package.json b/packages/zero-react/package.json index 5085c9717f..164c3e6e1e 100644 --- a/packages/zero-react/package.json +++ b/packages/zero-react/package.json @@ -19,7 +19,6 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@testing-library/react": "^16.3.2", "@types/react": "^18.3.18", "react": "^18.3.1", @@ -28,6 +27,5 @@ "zero-schema": "0.0.0", "zero-types": "0.0.0", "zql": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-schema/package.json b/packages/zero-schema/package.json index 3a93abbd2f..28bfaa93e5 100644 --- a/packages/zero-schema/package.json +++ b/packages/zero-schema/package.json @@ -14,11 +14,9 @@ "lint": "oxlint --type-aware src/" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "zero-protocol": "0.0.0", "zero-types": "0.0.0", "zql": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-server/package.json b/packages/zero-server/package.json index a1ce3ff117..24f09dae99 100644 --- a/packages/zero-server/package.json +++ b/packages/zero-server/package.json @@ -16,12 +16,10 @@ "test:pg17": "vitest run --project='*17*'", "test:pg17:watch": "vitest watch --project='*17*'" }, - "prettier": "@rocicorp/prettier-config", "dependencies": { "@rocicorp/logger": "^5.4.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@prisma/adapter-pg": "^7.2.0", "@vitest/runner": "4.0.15", "@prisma/client": "^7.2.0", diff --git a/packages/zero-solid/package.json b/packages/zero-solid/package.json index 14a2a6914d..40c0da3efe 100644 --- a/packages/zero-solid/package.json +++ b/packages/zero-solid/package.json @@ -17,13 +17,11 @@ "solid-js": "^1.9.4" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@solidjs/testing-library": "^0.8.10", "jsdom": "^26.1.0", "shared": "0.0.0", "solid-js": "^1.9.4", "vite-plugin-solid": "^2.11.7", "zero-client": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero-types/package.json b/packages/zero-types/package.json index 7502e047c6..be757d56ad 100644 --- a/packages/zero-types/package.json +++ b/packages/zero-types/package.json @@ -13,10 +13,8 @@ "test:watch": "vitest" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.0.15" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zero/package.json b/packages/zero/package.json index 0b67ea1d67..148ef8dfc2 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -78,7 +78,6 @@ }, "devDependencies": { "@op-engineering/op-sqlite": ">=15", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", @@ -196,6 +195,5 @@ "files": [ "out", "!*.tsbuildinfo" - ], - "prettier": "@rocicorp/prettier-config" + ] } diff --git a/packages/zql-benchmarks/package.json b/packages/zql-benchmarks/package.json index 5b3dc65575..be4c51b9fc 100644 --- a/packages/zql-benchmarks/package.json +++ b/packages/zql-benchmarks/package.json @@ -20,7 +20,6 @@ "test-types:watch": "vitest watch --typecheck.only --no-browser.enabled" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/tmp": "^0.2.6", "otel": "0.0.0", "shared": "0.0.0", @@ -33,7 +32,6 @@ "zqlite": "0.0.0", "zql-integration-tests": "0.0.0" }, - "prettier": "@rocicorp/prettier-config", "dependencies": { "mitata": "^1.0.34" } diff --git a/packages/zql-integration-tests/package.json b/packages/zql-integration-tests/package.json index 03f9d1591b..cf3ce9b71d 100644 --- a/packages/zql-integration-tests/package.json +++ b/packages/zql-integration-tests/package.json @@ -20,7 +20,6 @@ "test-types:watch": "vitest watch --typecheck.only --no-browser.enabled" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/tmp": "^0.2.6", "otel": "0.0.0", "shared": "0.0.0", @@ -33,6 +32,5 @@ "zql": "0.0.0", "zqlite": "0.0.0", "zero-types": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/packages/zql/package.json b/packages/zql/package.json index bef3272f88..00a078bd32 100644 --- a/packages/zql/package.json +++ b/packages/zql/package.json @@ -16,7 +16,6 @@ "devDependencies": { "@faker-js/faker": "^9.6.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@standard-schema/spec": "^1.0.0", "fast-check": "^3.18.0", "nanoid": "^5.1.2", @@ -25,7 +24,6 @@ "zero-protocol": "0.0.0", "zero-types": "0.0.0" }, - "prettier": "@rocicorp/prettier-config", "dependencies": { "@rocicorp/resolver": "^1.0.2", "compare-utf8": "^0.1.1" diff --git a/packages/zqlite-zql-test/package.json b/packages/zqlite-zql-test/package.json index 0c4f186378..9e812e9bc2 100644 --- a/packages/zqlite-zql-test/package.json +++ b/packages/zqlite-zql-test/package.json @@ -15,13 +15,11 @@ }, "devDependencies": { "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "@vitest/runner": "4.0.15", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.0.15" }, - "prettier": "@rocicorp/prettier-config", "dependencies": { "zqlite": "0.0.0" } diff --git a/packages/zqlite/package.json b/packages/zqlite/package.json index 8eb2747259..4cb5343aa2 100644 --- a/packages/zqlite/package.json +++ b/packages/zqlite/package.json @@ -19,7 +19,6 @@ }, "devDependencies": { "@rocicorp/logger": "^5.4.0", - "@rocicorp/prettier-config": "^0.4.0", "fast-check": "^3.18.0", "nanoid": "^5.1.2", "otel": "0.0.0", @@ -30,7 +29,6 @@ "zero-types": "0.0.0", "zql": "0.0.0" }, - "prettier": "@rocicorp/prettier-config", "dependencies": { "@databases/escape-identifier": "^1.0.3", "@databases/sql": "^3.3.0", diff --git a/prod/functions/package.json b/prod/functions/package.json index 756c1331bd..351528f418 100644 --- a/prod/functions/package.json +++ b/prod/functions/package.json @@ -12,8 +12,5 @@ "dependencies": { "@rocicorp/zero": "file:rocicorp-zero.tgz" }, - "devDependencies": { - "@rocicorp/prettier-config": "^0.3.0" - }, - "prettier": "@rocicorp/prettier-config" + "devDependencies": {} } diff --git a/prod/package.json b/prod/package.json index 2e2de97cdf..27835c6fc0 100644 --- a/prod/package.json +++ b/prod/package.json @@ -8,6 +8,11 @@ "check-format": "prettier --check ." }, "prettier": { + "singleQuote": true, + "trailingComma": "all", + "arrowParens": "avoid", + "bracketSpacing": false, + "quoteProps": "consistent", "overrides": [ { "files": [ diff --git a/prod/sst/package.json b/prod/sst/package.json index fbe337c4e8..386a519564 100644 --- a/prod/sst/package.json +++ b/prod/sst/package.json @@ -15,8 +15,6 @@ "sst": "3.8.9" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.3.0", "@types/aws-lambda": "8.10.147" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/tools/client-simulator/package.json b/tools/client-simulator/package.json index f4149a3994..4a9093055a 100644 --- a/tools/client-simulator/package.json +++ b/tools/client-simulator/package.json @@ -17,9 +17,7 @@ "ws": "^8.18.1" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0", "zero-protocol": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/tools/load-generator/package.json b/tools/load-generator/package.json index 66961a3714..54b0d9bdbf 100644 --- a/tools/load-generator/package.json +++ b/tools/load-generator/package.json @@ -18,8 +18,6 @@ "postgres": "3.4.7" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/tools/process-tracker/package.json b/tools/process-tracker/package.json index bfab0b6e77..a6d5a7ee59 100644 --- a/tools/process-tracker/package.json +++ b/tools/process-tracker/package.json @@ -16,9 +16,7 @@ "pidusage": "^4.0.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/pidusage": "^2.0.5", "shared": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/tools/sqlite-io-yield-simulator/package.json b/tools/sqlite-io-yield-simulator/package.json index 3e9fa3825e..923dbed26e 100644 --- a/tools/sqlite-io-yield-simulator/package.json +++ b/tools/sqlite-io-yield-simulator/package.json @@ -17,8 +17,6 @@ "zqlite": "0.0.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "shared": "0.0.0" - }, - "prettier": "@rocicorp/prettier-config" + } } diff --git a/tools/verify-package-deps/package.json b/tools/verify-package-deps/package.json index 838ac2a60a..0fbbb09ea4 100644 --- a/tools/verify-package-deps/package.json +++ b/tools/verify-package-deps/package.json @@ -19,9 +19,7 @@ "oxc-parser": "^0.94.0" }, "devDependencies": { - "@rocicorp/prettier-config": "^0.4.0", "@types/node": "^22.10.5", "typescript": "~5.9.3" - }, - "prettier": "@rocicorp/prettier-config" + } } From 33944d92a0ae11f64b827c85468fd9c477fb9855 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 24 Feb 2026 10:23:21 -0800 Subject: [PATCH 096/495] chore(zero-cache): track server context of initial sync and replicatiion takeovers (#5598) Track and store server context at the time of initial sync and replication takeovers, including: * app ID * task ID * host ip * hostname * timestamp * various platform specific environment variables for FLY, RAILWAY, GCP, etc. The server context is stored both in the upstream `replicas` table and in the SQLite `_zero.replicationConfig` table, and surfaced for debugging replication events: * when a shard for a replicaVersion is not found * when a shutdown signal is received from Postgres This will facilitate debugging production configuration issues such as multiple replication-managers contending for the same replication slot, contending backups to the same s3 bucket, stale litestream restores, etc. Example: Screenshot 2026-02-24 at 09 51 19 --- packages/zero-cache/src/config/network.ts | 12 +- .../zero-cache/src/config/server-context.ts | 56 ++++++ packages/zero-cache/src/config/zero-config.ts | 6 +- .../src/scripts/decommission.pg.test.ts | 1 + .../zero-cache/src/server/change-streamer.ts | 5 + .../common/replica-schema.test.ts | 40 ++++- .../change-source/common/replica-schema.ts | 8 + .../custom/change-source.test.ts | 7 + .../change-source/custom/change-source.ts | 18 +- .../change-source/custom/sync-schema.ts | 16 -- .../pg/change-source.backfill.pg.test.ts | 3 + .../pg/change-source.end-to-mid.pg.test.ts | 1 + .../change-source/pg/change-source.pg.test.ts | 24 ++- .../change-source.toasted-values.pg.test.ts | 1 + .../change-source/pg/change-source.ts | 162 +++++++++++------- .../change-source/pg/decommission.pg.test.ts | 1 + .../change-source/pg/initial-sync.pg.test.ts | 40 ++++- .../services/change-source/pg/initial-sync.ts | 16 +- .../change-source/pg/schema/init.pg.test.ts | 7 +- .../services/change-source/pg/schema/init.ts | 11 ++ .../change-source/pg/schema/shard.pg.test.ts | 3 + .../services/change-source/pg/schema/shard.ts | 31 +++- .../change-source/pg/sync-schema.pg.test.ts | 30 +++- .../services/change-source/pg/sync-schema.ts | 17 -- .../services/change-streamer/schema/tables.ts | 5 +- .../schema/replication-state.test.ts | 8 +- .../replicator/schema/replication-state.ts | 46 +++-- .../src/child-merge.pg.test.ts | 3 +- .../src/chinook/get-deps.ts | 1 + .../src/compiler-bigint.pg.test.ts | 1 + .../src/compiler-types-with-args.pg.test.ts | 1 + .../src/discord-repro.pg.test.ts | 3 +- .../src/helpers/runner.ts | 1 + .../src/helpers/setup.ts | 1 + .../src/pagila/get-deps.ts | 1 + 35 files changed, 432 insertions(+), 155 deletions(-) create mode 100644 packages/zero-cache/src/config/server-context.ts delete mode 100644 packages/zero-cache/src/services/change-source/custom/sync-schema.ts delete mode 100644 packages/zero-cache/src/services/change-source/pg/sync-schema.ts diff --git a/packages/zero-cache/src/config/network.ts b/packages/zero-cache/src/config/network.ts index 5d63f895b3..f6a41b817b 100644 --- a/packages/zero-cache/src/config/network.ts +++ b/packages/zero-cache/src/config/network.ts @@ -2,7 +2,15 @@ import type {LogContext} from '@rocicorp/logger'; import {isIPv6, isPrivate, isReserved} from 'is-in-subnet'; import {networkInterfaces, type NetworkInterfaceInfo} from 'os'; -export function getHostIp(lc: LogContext, preferredPrefixes: string[]) { +export const DEFAULT_PREFERRED_PREFIXES = [ + 'eth', // linux + 'en', // macbooks +] as const; + +export function getHostIp( + lc: LogContext, + preferredPrefixes: readonly string[] = DEFAULT_PREFERRED_PREFIXES, +) { const interfaces = networkInterfaces(); const preferred = getPreferredIp(interfaces, preferredPrefixes); lc.info?.(`network interfaces`, {preferred, interfaces}); @@ -11,7 +19,7 @@ export function getHostIp(lc: LogContext, preferredPrefixes: string[]) { export function getPreferredIp( interfaces: NodeJS.Dict, - preferredPrefixes: string[], + preferredPrefixes: readonly string[], ) { const rank = ({name}: {name: string}) => { for (let i = 0; i < preferredPrefixes.length; i++) { diff --git a/packages/zero-cache/src/config/server-context.ts b/packages/zero-cache/src/config/server-context.ts new file mode 100644 index 0000000000..e5545c8181 --- /dev/null +++ b/packages/zero-cache/src/config/server-context.ts @@ -0,0 +1,56 @@ +import {hostname} from 'node:os'; +import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; +import {getHostIp} from './network.ts'; +import type {NormalizedZeroConfig} from './normalize.ts'; + +export type ServerContext = { + appID: string; + taskID: string; + hostIP: string; + hostname: string; + timestamp: string; + + [platformVar: string]: string | undefined; +}; + +/** + * Runtime and environment information useful for recording and identifying + * the origin of certain actions such as initial sync and logical replication + * takeovers. + */ +export function getServerContext(config: NormalizedZeroConfig): ServerContext { + const context: ServerContext = { + appID: config.app.id, + taskID: config.taskID, + hostIP: getHostIp(createSilentLogContext()), + hostname: hostname(), + timestamp: new Date().toISOString(), + + // Platform-specific environment variables + flyAppName: process.env.FLY_APP_NAME, + flyMachineID: process.env.FLY_MACHINE_ID, + + railwayProjectID: process.env.RAILWAY_PROJECT_ID, + railwayProjectName: process.env.RAILWAY_PROJECT_NAME, + railwayEnvironmentID: process.env.RAILWAY_ENVIRONMENT_ID, + railwayEnvironmentName: process.env.RAILWAY_ENVIRONMENT_NAME, + railwayServiceID: process.env.RAILWAY_SERVICE_ID, + railwayServiceName: process.env.RAILWAY_SERVICE_NAME, + railwayDeploymentID: process.env.RAILWAY_DEPLOYMENT_ID, + + gcpProject: + process.env.GOOGLE_CLOUD_PROJECT ?? + process.env.GCP_PROJECT ?? + process.env.GCLOUD_PROJECT, + + coolifyDomainName: process.env.COOLIFY_FQDN, + coolifyContainerName: process.env.COOLIFY_CONTAINER_NAME, + + azureEnvName: process.env.AZURE_ENV_NAME, + }; + + // Remove keys with undefined values + return Object.fromEntries( + Object.entries(context).filter(([_, v]) => v !== undefined), + ) as ServerContext; +} diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index dac34ad9bb..b75420f04c 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -20,6 +20,7 @@ import { ALLOWED_APP_ID_CHARACTERS, INVALID_APP_ID_MESSAGE, } from '../types/shards.ts'; +import {DEFAULT_PREFERRED_PREFIXES} from './network.ts'; import { assertNormalized, isDevelopmentMode, @@ -528,10 +529,7 @@ export const zeroOptions = { }, discoveryInterfacePreferences: { - type: v.array(v.string()).default([ - 'eth', // linux - 'en', // macbooks - ]), + type: v.array(v.string()).default([...DEFAULT_PREFERRED_PREFIXES]), desc: [ `The name prefixes to prefer when introspecting the network interfaces to determine`, `the externally reachable IP address for change-streamer discovery. This defaults`, diff --git a/packages/zero-cache/src/scripts/decommission.pg.test.ts b/packages/zero-cache/src/scripts/decommission.pg.test.ts index 1b4131e397..cda5aed835 100644 --- a/packages/zero-cache/src/scripts/decommission.pg.test.ts +++ b/packages/zero-cache/src/scripts/decommission.pg.test.ts @@ -60,6 +60,7 @@ describe('decommission', () => { replica, getConnectionURI(upstream), {tableCopyWorkers: 5}, + {test: 'context'}, ); await initChangeStreamerSchema(lc, cdc, SHARD_ID); await initViewSyncerSchema(lc, cvr, SHARD_ID); diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index 3550a2265a..20e07acf88 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -1,6 +1,7 @@ import {assert} from '../../../shared/src/asserts.ts'; import {must} from '../../../shared/src/must.ts'; import {DatabaseInitError} from '../../../zqlite/src/db.ts'; +import {getServerContext} from '../config/server-context.ts'; import {getNormalizedZeroConfig} from '../config/zero-config.ts'; import {deleteLiteDB} from '../db/delete-lite-db.ts'; import {warmupConnections} from '../db/warmup.ts'; @@ -71,6 +72,8 @@ export default async function runWorker( let changeStreamer: ChangeStreamerService | undefined; + const context = getServerContext(config); + for (const first of [true, false]) { try { // Note: This performs initial sync of the replica if necessary. @@ -82,12 +85,14 @@ export default async function runWorker( shard, replica.file, initialSync, + context, ) : await initializeCustomChangeSource( lc, upstream.db, shard, replica.file, + context, ); changeStreamer = await initializeStreamer( diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts index 4104837e6d..846fc2ee6b 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts @@ -1,10 +1,12 @@ import {beforeEach, describe, test} from 'vitest'; import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import {promiseVoid} from '../../../../../shared/src/resolved-promises.ts'; import { DbFile, expectMatchingObjectsInTables, initDB as initLiteDB, } from '../../../test/lite.ts'; +import {initReplicationState} from '../../replicator/schema/replication-state.ts'; import { CREATE_V6_COLUMN_METADATA_TABLE, CREATE_V7_CHANGE_LOG, @@ -13,8 +15,8 @@ import { // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 9, - schemaVersion: 9, + dataVersion: 10, + schemaVersion: 10, minSafeVersion: 1, lock: 1, // Internal column, always 1 }; @@ -28,6 +30,14 @@ const CREATE_VERSION_HISTORY = /*sql*/ ` ); `; +const CREATE_V1_REPLICATION_CONFIG_TABLE = /*sql*/ ` + CREATE TABLE "_zero.replicationConfig" ( + replicaVersion TEXT NOT NULL, + publications TEXT NOT NULL, + lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) + ); +`; + describe('replica-schema-migrations', () => { type Case = { fromVersion: number; @@ -38,6 +48,19 @@ describe('replica-schema-migrations', () => { }; const cases: Case[] = [ + { + fromVersion: 0, + desc: 'start from scratch', + replicaPostState: { + ['_zero.replicationConfig']: [ + { + replicaVersion: '123', + publications: '["foo_publication"]', + initialSyncContext: '{"context":"bar"}', + }, + ], + }, + }, { fromVersion: 6, desc: 're-populate column metadata', @@ -47,7 +70,9 @@ describe('replica-schema-migrations', () => { CREATE TABLE "_zero.changeLog" ( old_legacy_table TEXT ); - ` + CREATE_V6_COLUMN_METADATA_TABLE, + ` + + CREATE_V1_REPLICATION_CONFIG_TABLE + + CREATE_V6_COLUMN_METADATA_TABLE, replicaPreState: { ['_zero.column_metadata']: [ { @@ -104,6 +129,7 @@ describe('replica-schema-migrations', () => { ` CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); ` + + CREATE_V1_REPLICATION_CONFIG_TABLE + CREATE_V6_COLUMN_METADATA_TABLE + CREATE_V7_CHANGE_LOG, replicaPostState: { @@ -149,6 +175,7 @@ describe('replica-schema-migrations', () => { ` CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); ` + + CREATE_V1_REPLICATION_CONFIG_TABLE + CREATE_V6_COLUMN_METADATA_TABLE + CREATE_V7_CHANGE_LOG, replicaPreState: { @@ -251,7 +278,7 @@ describe('replica-schema-migrations', () => { for (const c of cases) { test(`from v${c.fromVersion}: ${c.desc}`, async () => { const replica = replicaFile.connect(lc); - initLiteDB(replica, c.replicaSetup + CREATE_VERSION_HISTORY, { + initLiteDB(replica, (c.replicaSetup ?? '') + CREATE_VERSION_HISTORY, { ['_zero.versionHistory']: [ { dataVersion: c.fromVersion, @@ -262,7 +289,10 @@ describe('replica-schema-migrations', () => { ...c.replicaPreState, }); - await initReplica(lc, 'test', replicaFile.path, async () => {}); + await initReplica(lc, 'test', replicaFile.path, (_, db) => { + initReplicationState(db, ['foo_publication'], '123', {context: 'bar'}); + return promiseVoid; + }); expectMatchingObjectsInTables(replica, { ['_zero.versionHistory']: [CURRENT_SCHEMA_VERSIONS], diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.ts index c186513032..83257dfeb6 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.ts @@ -155,4 +155,12 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { ); }, }, + + 10: { + migrateSchema: (_, db) => { + db.exec(/*sql*/ ` + ALTER TABLE "_zero.replicationConfig" ADD COLUMN "initialSyncContext" TEXT; + `); + }, + }, }; diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.test.ts b/packages/zero-cache/src/services/change-source/custom/change-source.test.ts index ce51ca9628..0e5fb52b28 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.test.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.test.ts @@ -17,6 +17,10 @@ import {initializeCustomChangeSource} from './change-source.ts'; const APP_ID = 'bongo'; +const TEST_CONTEXT = { + taskID: 'foo-bar', +}; + describe('change-source/custom', () => { let lc: LogContext; let downstream: Promise>; @@ -226,6 +230,7 @@ describe('change-source/custom', () => { changeSourceURI, {appID: APP_ID, shardNum: 0, publications: ['b', 'a']}, replicaDbFile.path, + TEST_CONTEXT, ); expectTables(replicaDbFile.connect(lc), { @@ -237,6 +242,7 @@ describe('change-source/custom', () => { lock: 1, replicaVersion: '123', publications: '["a","b"]', + initialSyncContext: '{"taskID":"foo-bar"}', }, ], ['_zero.changeLog2']: [ @@ -390,6 +396,7 @@ describe('change-source/custom', () => { changeSourceURI, {appID: APP_ID, shardNum: 0, publications: ['b', 'a']}, replicaDbFile.path, + TEST_CONTEXT, ), ).rejects.toThrowError(AutoResetSignal); }); diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.ts b/packages/zero-cache/src/services/change-source/custom/change-source.ts index 9e66ae4ea0..2a44470dfb 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.ts @@ -1,7 +1,10 @@ import type {LogContext} from '@rocicorp/logger'; import {WebSocket} from 'ws'; import {assert, unreachable} from '../../../../../shared/src/asserts.ts'; -import {stringify} from '../../../../../shared/src/bigint-json.ts'; +import { + stringify, + type JSONObject, +} from '../../../../../shared/src/bigint-json.ts'; import {deepEqual} from '../../../../../shared/src/json.ts'; import type {SchemaValue} from '../../../../../zero-schema/src/table-schema.ts'; import {Database} from '../../../../../zqlite/src/db.ts'; @@ -22,12 +25,15 @@ import { type SubscriptionState, } from '../../replicator/schema/replication-state.ts'; import type {ChangeSource, ChangeStream} from '../change-source.ts'; +import {initReplica} from '../common/replica-schema.ts'; import {changeStreamMessageSchema} from '../protocol/current/downstream.ts'; import { type BackfillRequest, type ChangeSourceUpstream, } from '../protocol/current/upstream.ts'; -import {initSyncSchema} from './sync-schema.ts'; + +/** Server context to store with the initial sync metadata for debugging. */ +export type ServerContext = JSONObject; /** * Initializes a Custom change source before streaming changes from the @@ -38,13 +44,13 @@ export async function initializeCustomChangeSource( upstreamURI: string, shard: ShardConfig, replicaDbFile: string, + context: ServerContext, ): Promise<{subscriptionState: SubscriptionState; changeSource: ChangeSource}> { - await initSyncSchema( + await initReplica( lc, `replica-${shard.appID}-${shard.shardNum}`, - shard, replicaDbFile, - upstreamURI, + (log, tx) => initialSync(log, shard, tx, upstreamURI, context), ); const replica = new Database(lc, replicaDbFile); @@ -153,6 +159,7 @@ export async function initialSync( shard: ShardConfig, tx: Database, upstreamURI: string, + context: ServerContext, ) { const {appID: id, publications} = shard; const changeSource = new CustomChangeSource(lc, upstreamURI, shard, { @@ -191,6 +198,7 @@ export async function initialSync( tx, [...publications].sort(), commitWatermark, + context, false, ); processor.processMessage(lc, change); diff --git a/packages/zero-cache/src/services/change-source/custom/sync-schema.ts b/packages/zero-cache/src/services/change-source/custom/sync-schema.ts deleted file mode 100644 index c689e94a10..0000000000 --- a/packages/zero-cache/src/services/change-source/custom/sync-schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type {LogContext} from '@rocicorp/logger'; -import type {ShardConfig} from '../../../types/shards.ts'; -import {initReplica} from '../common/replica-schema.ts'; -import {initialSync} from './change-source.ts'; - -export async function initSyncSchema( - log: LogContext, - debugName: string, - shard: ShardConfig, - dbPath: string, - upstreamURI: string, -): Promise { - await initReplica(log, debugName, dbPath, (log, tx) => - initialSync(log, shard, tx, upstreamURI), - ); -} diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts index 53b152467a..f027faaa31 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts @@ -28,6 +28,8 @@ const APP_ID = 'bf'; const PG_15_UP = 150000; const PG_18_UP = 180000; +const TEST_CONTEXT = {boo: 'far'}; + describe('change-source/pg/backfill-test', {timeout: 30000}, () => { let lc: LogContext; let upstream: PostgresDB; @@ -102,6 +104,7 @@ describe('change-source/pg/backfill-test', {timeout: 30000}, () => { }, replicaDbFile.path, {tableCopyWorkers: 5}, + TEST_CONTEXT, ) ).changeSource; const stream = await source.startStream('00'); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index a015656e29..1f032955db 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -81,6 +81,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { }, replicaDbFile.path, {tableCopyWorkers: 5}, + {test: 'context'}, ) ).changeSource; const stream = await source.startStream('00'); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index 42816b63de..f540726d3b 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -143,11 +143,15 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { }, replicaDbFile.path, {tableCopyWorkers: 5}, + {test: 'context'}, )); - [{slot: replicationSlot}] = await upstream<{slot: string}[]>` - SELECT slot FROM ${upstream(`${APP_ID}_${SHARD_NUM}.replicas`)}; - `; + const [{slot, initialSyncContext, subscriberContext}] = await upstream` + SELECT * FROM ${upstream(`${APP_ID}_${SHARD_NUM}.replicas`)}; + `; + expect(initialSyncContext).toEqual({test: 'context'}); + expect(subscriberContext).toBeNull(); + replicationSlot = slot; } async function withTriggers() { @@ -213,6 +217,11 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { const {changes, acks} = await startStream('00'); const downstream = drainToQueue(changes); + const [{subscriberContext}] = await upstream` + SELECT * FROM ${upstream(`${APP_ID}_${SHARD_NUM}.replicas`)}; + `; + expect(subscriberContext).toEqual({test: 'context'}); + await upstream.begin(async tx => { await tx`INSERT INTO foo(id) VALUES('hello')`; await tx`INSERT INTO foo(id) VALUES('world')`; @@ -858,17 +867,20 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { }, replicaFile2.path, {tableCopyWorkers: 5}, + {test: 'context'}, ); // Initial sync should have created a second replication slot. const slots1 = await upstream<{slot: string}[]>` SELECT slot_name as slot FROM pg_replication_slots WHERE slot_name LIKE ${APP_ID + '\\_' + SHARD_NUM + '\\_%'} + ORDER BY slot_name `.values(); expect(slots1).toHaveLength(2); const replicas2 = await upstream.unsafe(` SELECT slot FROM "${APP_ID}_${SHARD_NUM}".replicas + ORDER BY slot `); expect(replicas2).toHaveLength(2); @@ -902,12 +914,14 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { }, replicaFile3.path, {tableCopyWorkers: 5}, + {test: 'context'}, ); // There should now be 3 replication slots. const slots2 = await upstream<{slot: string}[]>` SELECT slot_name as slot FROM pg_replication_slots WHERE slot_name LIKE ${APP_ID + '\\_' + SHARD_NUM + '\\_%'} + ORDER BY slot_name `.values(); expect(slots2).toHaveLength(3); const replicas3 = await upstream.unsafe(` @@ -944,7 +958,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { // Verify that the older replica state has been cleaned up. // The newer replica state should remain. const replicasAfterTakeover = await upstream.unsafe(` - SELECT slot FROM "${APP_ID}_${SHARD_NUM}".replicas + SELECT slot FROM "${APP_ID}_${SHARD_NUM}".replicas ORDER BY slot `); expect(replicasAfterTakeover).toEqual(replicas3.slice(1)); @@ -955,6 +969,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { const slots3 = await upstream<{slot: string}[]>` SELECT slot_name as slot FROM pg_replication_slots WHERE slot_name LIKE ${APP_ID + '\\_' + SHARD_NUM + '\\_%'} + ORDER BY slot_name `.values(); expect(slots3).toEqual(slots2.slice(1)); }, @@ -981,6 +996,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { }, replicaDbFile.path, {tableCopyWorkers: 5}, + {test: 'context'}, ); } catch (e) { err = e; diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.toasted-values.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.toasted-values.pg.test.ts index 357cc3aaec..05a51c8b2b 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.toasted-values.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.toasted-values.pg.test.ts @@ -83,6 +83,7 @@ describe.skip('toasted values', {timeout: 30000, retry: 3}, () => { }, replicaDbFile.path, {tableCopyWorkers: 5}, + {test: 'context'}, )); } diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 878d57ff88..3040de467e 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -44,6 +44,7 @@ import { import type {ChangeSource, ChangeStream} from '../change-source.ts'; import {BackfillManager} from '../common/backfill-manager.ts'; import {ChangeStreamMultiplexer} from '../common/change-stream-multiplexer.ts'; +import {initReplica} from '../common/replica-schema.ts'; import type {BackfillRequest, JSONObject} from '../protocol/current.ts'; import type { ColumnAdd, @@ -59,7 +60,11 @@ import type { } from '../protocol/current/downstream.ts'; import type {ColumnMetadata, TableMetadata} from './backfill-metadata.ts'; import {streamBackfill} from './backfill-stream.ts'; -import {type InitialSyncOptions} from './initial-sync.ts'; +import { + initialSync, + type InitialSyncOptions, + type ServerContext, +} from './initial-sync.ts'; import type { Message, MessageMessage, @@ -86,7 +91,6 @@ import { type Replica, } from './schema/shard.ts'; import {validate} from './schema/validation.ts'; -import {initSyncSchema} from './sync-schema.ts'; /** * Initializes a Postgres change source, including the initial sync of the @@ -99,14 +103,13 @@ export async function initializePostgresChangeSource( shard: ShardConfig, replicaDbFile: string, syncOptions: InitialSyncOptions, + context: ServerContext, ): Promise<{subscriptionState: SubscriptionState; changeSource: ChangeSource}> { - await initSyncSchema( + await initReplica( lc, `replica-${shard.appID}-${shard.shardNum}`, - shard, replicaDbFile, - upstreamURI, - syncOptions, + (log, tx) => initialSync(log, shard, tx, upstreamURI, syncOptions, context), ); const replica = new Database(lc, replicaDbFile); @@ -129,6 +132,7 @@ export async function initializePostgresChangeSource( upstreamURI, shard, upstreamReplica, + context, ); return {subscriptionState, changeSource}; @@ -141,7 +145,11 @@ async function checkAndUpdateUpstream( lc: LogContext, sql: PostgresDB, shard: ShardConfig, - {replicaVersion, publications: subscribed}: SubscriptionState, + { + replicaVersion, + publications: subscribed, + initialSyncContext, + }: SubscriptionState, ) { // Perform any shard schema updates await updateShardSchema(lc, sql, shard, replicaVersion); @@ -151,6 +159,7 @@ async function checkAndUpdateUpstream( sql, shard, replicaVersion, + initialSyncContext, ); if (!upstreamReplica) { throw new AutoResetSignal( @@ -227,17 +236,20 @@ class PostgresChangeSource implements ChangeSource { readonly #upstreamUri: string; readonly #shard: ShardID; readonly #replica: Replica; + readonly #context: ServerContext; constructor( lc: LogContext, upstreamUri: string, shard: ShardID, replica: Replica, + context: ServerContext, ) { this.#lc = lc.withContext('component', 'change-source'); this.#upstreamUri = upstreamUri; this.#shard = shard; this.#replica = replica; + this.#context = context; } async startStream( @@ -305,7 +317,7 @@ class PostgresChangeSource implements ChangeSource { this.#upstreamUri, ); - void (async function () { + void (async () => { try { let reservation: ReservationState | null = null; let inTransaction = false; @@ -366,7 +378,13 @@ class PostgresChangeSource implements ChangeSource { } catch (e) { // Note: no need to worry about reservations here since downstream // is being completely canceled. - changes.fail(translateError(e)); + const err = translateError(e); + if (err instanceof ShutdownSignal) { + // Log the new state of the replica to surface information about the + // server that sent the shutdown signal, if any. + await this.#logCurrentReplicaInfo(); + } + changes.fail(err); } })(); @@ -382,6 +400,27 @@ class PostgresChangeSource implements ChangeSource { }; } + async #logCurrentReplicaInfo() { + const db = pgClient(this.#lc, this.#upstreamUri); + try { + const replica = await getReplicaAtVersion( + this.#lc, + db, + this.#shard, + this.#replica.version, + ); + if (replica) { + this.#lc.info?.( + `Shutdown signal from replica@${this.#replica.version}: ${stringify(replica.subscriberContext)}`, + ); + } + } catch (e) { + this.#lc.warn?.(`error logging replica info`, e); + } finally { + await db.end(); + } + } + /** * Stops replication slots associated with this shard, and returns * a `cleanup` task that drops any slot other than the specified @@ -392,64 +431,67 @@ class PostgresChangeSource implements ChangeSource { * that will soon take over the slot. */ async #stopExistingReplicationSlotSubscribers( - sql: PostgresDB, + db: PostgresDB, slotToKeep: string, ): Promise<{cleanup: Promise}> { const slotExpression = replicationSlotExpression(this.#shard); const legacySlotName = legacyReplicationSlot(this.#shard); - // Note: `slot_name <= slotToKeep` uses a string compare of the millisecond - // timestamp, which works until it exceeds 13 digits (sometime in 2286). - const result = await sql< - {slot: string; pid: string | null; terminated: boolean | null}[] - >` - SELECT slot_name as slot, pg_terminate_backend(active_pid) as terminated, active_pid as pid - FROM pg_replication_slots - WHERE (slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName}) - AND slot_name <= ${slotToKeep}`; - this.#lc.info?.(`terminated replication slots: ${JSON.stringify(result)}`); - if (result.length === 0) { - const shardSlots = await sql< - { - slot: string; - active: boolean; - pid: string | null; - }[] - >` - SELECT slot_name as slot, active, active_pid as pid - FROM pg_replication_slots - WHERE slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName} - ORDER BY slot_name`; - this.#lc.warn?.( - `slot ${slotToKeep} not found while cleaning subscribers; shard slots at time of failure: ${JSON.stringify( - shardSlots, - )}`, + const result = await db.begin(async sql => { + // Note: `slot_name <= slotToKeep` uses a string compare of the millisecond + // timestamp, which works until it exceeds 13 digits (sometime in 2286). + const result = await sql< + {slot: string; pid: string | null; terminated: boolean | null}[] + > /*sql*/ ` + SELECT slot_name as slot, pg_terminate_backend(active_pid) as terminated, active_pid as pid + FROM pg_replication_slots + WHERE (slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName}) + AND slot_name <= ${slotToKeep}`; + this.#lc.info?.( + `terminated replication slots: ${JSON.stringify(result)}`, ); - throw new AbortError( - `replication slot ${slotToKeep} is missing. A different ` + - `replication-manager should now be running on a new ` + - `replication slot.`, + const replicasTable = `${upstreamSchema(this.#shard)}.replicas`; + const replicasBefore = await sql` + SELECT slot, version, "initialSyncContext", "subscriberContext" + FROM ${sql(replicasTable)} ORDER BY slot`; + + if (result.length === 0) { + const shardSlots = await sql` + SELECT slot_name as slot, active, active_pid as pid + FROM pg_replication_slots + WHERE slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName} + ORDER BY slot_name`; + this.#lc.warn?.( + `slot ${slotToKeep} not found while cleaning subscribers`, + {slots: shardSlots, replicas: replicasBefore}, + ); + throw new AbortError( + `replication slot ${slotToKeep} is missing. A different ` + + `replication-manager should now be running on a new ` + + `replication slot.`, + ); + } + // Clear the state of the older replicas. + this.#lc.info?.( + `replicas before cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify( + replicasBefore, + )}`, ); - } - // Clear the state of the older replicas. - const replicasTable = `${upstreamSchema(this.#shard)}.replicas`; - const replicasBefore = await sql<{slot: string; version: string}[]>` + await sql` + DELETE FROM ${sql(replicasTable)} WHERE slot < ${slotToKeep}`; + await sql` + UPDATE ${sql(replicasTable)} + SET "subscriberContext" = ${this.#context} + WHERE slot = ${slotToKeep}`; + const replicasAfter = await sql<{slot: string; version: string}[]>` SELECT slot, version FROM ${sql(replicasTable)} ORDER BY slot`; - this.#lc.info?.( - `replicas before cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify( - replicasBefore, - )}`, - ); - await sql<{slot: string; version: string}[]>` - DELETE FROM ${sql(replicasTable)} - WHERE slot < ${slotToKeep}`; - const replicasAfter = await sql<{slot: string; version: string}[]>` - SELECT slot, version FROM ${sql(replicasTable)} ORDER BY slot`; - this.#lc.info?.( - `replicas after cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify( - replicasAfter, - )}`, - ); + this.#lc.info?.( + `replicas after cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify( + replicasAfter, + )}`, + ); + return result; + }); const pids = result.filter(({pid}) => pid !== null).map(({pid}) => pid); if (pids.length) { @@ -460,7 +502,7 @@ class PostgresChangeSource implements ChangeSource { .map(({slot}) => slot); return { cleanup: otherSlots.length - ? this.#dropReplicationSlots(sql, otherSlots) + ? this.#dropReplicationSlots(db, otherSlots) : promiseVoid, }; } diff --git a/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts index e054360216..914b92cf80 100644 --- a/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts @@ -41,6 +41,7 @@ describe('decommission', () => { replica, getConnectionURI(upstream), {tableCopyWorkers: 5}, + {test: 'context'}, ); expect(await upstream`SELECT pubname FROM pg_publication`.values()).toEqual( diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts index 081428e9f7..5415766e3b 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts @@ -28,6 +28,8 @@ import {UnsupportedTableSchemaError} from './schema/validation.ts'; const APP_ID = '1'; const SHARD_NUM = 18; +const TEST_CONTEXT = {foo: 'bar'}; + const ZERO_PERMISSIONS_SPEC: PublishedTableSpec = { columns: { permissions: { @@ -328,6 +330,13 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { replicatedData: { [`${APP_ID}_${SHARD_NUM}.clients`]: [], [`${APP_ID}_${SHARD_NUM}.mutations`]: [], + ['_zero.replicationConfig']: [ + { + replicaVersion: expect.any(String), + publications: `["_${APP_ID}_metadata_${SHARD_NUM}","_${APP_ID}_public_${SHARD_NUM}"]`, + initialSyncContext: '{"foo":"bar"}', + }, + ], ['_zero.column_metadata']: [ { character_max_length: null, @@ -2594,6 +2603,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { replica, getConnectionURI(upstream), {tableCopyWorkers: 3}, + TEST_CONTEXT, ); const config = await upstream.unsafe( @@ -2607,6 +2617,9 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { `SELECT * FROM "${APP_ID}_${SHARD_NUM}"."replicas"`, ); expect(replicas).toHaveLength(i + 1); + for (const replica of replicas) { + expect(replica).toMatchObject({initialSyncContext: TEST_CONTEXT}); + } const tableSpecs = Object.entries(c.published) .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)) .map(([_, spec]) => spec); @@ -2714,9 +2727,16 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { let result; try { - await initialSync(lc, shardConfig, replica, getConnectionURI(upstream), { - tableCopyWorkers: 1, - }); + await initialSync( + lc, + shardConfig, + replica, + getConnectionURI(upstream), + { + tableCopyWorkers: 1, + }, + TEST_CONTEXT, + ); } catch (e) { result = e; } @@ -2753,9 +2773,16 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { await sql.unsafe(corruption); - await initialSync(lc, shardConfig, replica, getConnectionURI(upstream), { - tableCopyWorkers: 1, - }); + await initialSync( + lc, + shardConfig, + replica, + getConnectionURI(upstream), + { + tableCopyWorkers: 1, + }, + TEST_CONTEXT, + ); expectMatchingObjectsInTables(replica, { [`${APP_ID}_${SHARD_NUM}.clients`]: [], @@ -2779,6 +2806,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { replica, getConnectionURI(upstream), {tableCopyWorkers: 1}, + TEST_CONTEXT, ); } catch (e) { result = e; diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index c187e7f63e..dfcb09c6e5 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -7,6 +7,7 @@ import {platform} from 'node:os'; import {Writable} from 'node:stream'; import {pipeline} from 'node:stream/promises'; import postgres from 'postgres'; +import type {JSONObject} from '../../../../../shared/src/bigint-json.ts'; import {must} from '../../../../../shared/src/must.ts'; import type {Database} from '../../../../../zqlite/src/db.ts'; import { @@ -58,12 +59,16 @@ export type InitialSyncOptions = { profileCopy?: boolean | undefined; }; +/** Server context to store with the initial sync metadata for debugging. */ +export type ServerContext = JSONObject; + export async function initialSync( lc: LogContext, shard: ShardConfig, tx: Database, upstreamURI: string, syncOptions: InitialSyncOptions, + context: ServerContext, ) { if (!ALLOWED_APP_ID_CHARACTERS.test(shard.appID)) { throw new Error( @@ -130,7 +135,7 @@ export async function initialSync( const {snapshot_name: snapshot, consistent_point: lsn} = slot; const initialVersion = toStateVersionString(lsn); - initReplicationState(tx, publications, initialVersion); + initReplicationState(tx, publications, initialVersion, context); // Run up to MAX_WORKERS to copy of tables at the replication slot's snapshot. const start = performance.now(); @@ -205,7 +210,14 @@ export async function initialSync( const index = performance.now() - indexStart; lc.info?.(`Created indexes (${index.toFixed(3)} ms)`); - await addReplica(sql, shard, slotName, initialVersion, published); + await addReplica( + sql, + shard, + slotName, + initialVersion, + published, + context, + ); const elapsed = performance.now() - start; lc.info?.( diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts index 5f9023e208..f10b36f8d1 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts @@ -21,8 +21,8 @@ const SHARD_NUM = 23; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 14, - schemaVersion: 14, + dataVersion: 15, + schemaVersion: 15, minSafeVersion: 1, lock: 'v', } as const; @@ -65,6 +65,8 @@ describe('change-streamer/pg/schema/init', () => { slot: `${APP_ID}_${SHARD_NUM}_1234`, version: '2dhf29ef', initialSchema: {tables: [], indexes: []}, + initialSyncContext: {foo: 'bar'}, + subscriberContext: null, }, ], [`${APP_ID}_${SHARD_NUM}.clients`]: [], @@ -209,6 +211,7 @@ describe('change-streamer/pg/schema/init', () => { c.newReplica[0], c.newReplica[1], {tables: [], indexes: []}, + {foo: 'bar'}, ); } } diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.ts index 610477e750..80ff744838 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.ts @@ -231,6 +231,17 @@ function getIncrementalMigrations( lc.info?.(`Upgraded DDL event triggers`); }, }, + + // Add initialSyncContext column to replicas table. + 15: { + migrateSchema: async (_, sql) => { + await sql` + ALTER TABLE ${sql(upstreamSchema(shard))}.replicas + ADD COLUMN "initialSyncContext" JSON, + ADD COLUMN "subscriberContext" JSON + `; + }, + }, }; } diff --git a/packages/zero-cache/src/services/change-source/pg/schema/shard.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/shard.pg.test.ts index 85a3bf09d5..69e1db8508 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/shard.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/shard.pg.test.ts @@ -50,6 +50,7 @@ describe('change-source/pg', () => { 'zro_0_1234', '0wdfj02', {tables: [], indexes: []}, + {foo: 'bar'}, ); }); @@ -74,6 +75,8 @@ describe('change-source/pg', () => { slot: 'zro_0_1234', version: '0wdfj02', initialSchema: {tables: [], indexes: []}, + initialSyncContext: {foo: 'bar'}, + subscriberContext: null, }, ], ['zro_0.clients']: [], diff --git a/packages/zero-cache/src/services/change-source/pg/schema/shard.ts b/packages/zero-cache/src/services/change-source/pg/schema/shard.ts index 64cf0f40e7..a102062beb 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/shard.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/shard.ts @@ -3,6 +3,11 @@ import type {LogContext} from '@rocicorp/logger'; import {literal} from 'pg-format'; import postgres from 'postgres'; import {assert} from '../../../../../../shared/src/asserts.ts'; +import { + jsonObjectSchema, + stringify, + type JSONObject, +} from '../../../../../../shared/src/bigint-json.ts'; import * as v from '../../../../../../shared/src/valita.ts'; import {Default} from '../../../../db/postgres-replica-identity-enum.ts'; import type {PostgresDB, PostgresTransaction} from '../../../../types/pg.ts'; @@ -191,9 +196,11 @@ export function shardSetup( ); CREATE TABLE ${shard}.replicas ( - "slot" TEXT PRIMARY KEY, - "version" TEXT NOT NULL, - "initialSchema" JSON NOT NULL + "slot" TEXT PRIMARY KEY, + "version" TEXT NOT NULL, + "initialSchema" JSON NOT NULL, + "initialSyncContext" JSON, + "subscriberContext" JSON ); `; } @@ -223,6 +230,8 @@ const replicaSchema = internalShardConfigSchema.extend({ slot: v.string(), version: v.string(), initialSchema: publishedSchema, + initialSyncContext: jsonObjectSchema.nullable(), + subscriberContext: jsonObjectSchema.nullable(), }); export type Replica = v.Infer; @@ -245,12 +254,14 @@ export async function addReplica( slot: string, replicaVersion: string, {tables, indexes}: PublishedSchema, + initialSyncContext: JSONObject, ) { const schema = upstreamSchema(shard); const synced: PublishedSchema = {tables, indexes}; await sql` - INSERT INTO ${sql(schema)}.replicas ("slot", "version", "initialSchema") - VALUES (${slot}, ${replicaVersion}, ${synced})`; + INSERT INTO ${sql(schema)}.replicas + ("slot", "version", "initialSchema", "initialSyncContext") + VALUES (${slot}, ${replicaVersion}, ${synced}, ${initialSyncContext})`; } export async function getReplicaAtVersion( @@ -258,6 +269,7 @@ export async function getReplicaAtVersion( sql: PostgresDB, shard: ShardID, replicaVersion: string, + context?: JSONObject, ): Promise { const schema = sql(upstreamSchema(shard)); const result = await sql` @@ -267,8 +279,13 @@ export async function getReplicaAtVersion( if (result.length === 0) { // log out all the replicas and the joined shardConfig const allReplicas = await sql` - SELECT * FROM ${schema}.replicas JOIN ${schema}."shardConfig" ON true`; - lc.info?.(`Replica not found in: ${JSON.stringify(allReplicas)}`); + SELECT slot, version, "initialSyncContext", "subscriberContext" + FROM ${schema}.replicas`; + lc.info?.( + `Replica ${replicaVersion} ` + + (context ? `(context: ${stringify(context)}) ` : '') + + `not found in: ${stringify(allReplicas)}`, + ); return null; } return v.parse(result[0], replicaSchema, 'passthrough'); diff --git a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts index cf24920bb0..3c5a2acf68 100644 --- a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts @@ -14,21 +14,29 @@ import { initDB as initLiteDB, } from '../../../test/lite.ts'; import type {PostgresDB} from '../../../types/pg.ts'; +import {initReplica} from '../common/replica-schema.ts'; +import {initialSync} from './initial-sync.ts'; import {replicationSlotExpression} from './schema/shard.ts'; -import {initSyncSchema} from './sync-schema.ts'; const APP_ID = 'zeroz'; const SHARD_NUM = 9; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 9, - schemaVersion: 9, + dataVersion: 10, + schemaVersion: 10, minSafeVersion: 1, lock: 1, // Internal column, always 1 }; const WATERMARK_REGEX = /[0-9a-z]{4,}/; +const TEST_CONTEXT = { + taskID: 'foo-bar', + hostIP: '1.2.3.4', + hostname: 'foo.bar', + timestamp: 123, +}; + describe('change-streamer/pg/sync-schema', () => { type Case = { name: string; @@ -111,13 +119,21 @@ describe('change-streamer/pg/sync-schema', () => { publications: c.requestedPublications ?? [], }; - await initSyncSchema( + await initReplica( createSilentLogContext(), 'test', - shard, replicaFile.path, - getConnectionURI(upstream), - {tableCopyWorkers: 5}, + (log, tx) => + initialSync( + log, + shard, + tx, + getConnectionURI(upstream), + { + tableCopyWorkers: 5, + }, + TEST_CONTEXT, + ), ); await expectTables(upstream, c.upstreamPostState); diff --git a/packages/zero-cache/src/services/change-source/pg/sync-schema.ts b/packages/zero-cache/src/services/change-source/pg/sync-schema.ts deleted file mode 100644 index bc672c65bb..0000000000 --- a/packages/zero-cache/src/services/change-source/pg/sync-schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type {LogContext} from '@rocicorp/logger'; -import type {ShardConfig} from '../../../types/shards.ts'; -import {initReplica} from '../common/replica-schema.ts'; -import {initialSync, type InitialSyncOptions} from './initial-sync.ts'; - -export async function initSyncSchema( - log: LogContext, - debugName: string, - shard: ShardConfig, - dbPath: string, - upstreamURI: string, - syncOptions: InitialSyncOptions, -): Promise { - await initReplica(log, debugName, dbPath, (log, tx) => - initialSync(log, shard, tx, upstreamURI, syncOptions), - ); -} diff --git a/packages/zero-cache/src/services/change-streamer/schema/tables.ts b/packages/zero-cache/src/services/change-streamer/schema/tables.ts index aed3b50480..7ec376f830 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/tables.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/tables.ts @@ -161,7 +161,10 @@ export async function markResetRequired(sql: PostgresDB, shard: ShardID) { export async function ensureReplicationConfig( lc: LogContext, db: PostgresDB, - subscriptionState: SubscriptionState, + subscriptionState: Pick< + SubscriptionState, + 'publications' | 'replicaVersion' | 'watermark' + >, shard: ShardID, autoReset: boolean, ) { diff --git a/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts b/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts index 46caef7be7..ac09b78811 100644 --- a/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts @@ -22,7 +22,9 @@ describe('replicator/schema/replication-state', () => { db = new StatementRunner( new Database(createSilentLogContext(), ':memory:'), ); - initReplicationState(db.db, ['zero_data', 'zero_metadata'], '0a'); + initReplicationState(db.db, ['zero_data', 'zero_metadata'], '0a', { + foo: 'bar', + }); }); test('initial replication state', () => { @@ -32,6 +34,7 @@ describe('replicator/schema/replication-state', () => { lock: 1, replicaVersion: '0a', publications: '["zero_data","zero_metadata"]', + initialSyncContext: '{"foo":"bar"}', }, ], ['_zero.replicationState']: [ @@ -78,6 +81,7 @@ describe('replicator/schema/replication-state', () => { expect(getSubscriptionState(db)).toEqual({ replicaVersion: '0a', publications: ['zero_data', 'zero_metadata'], + initialSyncContext: {foo: 'bar'}, watermark: '0a', }); }); @@ -104,6 +108,7 @@ describe('replicator/schema/replication-state', () => { expect(getSubscriptionState(db)).toEqual({ replicaVersion: '0a', publications: ['zero_data', 'zero_metadata'], + initialSyncContext: {foo: 'bar'}, watermark: '0f', }); @@ -122,6 +127,7 @@ describe('replicator/schema/replication-state', () => { expect(getSubscriptionState(db)).toEqual({ replicaVersion: '0a', publications: ['zero_data', 'zero_metadata'], + initialSyncContext: {foo: 'bar'}, watermark: '0r', }); }); diff --git a/packages/zero-cache/src/services/replicator/schema/replication-state.ts b/packages/zero-cache/src/services/replicator/schema/replication-state.ts index 291219d042..feac4644fa 100644 --- a/packages/zero-cache/src/services/replicator/schema/replication-state.ts +++ b/packages/zero-cache/src/services/replicator/schema/replication-state.ts @@ -5,6 +5,12 @@ * after the logical replication handoff when initial data synchronization has completed. */ +import { + jsonObjectSchema, + parse, + stringify, + type JSONObject, +} from '../../../../../shared/src/bigint-json.ts'; import * as v from '../../../../../shared/src/valita.ts'; import type {Database} from '../../../../../zqlite/src/db.ts'; import type {StatementRunner} from '../../../db/statements.ts'; @@ -29,16 +35,22 @@ export const CREATE_RUNTIME_EVENTS_TABLE = ` `; const CREATE_REPLICATION_STATE_SCHEMA = - // replicaVersion : A value identifying the version at which the initial sync happened, i.e. - // the version at which all rows were copied, and to `_0_version` was set. - // This value is used to distinguish data from other replicas (e.g. if a - // replica is reset or if there are ever multiple replicas). - // publications : JSON stringified array of publication names - // lock : Auto-magic column for enforcing single-row semantics. - ` + // replicaVersion : A value identifying the version at which the initial sync happened, i.e. + // the version at which all rows were copied, and to `_0_version` was set. + // This value is used to distinguish data from other replicas (e.g. if a + // replica is reset or if there are ever multiple replicas). + // publications : JSON stringified array of publication names + // initialSyncContext : Metadata related to the context of when and how the replica was initially + // synced. This corresponds with the same column stored in upstream and is + // used for debugging replica version mismatches, which can arise from a number + // of misconfigurations, such as dueling replication-managers, or restores of + // stale litestream backups. + // lock : Auto-magic column for enforcing single-row semantics. + /*sql*/ ` CREATE TABLE "_zero.replicationConfig" ( replicaVersion TEXT NOT NULL, publications TEXT NOT NULL, + initialSyncContext TEXT DEFAULT '{}', lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) ); ` + @@ -64,11 +76,13 @@ const subscriptionStateSchema = v .object({ replicaVersion: v.string(), publications: v.string(), + initialSyncContext: v.string(), watermark: v.string(), }) .map(s => ({ ...s, publications: v.parse(JSON.parse(s.publications), stringArray), + initialSyncContext: v.parse(parse(s.initialSyncContext), jsonObjectSchema), })); export type SubscriptionState = v.Infer; @@ -83,6 +97,7 @@ export function initReplicationState( db: Database, publications: string[], watermark: string, + initialSyncContext: JSONObject = {}, createTables = true, ) { if (createTables) { @@ -91,9 +106,13 @@ export function initReplicationState( db.prepare( ` INSERT INTO "_zero.replicationConfig" - (replicaVersion, publications) VALUES (?, ?) + (replicaVersion, publications, initialSyncContext) VALUES (?, ?, ?) `, - ).run(watermark, JSON.stringify(publications.sort())); + ).run( + watermark, + JSON.stringify(publications.sort()), + stringify(initialSyncContext), + ); db.prepare( ` INSERT INTO "_zero.replicationState" (stateVersion) VALUES (?) @@ -134,14 +153,13 @@ export function getAscendingEvents(db: Database) { } export function getSubscriptionState(db: StatementRunner): SubscriptionState { - const result = db.get( - ` - SELECT c.replicaVersion, c.publications, s.stateVersion as watermark + const result = db.get(/*sql*/ ` + SELECT c.replicaVersion, c.publications, c.initialSyncContext, + s.stateVersion as watermark FROM "_zero.replicationConfig" as c JOIN "_zero.replicationState" as s ON c.lock = s.lock - `, - ); + `); return v.parse(result, subscriptionStateSchema); } diff --git a/packages/zql-integration-tests/src/child-merge.pg.test.ts b/packages/zql-integration-tests/src/child-merge.pg.test.ts index 14a9985b65..29577f09a4 100644 --- a/packages/zql-integration-tests/src/child-merge.pg.test.ts +++ b/packages/zql-integration-tests/src/child-merge.pg.test.ts @@ -6,6 +6,7 @@ import {must} from '../../shared/src/must.ts'; import {initialSync} from '../../zero-cache/src/services/change-source/pg/initial-sync.ts'; import {getConnectionURI, testDBs} from '../../zero-cache/src/test/db.ts'; import type {PostgresDB} from '../../zero-cache/src/types/pg.ts'; +import {consume} from '../../zql/src/ivm/stream.ts'; import type {QueryDelegate} from '../../zql/src/query/query-delegate.ts'; import {newQuery} from '../../zql/src/query/query-impl.ts'; import type {Query} from '../../zql/src/query/query.ts'; @@ -15,7 +16,6 @@ import { mapResultToClientNames, newQueryDelegate, } from '../../zqlite/src/test/source-factory.ts'; -import {consume} from '../../zql/src/ivm/stream.ts'; const lc = createSilentLogContext(); @@ -60,6 +60,7 @@ beforeAll(async () => { sqlite, getConnectionURI(pg), {tableCopyWorkers: 1}, + {}, ); queryDelegate = newQueryDelegate(lc, testLogConfig, sqlite, schema); diff --git a/packages/zql-integration-tests/src/chinook/get-deps.ts b/packages/zql-integration-tests/src/chinook/get-deps.ts index 26aae37fdc..61b0219546 100644 --- a/packages/zql-integration-tests/src/chinook/get-deps.ts +++ b/packages/zql-integration-tests/src/chinook/get-deps.ts @@ -43,5 +43,6 @@ export async function writeChinook(pg: PostgresDB, replica: Database) { replica, getConnectionURI(pg), {tableCopyWorkers: 1}, + {}, ); } diff --git a/packages/zql-integration-tests/src/compiler-bigint.pg.test.ts b/packages/zql-integration-tests/src/compiler-bigint.pg.test.ts index 63fa5528c8..a388e72dad 100644 --- a/packages/zql-integration-tests/src/compiler-bigint.pg.test.ts +++ b/packages/zql-integration-tests/src/compiler-bigint.pg.test.ts @@ -128,6 +128,7 @@ beforeAll(async () => { sqlite, getConnectionURI(pg), {tableCopyWorkers: 1}, + {}, ); queryDelegate = newQueryDelegate(lc, testLogConfig, sqlite, schema); diff --git a/packages/zql-integration-tests/src/compiler-types-with-args.pg.test.ts b/packages/zql-integration-tests/src/compiler-types-with-args.pg.test.ts index 3ec87aec1f..6bc774ccaa 100644 --- a/packages/zql-integration-tests/src/compiler-types-with-args.pg.test.ts +++ b/packages/zql-integration-tests/src/compiler-types-with-args.pg.test.ts @@ -132,6 +132,7 @@ beforeAll(async () => { sqlite, getConnectionURI(pg), {tableCopyWorkers: 1}, + {}, ); queryDelegate = newQueryDelegate(lc, testLogConfig, sqlite, schema); diff --git a/packages/zql-integration-tests/src/discord-repro.pg.test.ts b/packages/zql-integration-tests/src/discord-repro.pg.test.ts index 788428f8ab..b9046caa7c 100644 --- a/packages/zql-integration-tests/src/discord-repro.pg.test.ts +++ b/packages/zql-integration-tests/src/discord-repro.pg.test.ts @@ -6,6 +6,7 @@ import {must} from '../../shared/src/must.ts'; import {initialSync} from '../../zero-cache/src/services/change-source/pg/initial-sync.ts'; import {getConnectionURI, testDBs} from '../../zero-cache/src/test/db.ts'; import type {PostgresDB} from '../../zero-cache/src/types/pg.ts'; +import {consume} from '../../zql/src/ivm/stream.ts'; import type {QueryDelegate} from '../../zql/src/query/query-delegate.ts'; import {newQuery} from '../../zql/src/query/query-impl.ts'; import type {Query} from '../../zql/src/query/query.ts'; @@ -15,7 +16,6 @@ import { mapResultToClientNames, newQueryDelegate, } from '../../zqlite/src/test/source-factory.ts'; -import {consume} from '../../zql/src/ivm/stream.ts'; const lc = createSilentLogContext(); @@ -50,6 +50,7 @@ beforeAll(async () => { sqlite, getConnectionURI(pg), {tableCopyWorkers: 1}, + {}, ); queryDelegate = newQueryDelegate(lc, testLogConfig, sqlite, schema); diff --git a/packages/zql-integration-tests/src/helpers/runner.ts b/packages/zql-integration-tests/src/helpers/runner.ts index 0a9fade8a8..0e54753255 100644 --- a/packages/zql-integration-tests/src/helpers/runner.ts +++ b/packages/zql-integration-tests/src/helpers/runner.ts @@ -137,6 +137,7 @@ async function makeDatabases( sqlite, getConnectionURI(pg), {tableCopyWorkers: 1}, + {}, ); const memory = Object.fromEntries( diff --git a/packages/zql-integration-tests/src/helpers/setup.ts b/packages/zql-integration-tests/src/helpers/setup.ts index 5923d39f4b..0fedbd51ce 100644 --- a/packages/zql-integration-tests/src/helpers/setup.ts +++ b/packages/zql-integration-tests/src/helpers/setup.ts @@ -39,6 +39,7 @@ export async function fillPgAndSync( sqlite, getConnectionURI(pg), {tableCopyWorkers: 1}, + {}, ); return {pg, sqlite}; diff --git a/packages/zql-integration-tests/src/pagila/get-deps.ts b/packages/zql-integration-tests/src/pagila/get-deps.ts index a24a51408a..b6725c1bdf 100644 --- a/packages/zql-integration-tests/src/pagila/get-deps.ts +++ b/packages/zql-integration-tests/src/pagila/get-deps.ts @@ -89,5 +89,6 @@ export async function writePagila(pg: PostgresDB, replica: Database) { replica, getConnectionURI(pg), {tableCopyWorkers: 1}, + {}, ); } From 35d0916fd367c8f26b50f759b664a6783b316b67 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 24 Feb 2026 11:51:39 -0800 Subject: [PATCH 097/495] chore(zero-cache): fix schema incompatibility (#5599) Fix a schema incompatibility introduced in #5598. The new `initialSyncContext` column is only available after performing a schema migration on the replication-manager, and will not exist on litestream restores in the view-syncer. Limit the lookup of the new column to only where it's needed in the replication-manager. (Also address a PR comment) --- packages/zero-cache/src/config/network.ts | 4 +- .../zero-cache/src/config/server-context.ts | 3 +- .../change-source/pg/change-source.ts | 9 +++-- .../schema/replication-state.test.ts | 8 ++-- .../replicator/schema/replication-state.ts | 39 ++++++++++++++++--- 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/packages/zero-cache/src/config/network.ts b/packages/zero-cache/src/config/network.ts index f6a41b817b..622049b5bc 100644 --- a/packages/zero-cache/src/config/network.ts +++ b/packages/zero-cache/src/config/network.ts @@ -8,12 +8,12 @@ export const DEFAULT_PREFERRED_PREFIXES = [ ] as const; export function getHostIp( - lc: LogContext, + lc?: LogContext, preferredPrefixes: readonly string[] = DEFAULT_PREFERRED_PREFIXES, ) { const interfaces = networkInterfaces(); const preferred = getPreferredIp(interfaces, preferredPrefixes); - lc.info?.(`network interfaces`, {preferred, interfaces}); + lc?.info?.(`network interfaces`, {preferred, interfaces}); return preferred; } diff --git a/packages/zero-cache/src/config/server-context.ts b/packages/zero-cache/src/config/server-context.ts index e5545c8181..98a4955605 100644 --- a/packages/zero-cache/src/config/server-context.ts +++ b/packages/zero-cache/src/config/server-context.ts @@ -1,5 +1,4 @@ import {hostname} from 'node:os'; -import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; import {getHostIp} from './network.ts'; import type {NormalizedZeroConfig} from './normalize.ts'; @@ -22,7 +21,7 @@ export function getServerContext(config: NormalizedZeroConfig): ServerContext { const context: ServerContext = { appID: config.app.id, taskID: config.taskID, - hostIP: getHostIp(createSilentLogContext()), + hostIP: getHostIp(), hostname: hostname(), timestamp: new Date().toISOString(), diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 3040de467e..4380dd0663 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -38,8 +38,9 @@ import { import type {Sink} from '../../../types/streams.ts'; import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; import { - getSubscriptionState, + getSubscriptionStateAndContext, type SubscriptionState, + type SubscriptionStateAndContext, } from '../../replicator/schema/replication-state.ts'; import type {ChangeSource, ChangeStream} from '../change-source.ts'; import {BackfillManager} from '../common/backfill-manager.ts'; @@ -113,7 +114,9 @@ export async function initializePostgresChangeSource( ); const replica = new Database(lc, replicaDbFile); - const subscriptionState = getSubscriptionState(new StatementRunner(replica)); + const subscriptionState = getSubscriptionStateAndContext( + new StatementRunner(replica), + ); replica.close(); // Check that upstream is properly setup, and throw an AutoReset to re-run @@ -149,7 +152,7 @@ async function checkAndUpdateUpstream( replicaVersion, publications: subscribed, initialSyncContext, - }: SubscriptionState, + }: SubscriptionStateAndContext, ) { // Perform any shard schema updates await updateShardSchema(lc, sql, shard, replicaVersion); diff --git a/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts b/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts index ac09b78811..4f6c44c1e9 100644 --- a/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts @@ -9,7 +9,7 @@ import { import { getAscendingEvents, getReplicationState, - getSubscriptionState, + getSubscriptionStateAndContext, initReplicationState, recordEvent, updateReplicationWatermark, @@ -78,7 +78,7 @@ describe('replicator/schema/replication-state', () => { }); test('subscription state', () => { - expect(getSubscriptionState(db)).toEqual({ + expect(getSubscriptionStateAndContext(db)).toEqual({ replicaVersion: '0a', publications: ['zero_data', 'zero_metadata'], initialSyncContext: {foo: 'bar'}, @@ -105,7 +105,7 @@ describe('replicator/schema/replication-state', () => { expect(getReplicationState(db)).toEqual({ stateVersion: '0f', }); - expect(getSubscriptionState(db)).toEqual({ + expect(getSubscriptionStateAndContext(db)).toEqual({ replicaVersion: '0a', publications: ['zero_data', 'zero_metadata'], initialSyncContext: {foo: 'bar'}, @@ -124,7 +124,7 @@ describe('replicator/schema/replication-state', () => { expect(getReplicationState(db)).toEqual({ stateVersion: '0r', }); - expect(getSubscriptionState(db)).toEqual({ + expect(getSubscriptionStateAndContext(db)).toEqual({ replicaVersion: '0a', publications: ['zero_data', 'zero_metadata'], initialSyncContext: {foo: 'bar'}, diff --git a/packages/zero-cache/src/services/replicator/schema/replication-state.ts b/packages/zero-cache/src/services/replicator/schema/replication-state.ts index feac4644fa..29e7ab1297 100644 --- a/packages/zero-cache/src/services/replicator/schema/replication-state.ts +++ b/packages/zero-cache/src/services/replicator/schema/replication-state.ts @@ -7,7 +7,6 @@ import { jsonObjectSchema, - parse, stringify, type JSONObject, } from '../../../../../shared/src/bigint-json.ts'; @@ -76,17 +75,35 @@ const subscriptionStateSchema = v .object({ replicaVersion: v.string(), publications: v.string(), - initialSyncContext: v.string(), watermark: v.string(), }) .map(s => ({ ...s, publications: v.parse(JSON.parse(s.publications), stringArray), - initialSyncContext: v.parse(parse(s.initialSyncContext), jsonObjectSchema), })); export type SubscriptionState = v.Infer; +const subscriptionStateAndContextSchema = v + .object({ + replicaVersion: v.string(), + publications: v.string(), + initialSyncContext: v.string(), + watermark: v.string(), + }) + .map(s => ({ + ...s, + publications: v.parse(JSON.parse(s.publications), stringArray), + initialSyncContext: v.parse( + JSON.parse(s.initialSyncContext), + jsonObjectSchema, + ), + })); + +export type SubscriptionStateAndContext = v.Infer< + typeof subscriptionStateAndContextSchema +>; + const replicationStateSchema = v.object({ stateVersion: v.string(), }); @@ -154,8 +171,7 @@ export function getAscendingEvents(db: Database) { export function getSubscriptionState(db: StatementRunner): SubscriptionState { const result = db.get(/*sql*/ ` - SELECT c.replicaVersion, c.publications, c.initialSyncContext, - s.stateVersion as watermark + SELECT c.replicaVersion, c.publications, s.stateVersion as watermark FROM "_zero.replicationConfig" as c JOIN "_zero.replicationState" as s ON c.lock = s.lock @@ -163,6 +179,19 @@ export function getSubscriptionState(db: StatementRunner): SubscriptionState { return v.parse(result, subscriptionStateSchema); } +export function getSubscriptionStateAndContext( + db: StatementRunner, +): SubscriptionStateAndContext { + const result = db.get(/*sql*/ ` + SELECT c.replicaVersion, c.publications, c.initialSyncContext, + s.stateVersion as watermark + FROM "_zero.replicationConfig" as c + JOIN "_zero.replicationState" as s + ON c.lock = s.lock + `); + return v.parse(result, subscriptionStateAndContextSchema); +} + export function updateReplicationWatermark( db: StatementRunner, watermark: string, From 426af093de3e0e0bee4f8f1929f84b2dae65a40d Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 24 Feb 2026 12:06:13 -0800 Subject: [PATCH 098/495] chore(zero-cache): fix schema migration to have default (#5600) --- .../change-source/common/replica-schema.test.ts | 13 +++++++++++++ .../services/change-source/common/replica-schema.ts | 3 ++- prod/sst/sst.config.ts | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts index 846fc2ee6b..b1fe7116a4 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts @@ -74,6 +74,12 @@ describe('replica-schema-migrations', () => { CREATE_V1_REPLICATION_CONFIG_TABLE + CREATE_V6_COLUMN_METADATA_TABLE, replicaPreState: { + ['_zero.replicationConfig']: [ + { + replicaVersion: '123', + publications: '["foo_publication"]', + }, + ], ['_zero.column_metadata']: [ { character_max_length: null, @@ -87,6 +93,13 @@ describe('replica-schema-migrations', () => { ], }, replicaPostState: { + ['_zero.replicationConfig']: [ + { + replicaVersion: '123', + publications: '["foo_publication"]', + initialSyncContext: '{}', + }, + ], ['_zero.column_metadata']: [ { character_max_length: null, diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.ts index 83257dfeb6..b49241d237 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.ts @@ -159,7 +159,8 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { 10: { migrateSchema: (_, db) => { db.exec(/*sql*/ ` - ALTER TABLE "_zero.replicationConfig" ADD COLUMN "initialSyncContext" TEXT; + ALTER TABLE "_zero.replicationConfig" + ADD COLUMN "initialSyncContext" TEXT DEFAULT '{}'; `); }, }, diff --git a/prod/sst/sst.config.ts b/prod/sst/sst.config.ts index 5d3b8deb77..23feff575d 100644 --- a/prod/sst/sst.config.ts +++ b/prod/sst/sst.config.ts @@ -182,7 +182,7 @@ export default $config({ environment: { ...commonEnv, ZERO_LOG_LEVEL: 'debug', - ZERO_LITESTREAM_BACKUP_URL: $interpolate`s3://${replicationBucket.name}/backup/20250630-00`, + ZERO_LITESTREAM_BACKUP_URL: $interpolate`s3://${replicationBucket.name}/backup/20260224-00`, ZERO_INITIAL_SYNC_PROFILE_COPY: 'true', ZERO_CHANGE_MAX_CONNS: '3', ZERO_NUM_SYNC_WORKERS: '0', From ee5e13519284d9671a3b6eb14b84f75518984f2d Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 24 Feb 2026 15:39:17 -0800 Subject: [PATCH 099/495] chore(zero-cache): eagerly ack non-publication LSNs when possible (#5602) Eagerly send ACKs for LSN's outside of the replication slot's publication (which are received as backend status messages) if the change-streamer is caught up. Before, this would only happen every 30 seconds when postgres sends a status message with `shouldRespond: true`. With this change the acks are sent immediately if the replica is up to date, thereby updating the replication slot's `confirmed_flush_lsn` more quickly, making it possible to monitor replication lag more correctly. User request: * https://rocicorp.slack.com/archives/C0A8NUDMDM1/p1771970231194639?thread_ts=1771865240.766049&cid=C0A8NUDMDM1 Implementation Note: The previous timeout functionality in the `Acker` class has long been subsumed by [logic in the logical-replication/stream](https://github.com/rocicorp/mono/blob/426af093de3e0e0bee4f8f1929f84b2dae65a40d/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.ts#L98) class. The redundant timeout functionality has been removed, with the Acker class repurposed to manage downstream and eager acks. --- .../change-source/pg/change-source.pg.test.ts | 23 ++++--- .../change-source/pg/change-source.test.ts | 41 ++++++++----- .../change-source/pg/change-source.ts | 60 ++++++++++++------- 3 files changed, 73 insertions(+), 51 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index f540726d3b..ab1ff40b36 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -16,10 +16,7 @@ import { } from '../../../test/db.ts'; import {DbFile} from '../../../test/lite.ts'; import {type PostgresDB} from '../../../types/pg.ts'; -import { - majorVersionFromString, - majorVersionToString, -} from '../../../types/state-version.ts'; +import {majorVersionFromString} from '../../../types/state-version.ts'; import type {Source} from '../../../types/streams.ts'; import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; import {getSubscriptionState} from '../../replicator/schema/replication-state.ts'; @@ -30,7 +27,7 @@ import type { Commit, } from '../protocol/current/downstream.ts'; import {initializePostgresChangeSource} from './change-source.ts'; -import {fromStateVersionString} from './lsn.ts'; +import {toBigInt} from './lsn.ts'; import {dropEventTriggerStatements} from './schema/ddl.ts'; const APP_ID = '23'; @@ -354,20 +351,22 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { expect(await downstream.dequeue()).toMatchObject([ 'commit', {tag: 'commit'}, - {watermark: begin2[2]?.commitWatermark}, + {watermark: begin2[2].commitWatermark}, ]); // Close the stream. changes.cancel(); - // Verify that the ACK was stored with the replication slot. - const results = await upstream<{confirmed: string}[]>` + // Verify that the ACK stored with the replication slot includes + // the first commit but not the second. + const [{confirmed}] = await upstream<{confirmed: string}[]>` SELECT confirmed_flush_lsn as confirmed FROM pg_replication_slots WHERE slot_name = ${replicationSlot}`; - const expected = majorVersionFromString(commit1[2].watermark); - expect(results).toEqual([ - {confirmed: fromStateVersionString(majorVersionToString(expected))}, - ]); + const min = majorVersionFromString(commit1[2].watermark); + const max = majorVersionFromString(begin2[2].commitWatermark); + const actual = toBigInt(confirmed); + expect(actual).toBeGreaterThanOrEqual(min); + expect(actual).toBeLessThan(max); }); test.each([ diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.test.ts index 83f176b78f..fcb3880a64 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.test.ts @@ -1,14 +1,6 @@ -import {afterEach, beforeEach, expect, test, vi} from 'vitest'; +import {expect, test, vi} from 'vitest'; import {Acker} from './change-source.ts'; -beforeEach(() => { - vi.useFakeTimers(); -}); - -afterEach(() => { - vi.useRealTimers(); -}); - test('acker', () => { const sink = {push: vi.fn()}; @@ -21,17 +13,34 @@ test('acker', () => { const acker = new Acker(sink); - acker.keepalive(); + acker.ackIfDownstreamIsCaughtUp('0a'); + expectAck(10n); + + acker.expectDownstreamAck('0b'); acker.ack('0b'); expectAck(11n); - // Should be a no-op (i.e. no '0/0' sent). - vi.advanceTimersToNextTimer(); + acker.ackIfDownstreamIsCaughtUp('0c'); + expectAck(12n); + + acker.expectDownstreamAck('0d'); + + // This should be dropped because we are awaiting 0d + acker.ackIfDownstreamIsCaughtUp('0e'); + + // Now we are awaiting 0f + acker.expectDownstreamAck('0f'); acker.ack('0d'); expectAck(13n); - // Keepalive ('0/0') is sent if no ack is sent before the timer fires. - acker.keepalive(); - vi.advanceTimersToNextTimer(); - expectAck(0n); + // Still not caught up, so dropped + acker.ackIfDownstreamIsCaughtUp('0g'); + + // Downstream is now caught up. + acker.ack('0f'); + expectAck(15n); + + // Now that downstream is caught up, this should respond + acker.ackIfDownstreamIsCaughtUp('0h'); + expectAck(17n); }); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 4380dd0663..1117efbf63 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -328,10 +328,23 @@ class PostgresChangeSource implements ChangeSource { for await (const [lsn, msg] of messages) { // Note: no reservation is needed for pushStatus(). if (msg.tag === 'keepalive') { + const watermark = majorVersionToString(lsn); + if (msg.shouldRespond) { + acker.expectDownstreamAck(watermark); + } else { + // Keepalives with shouldRespond = false are sent to the + // multiplexer for Listeners, but for efficiency they are not + // sent downstream to the change-streamer. Ack them here if + // the change-streamer is caught up. This updates the + // replication slot's `confirmed_flush_lsn` more quickly + // (rather than waiting for the periodic shouldRespond), which + // is useful for monitoring replication slot lag. + acker.ackIfDownstreamIsCaughtUp(watermark); + } changes.pushStatus([ 'status', {ack: msg.shouldRespond}, - {watermark: majorVersionToString(lsn)}, + {watermark}, ]); // If we're not in a transaction but the last reservation was kept @@ -352,6 +365,13 @@ class PostgresChangeSource implements ChangeSource { let lastChange: ChangeStreamMessage | undefined; for (const change of await changeMaker.makeChanges(lsn, msg)) { + if (change[0] === 'begin') { + // Mark the commit watermark as being expected so that any + // intermediate shouldRespond=false watermarks, which will be + // at the commitWatermark, are *not* acked, as the ack must come + // from change-streamer after it commits the transaction. + acker.expectDownstreamAck(change[2].commitWatermark); + } await changes.push(change); // Allow the change-streamer to push back. lastChange = change; } @@ -543,40 +563,34 @@ class PostgresChangeSource implements ChangeSource { // Exported for testing. export class Acker { #acks: Sink; - #keepaliveTimer: NodeJS.Timeout | undefined; + #waitingForDownstreamAck: string | null = null; constructor(acks: Sink) { this.#acks = acks; } - keepalive() { - // Sets a timeout to send a standby status update in response to - // a primary keepalive message. - // - // https://www.postgresql.org/docs/current/protocol-replication.html#PROTOCOL-REPLICATION-PRIMARY-KEEPALIVE-MESSAGE - // - // A primary keepalive message is streamed to the change-streamer as a - // 'status' message, which in turn responds with an ack. However, in the - // event that the change-streamer is backed up processing preceding - // changes, this timeout will fire to send a status update that does not - // change the confirmed flush position. This timeout must be shorter than - // the `wal_sender_timeout`, which defaults to 60 seconds. - // - // https://www.postgresql.org/docs/current/runtime-config-replication.html#GUC-WAL-SENDER-TIMEOUT - this.#keepaliveTimer ??= setTimeout(() => this.#sendAck(), 1000); + expectDownstreamAck(watermark: string) { + this.#waitingForDownstreamAck = watermark; } ack(watermark: LexiVersion) { + if ( + this.#waitingForDownstreamAck && + this.#waitingForDownstreamAck <= watermark + ) { + this.#waitingForDownstreamAck = null; + } this.#sendAck(watermark); } - #sendAck(watermark?: LexiVersion) { - clearTimeout(this.#keepaliveTimer); - this.#keepaliveTimer = undefined; + ackIfDownstreamIsCaughtUp(watermark: string) { + if (this.#waitingForDownstreamAck === null) { + this.#sendAck(watermark); + } + } - // Note: Sending '0/0' means "keep alive but do not update confirmed_flush_lsn" - // https://github.com/postgres/postgres/blob/3edc67d337c2e498dad1cd200e460f7c63e512e6/src/backend/replication/walsender.c#L2457 - const lsn = watermark ? majorVersionFromString(watermark) : 0n; + #sendAck(watermark: LexiVersion) { + const lsn = majorVersionFromString(watermark); this.#acks.push(lsn); } } From 21af8f5256a24f20502a08f7564ee12190f079ff Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 25 Feb 2026 00:09:24 -0800 Subject: [PATCH 100/495] chore(zero-cache): skip acks for backfill, clean up ack logic (#5606) 1. Adds a backwards-compatible `skipAck` field to "begin" messages to signal the change-streamer not to send an ack for that transaction. This is used to avoid sending acks for backfill transactions. In practice, there is no harm in doing so for PG because PG only tracks the latest LSN, but it is cleaner and easier to reason about if they are not sent, especially considering functionality like #5602. 2. Moves the logic of sending eager ACKs into the Acker class by having it implement the Listener interface. This simplifies the main change processing loop by compartmentalizing the logic into the Acker. --- .../common/backfill-manager.test.ts | 126 +++++++++++++++--- .../change-source/common/backfill-manager.ts | 2 +- .../change-source/pg/change-source.test.ts | 22 +-- .../change-source/pg/change-source.ts | 66 +++++---- .../change-source/protocol/current/data.ts | 3 + .../change-source/protocol/current/status.ts | 10 +- .../change-source/protocol/version.test.ts | 4 +- .../src/services/change-streamer/storer.ts | 18 ++- 8 files changed, 181 insertions(+), 70 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts index 593c5a6ad2..2e3d5ac1c9 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.test.ts @@ -121,7 +121,11 @@ describe('backfill-manager', () => { changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); expect(await drainChanges(5)).toMatchObject([ - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '123.01'}, + ], [ 'data', { @@ -253,7 +257,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '125'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '125.01'}, + ], [ 'data', { @@ -374,7 +382,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '130'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '130.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '130.01'}, + ], [ 'data', { @@ -555,7 +567,11 @@ describe('backfill-manager', () => { changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); expect((await drainChanges(15)).slice(-3)).toMatchObject([ - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '125.01'}, + ], [ 'data', { @@ -653,7 +669,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '125'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '125.01'}, + ], [ 'data', { @@ -757,7 +777,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '125'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '125.01'}, + ], [ 'data', { @@ -864,7 +888,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '125'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '125.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '125.01'}, + ], [ 'data', { @@ -1001,7 +1029,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '140'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '140.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '140.01'}, + ], [ 'data', { @@ -1296,7 +1328,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '140'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '140.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '140.01'}, + ], [ 'data', { @@ -1322,7 +1358,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '140.01'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '140.02'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '140.02'}, + ], [ 'data', { @@ -1401,7 +1441,11 @@ describe('backfill-manager', () => { changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); expect(await drainChanges(3)).toMatchObject([ - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '123.01'}, + ], [ 'data', { @@ -1514,7 +1558,11 @@ describe('backfill-manager', () => { changeStream.pushStatus(['status', {ack: false}, {watermark: '188'}]); expect(await drainChanges(4)).toMatchObject([ - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '123.01'}, + ], [ 'data', { @@ -1631,7 +1679,11 @@ describe('backfill-manager', () => { // Each 'backfill' message is wrapped in a separate transaction because // the backfill-manager yielded the stream between every message. expect(await drainChanges(15)).toMatchObject([ - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '141.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '141.01'}, + ], [ 'data', { @@ -1647,7 +1699,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '141.01'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '142.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '142.01'}, + ], [ 'data', { @@ -1663,7 +1719,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '142.01'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '143.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '143.01'}, + ], [ 'data', { @@ -1679,7 +1739,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '143.01'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '144.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '144.01'}, + ], [ 'data', { @@ -1695,7 +1759,11 @@ describe('backfill-manager', () => { }, ], ['commit', {tag: 'commit'}, {watermark: '144.01'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '145.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '145.01'}, + ], [ 'data', { @@ -1758,7 +1826,11 @@ describe('backfill-manager', () => { changeStream.release('131'); expect(await drainChanges(8)).toMatchObject([ - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '123.01'}, + ], [ 'data', { @@ -1777,7 +1849,11 @@ describe('backfill-manager', () => { ['begin', {tag: 'begin'}, {commitWatermark: '131'}], ['commit', {tag: 'commit'}, {watermark: '131'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '131.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '131.01'}, + ], [ 'data', { @@ -1840,7 +1916,11 @@ describe('backfill-manager', () => { changeStream.pushStatus(['status', {ack: false}, {watermark: '130'}]); expect(await drainChanges(6)).toMatchObject([ - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.01'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '123.01'}, + ], [ 'data', { @@ -1856,7 +1936,11 @@ describe('backfill-manager', () => { ], ['commit', {tag: 'commit'}, {watermark: '123.01'}], - ['begin', {tag: 'begin', json: 'p'}, {commitWatermark: '123.02'}], + [ + 'begin', + {tag: 'begin', json: 'p', skipAck: true}, + {commitWatermark: '123.02'}, + ], [ 'data', { diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts index 5efadd1b0c..481caccebb 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -242,7 +242,7 @@ export class BackfillManager implements Cancelable, Listener { void changeStream.push([ 'begin', - {tag: 'begin', json: this.#jsonFormat}, + {tag: 'begin', json: this.#jsonFormat, skipAck: true}, {commitWatermark: tx}, ]); return (backfillTx = tx); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.test.ts index fcb3880a64..074c11cdc5 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.test.ts @@ -11,36 +11,42 @@ test('acker', () => { expect(sink.push.mock.calls[acks - 1][0]).toBe(expected); }; + const expectNoAck = () => { + expect(sink.push).toBeCalledTimes(acks); + }; + const acker = new Acker(sink); - acker.ackIfDownstreamIsCaughtUp('0a'); + acker.onChange(['status', {ack: false}, {watermark: '0a'}]); expectAck(10n); - acker.expectDownstreamAck('0b'); + acker.onChange(['begin', {tag: 'begin'}, {commitWatermark: '0b'}]); acker.ack('0b'); expectAck(11n); - acker.ackIfDownstreamIsCaughtUp('0c'); + acker.onChange(['status', {ack: false}, {watermark: '0c'}]); expectAck(12n); - acker.expectDownstreamAck('0d'); + acker.onChange(['begin', {tag: 'begin'}, {commitWatermark: '0d'}]); // This should be dropped because we are awaiting 0d - acker.ackIfDownstreamIsCaughtUp('0e'); + acker.onChange(['status', {ack: false}, {watermark: '0e'}]); + expectNoAck(); // Now we are awaiting 0f - acker.expectDownstreamAck('0f'); + acker.onChange(['status', {ack: true}, {watermark: '0f'}]); acker.ack('0d'); expectAck(13n); // Still not caught up, so dropped - acker.ackIfDownstreamIsCaughtUp('0g'); + acker.onChange(['status', {ack: false}, {watermark: '0g'}]); + expectNoAck(); // Downstream is now caught up. acker.ack('0f'); expectAck(15n); // Now that downstream is caught up, this should respond - acker.ackIfDownstreamIsCaughtUp('0h'); + acker.onChange(['status', {ack: false}, {watermark: '0h'}]); expectAck(17n); }); diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 1117efbf63..62b29a9932 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -44,7 +44,10 @@ import { } from '../../replicator/schema/replication-state.ts'; import type {ChangeSource, ChangeStream} from '../change-source.ts'; import {BackfillManager} from '../common/backfill-manager.ts'; -import {ChangeStreamMultiplexer} from '../common/change-stream-multiplexer.ts'; +import { + ChangeStreamMultiplexer, + type Listener, +} from '../common/change-stream-multiplexer.ts'; import {initReplica} from '../common/replica-schema.ts'; import type {BackfillRequest, JSONObject} from '../protocol/current.ts'; import type { @@ -297,6 +300,7 @@ class PostgresChangeSource implements ChangeSource { [...shardConfig.publications], clientStart, ); + const acker = new Acker(acks); // The ChangeStreamMultiplexer facilitates cooperative streaming from // the main replication stream and backfill streams initiated by the @@ -307,11 +311,9 @@ class PostgresChangeSource implements ChangeSource { ); changes .addProducers(messages, backfillManager) - .addListeners(backfillManager); + .addListeners(backfillManager, acker); backfillManager.run(clientWatermark, backfillRequests); - const acker = new Acker(acks); - const changeMaker = new ChangeMaker( this.#lc, this.#shard, @@ -328,23 +330,10 @@ class PostgresChangeSource implements ChangeSource { for await (const [lsn, msg] of messages) { // Note: no reservation is needed for pushStatus(). if (msg.tag === 'keepalive') { - const watermark = majorVersionToString(lsn); - if (msg.shouldRespond) { - acker.expectDownstreamAck(watermark); - } else { - // Keepalives with shouldRespond = false are sent to the - // multiplexer for Listeners, but for efficiency they are not - // sent downstream to the change-streamer. Ack them here if - // the change-streamer is caught up. This updates the - // replication slot's `confirmed_flush_lsn` more quickly - // (rather than waiting for the periodic shouldRespond), which - // is useful for monitoring replication slot lag. - acker.ackIfDownstreamIsCaughtUp(watermark); - } changes.pushStatus([ 'status', {ack: msg.shouldRespond}, - {watermark}, + {watermark: majorVersionToString(lsn)}, ]); // If we're not in a transaction but the last reservation was kept @@ -365,13 +354,6 @@ class PostgresChangeSource implements ChangeSource { let lastChange: ChangeStreamMessage | undefined; for (const change of await changeMaker.makeChanges(lsn, msg)) { - if (change[0] === 'begin') { - // Mark the commit watermark as being expected so that any - // intermediate shouldRespond=false watermarks, which will be - // at the commitWatermark, are *not* acked, as the ack must come - // from change-streamer after it commits the transaction. - acker.expectDownstreamAck(change[2].commitWatermark); - } await changes.push(change); // Allow the change-streamer to push back. lastChange = change; } @@ -561,7 +543,7 @@ class PostgresChangeSource implements ChangeSource { } // Exported for testing. -export class Acker { +export class Acker implements Listener { #acks: Sink; #waitingForDownstreamAck: string | null = null; @@ -569,7 +551,35 @@ export class Acker { this.#acks = acks; } - expectDownstreamAck(watermark: string) { + onChange(change: ChangeStreamMessage): void { + switch (change[0]) { + case 'status': + const {watermark} = change[2]; + if (change[1].ack) { + this.#expectDownstreamAck(watermark); + } else { + // Keepalives with shouldRespond = false are sent to Listeners, + // but for efficiency they are not sent downstream to the + // change-streamer. Ack them here if the change-streamer is caught + // up. This updates the replication slot's `confirmed_flush_lsn` + // more quickly (rather than waiting for the periodic shouldRespond), + // which is useful for monitoring replication slot lag. + this.#ackIfDownstreamIsCaughtUp(watermark); + } + break; + case 'begin': + // Mark the commit watermark as being expected so that any intermediate + // shouldRespond=false watermarks, which will be at the + // commitWatermark, are *not* acked, as the ack must come from + // change-streamer after it commits the transaction. + if (!change[1].skipAck) { + this.#expectDownstreamAck(change[2].commitWatermark); + } + break; + } + } + + #expectDownstreamAck(watermark: string) { this.#waitingForDownstreamAck = watermark; } @@ -583,7 +593,7 @@ export class Acker { this.#sendAck(watermark); } - ackIfDownstreamIsCaughtUp(watermark: string) { + #ackIfDownstreamIsCaughtUp(watermark: string) { if (this.#waitingForDownstreamAck === null) { this.#sendAck(watermark); } diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.ts index db76fd4045..29ba7fee02 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/data.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.ts @@ -27,6 +27,9 @@ export const beginSchema = v.object({ // // If absent, the format is assumed to be 'p' (parsed JSON objects/values). json: v.literalUnion('p', 's').optional(), + + // Directs the change-streamer to skip the ACK for the corresponding commit. + skipAck: v.boolean().optional(), }); export const commitSchema = v.object({ diff --git a/packages/zero-cache/src/services/change-source/protocol/current/status.ts b/packages/zero-cache/src/services/change-source/protocol/current/status.ts index 3337a037ff..a19c9fa880 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/status.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/status.ts @@ -18,9 +18,10 @@ export const downstreamStatusMessageSchema = v.tuple([ ]); /** - * The `zero-cache` will send the Commit payload when acknowledging a - * completed transaction, and will echo back the downstreamStatus message - * if `ack` is true. + * The `zero-cache` will send the Commit payload to acknowledge a completed + * transaction (unless the `skipAck` field was specified in the Begin message + * of the transaction), and will echo back the downstream `status` message if + * `ack` is true. */ export const upstreamStatusMessageSchema = v.tuple([ v.literal('status'), @@ -41,7 +42,8 @@ export const upstreamStatusMessageSchema = v.tuple([ * * The `zero-cache` sends StatusMessages to the ChangeSource: * - * * when it has processed a `Commit` received from the ChangeSource + * * when it has processed a `Commit` received from the ChangeSource, + * unless the `Begin` message specified `skipAck`. * * * when it receives a `StatusMessage` and all preceding `Commit` messages * have been processed diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index a5fc0f80b5..c4ad62787f 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '1zl8ygis5w4j0', '/changes/v0/stream'); + t(current, '3hqhs0gie5y3q', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '1zl8ygis5w4j0', '/changes/v0/stream'); + t(v0, '3hqhs0gie5y3q', '/changes/v0/stream'); }); diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index fd7649fedc..46d473baee 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -30,7 +30,10 @@ import { type TableMetadata, } from '../change-source/protocol/current.ts'; import {type Commit} from '../change-source/protocol/current/downstream.ts'; -import type {UpstreamStatusMessage} from '../change-source/protocol/current/status.ts'; +import type { + DownstreamStatusMessage, + UpstreamStatusMessage, +} from '../change-source/protocol/current/status.ts'; import type {ReplicatorMode} from '../replicator/replicator.ts'; import type {Service} from '../service.ts'; import type {WatermarkedChange} from './change-streamer-service.ts'; @@ -59,7 +62,7 @@ type QueueEntry = ] | ['ready', callback: () => void] | ['subscriber', SubscriberAndMode] - | UpstreamStatusMessage + | DownstreamStatusMessage | ['abort'] | 'stop'; @@ -68,6 +71,7 @@ type PendingTransaction = { preCommitWatermark: string; pos: number; startingReplicationState: Promise; + ack: boolean; }; const backfillRequestsSchema = v.array(backfillRequestSchema); @@ -278,7 +282,7 @@ export class Storer implements Service { this.#queue.enqueue(['abort']); } - status(s: UpstreamStatusMessage) { + status(s: DownstreamStatusMessage) { this.#queue.enqueue(s); } @@ -393,6 +397,7 @@ export class Storer implements Service { preCommitWatermark: watermark, pos: 0, startingReplicationState: promise, + ack: !change.skipAck, }; tx.pool.run(this.#db); // Pipeline a read of the current ReplicationState, @@ -473,10 +478,11 @@ export class Storer implements Service { throw e; } - tx = null; - // ACK the LSN to the upstream Postgres. - this.#onConsumed(['commit', change, {watermark}]); + if (tx.ack) { + this.#onConsumed(['commit', change, {watermark}]); + } + tx = null; // Before beginning the next transaction, open a READONLY snapshot to // concurrently catchup any queued subscribers. From 8dee1a6d12b9205b2cfa775cb13e8bdc822a4f76 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 25 Feb 2026 13:59:53 +0100 Subject: [PATCH 101/495] chore: Upgrade oxlint (#5596) --- package-lock.json | 621 ++++++++++++++++++++++++++++++++++------------ package.json | 4 +- 2 files changed, 467 insertions(+), 158 deletions(-) diff --git a/package-lock.json b/package-lock.json index a818f76975..e9f65f931c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,8 +18,8 @@ "@vitest/coverage-v8": "4.0.15", "@vitest/runner": "4.0.15", "baseline-browser-mapping": "^2.9.6", - "oxlint": "^1.32.0", - "oxlint-tsgolint": "^0.8.5", + "oxlint": "^1.50.0", + "oxlint-tsgolint": "^0.14.2", "prettier": "^3.5.3", "tsx": "^4.21.0", "turbo": "^2.4.4", @@ -12136,9 +12136,9 @@ } }, "node_modules/@oxlint-tsgolint/darwin-arm64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.8.5.tgz", - "integrity": "sha512-6Fmcrk33+PbA8fEeuz8AGD7G3KoGWTJfvCflQD8zgY8AYK8OIs7bh4WUfZiRLVJdZ0PLY6y85J2IbfXy5dTrjQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.14.2.tgz", + "integrity": "sha512-03WxIXguCXf1pTmoG2C6vqRcbrU9GaJCW6uTIiQdIQq4BrJnVWZv99KEUQQRkuHK78lOLa9g7B4K58NcVcB54g==", "cpu": [ "arm64" ], @@ -12150,9 +12150,9 @@ ] }, "node_modules/@oxlint-tsgolint/darwin-x64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.8.5.tgz", - "integrity": "sha512-vaB8oNS1gkJYpGq09UfpF62kPew3Ia7WHYQeD9IIOnUHWW1LNyZdNHuB6h99Kn9irMLj/uhbl7HtDzP+Lk4BNg==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.14.2.tgz", + "integrity": "sha512-ksMLl1cIWz3Jw+U79BhyCPdvohZcJ/xAKri5bpT6oeEM2GVnQCHBk/KZKlYrd7hZUTxz0sLnnKHE11XFnLASNQ==", "cpu": [ "x64" ], @@ -12164,9 +12164,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-arm64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.8.5.tgz", - "integrity": "sha512-avfdBAcvqGacG78I919wMl4Cv3wT/to0u7CwyvFC/8vvIpPq983xmiPjMqFt1m/6ADtvRQfmSMK18C9l8uew7A==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.14.2.tgz", + "integrity": "sha512-2BgR535w7GLxBCyQD5DR3dBzbAgiBbG5QX1kAEVzOmWxJhhGxt5lsHdHebRo7ilukYLpBDkerz0mbMErblghCQ==", "cpu": [ "arm64" ], @@ -12178,9 +12178,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-x64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.8.5.tgz", - "integrity": "sha512-CvUc+0iCLBUKRiIzFIMhPJQpGI1JA29hiFWlLU/qBtf3V/IanxSbcgOm8zaO2/agg0yfS/oHrL/u8SR9xdcIvA==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.14.2.tgz", + "integrity": "sha512-TUHFyVHfbbGtnTQZbUFgwvv3NzXBgzNLKdMUJw06thpiC7u5OW5qdk4yVXIC/xeVvdl3NAqTfcT4sA32aiMubg==", "cpu": [ "x64" ], @@ -12192,9 +12192,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-arm64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.8.5.tgz", - "integrity": "sha512-2opjh8Vev+Z1dsi0lTYeGeI+Pbm6JgLT2U7l3+t8Ww3d/lhXgxUP9l+nX3ioCQd8auUy198MoWYice3OhjCX1w==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.14.2.tgz", + "integrity": "sha512-OfYHa/irfVggIFEC4TbawsI7Hwrttppv//sO/e00tu4b2QRga7+VHAwtCkSFWSr0+BsO4InRYVA0+pun5BinpQ==", "cpu": [ "arm64" ], @@ -12206,9 +12206,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-x64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.8.5.tgz", - "integrity": "sha512-HGsTFdQDbXJ6VP9smhQyv3Pi/Vybabad57vT/SH12xYBYaIt1A0YO9ioQN36iYOb+971G9lo+YZjifa3vwDilA==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.14.2.tgz", + "integrity": "sha512-5gxwbWYE2pP+pzrO4SEeYvLk4N609eAe18rVXUx+en3qtHBkU8VM2jBmMcZdIHn+G05leu4pYvwAvw6tvT9VbA==", "cpu": [ "x64" ], @@ -12219,10 +12219,44 @@ "win32" ] }, - "node_modules/@oxlint/darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/darwin-arm64/-/darwin-arm64-1.32.0.tgz", - "integrity": "sha512-yrqPmZYu5Qb+49h0P5EXVIq8VxYkDDM6ZQrWzlh16+UGFcD8HOXs4oF3g9RyfaoAbShLCXooSQsM/Ifwx8E/eQ==", + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.50.0.tgz", + "integrity": "sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.50.0.tgz", + "integrity": "sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.50.0.tgz", + "integrity": "sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==", "cpu": [ "arm64" ], @@ -12231,12 +12265,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@oxlint/darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/darwin-x64/-/darwin-x64-1.32.0.tgz", - "integrity": "sha512-pQRZrJG/2nAKc3IuocFbaFFbTDlQsjz2WfivRsMn0hw65EEsSuM84WMFMiAfLpTGyTICeUtHZLHlrM5lzVr36A==", + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.50.0.tgz", + "integrity": "sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==", "cpu": [ "x64" ], @@ -12245,12 +12282,66 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@oxlint/linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-gnu/-/linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-tyomSmU2DzwcTmbaWFmStHgVfRmJDDvqcIvcw4fRB1YlL2Qg/XaM4NJ0m2bdTap38gxD5FSxSgCo0DkQ8GTolg==", + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.50.0.tgz", + "integrity": "sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.50.0.tgz", + "integrity": "sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.50.0.tgz", + "integrity": "sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.50.0.tgz", + "integrity": "sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==", "cpu": [ "arm64" ], @@ -12259,12 +12350,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@oxlint/linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-musl/-/linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-0W46dRMaf71OGE4+Rd+GHfS1uF/UODl5Mef6871pMhN7opPGfTI2fKJxh9VzRhXeSYXW/Z1EuCq9yCfmIJq+5Q==", + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.50.0.tgz", + "integrity": "sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==", "cpu": [ "arm64" ], @@ -12273,12 +12367,83 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.50.0.tgz", + "integrity": "sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.50.0.tgz", + "integrity": "sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@oxlint/linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-gnu/-/linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-5+6myVCBOMvM62rDB9T3CARXUvIwhGqte6E+HoKRwYaqsxGUZ4bh3pItSgSFwHjLGPrvADS11qJUkk39eQQBzQ==", + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.50.0.tgz", + "integrity": "sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.50.0.tgz", + "integrity": "sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.50.0.tgz", + "integrity": "sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==", "cpu": [ "x64" ], @@ -12287,12 +12452,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@oxlint/linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-musl/-/linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-qwQlwYYgVIC6ScjpUwiKKNyVdUlJckrfwPVpIjC9mvglIQeIjKuuyaDxUZWIOc/rEzeCV/tW6tcbehLkfEzqsw==", + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.50.0.tgz", + "integrity": "sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==", "cpu": [ "x64" ], @@ -12301,12 +12469,32 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@oxlint/win32-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/win32-arm64/-/win32-arm64-1.32.0.tgz", - "integrity": "sha512-7qYZF9CiXGtdv8Z/fBkgB5idD2Zokht67I5DKWH0fZS/2R232sDqW2JpWVkXltk0+9yFvmvJ0ouJgQRl9M3S2g==", + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.50.0.tgz", + "integrity": "sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.50.0.tgz", + "integrity": "sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==", "cpu": [ "arm64" ], @@ -12315,12 +12503,32 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@oxlint/win32-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-1.32.0.tgz", - "integrity": "sha512-XW1xqCj34MEGJlHteqasTZ/LmBrwYIgluhNW0aP+XWkn90+stKAq3W/40dvJKbMK9F7o09LPCuMVtUW7FIUuiA==", + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.50.0.tgz", + "integrity": "sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.50.0.tgz", + "integrity": "sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==", "cpu": [ "x64" ], @@ -12329,7 +12537,10 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/@peculiar/asn1-cms": { "version": "2.6.0", @@ -29425,13 +29636,12 @@ } }, "node_modules/oxlint": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.32.0.tgz", - "integrity": "sha512-HYDQCga7flsdyLMUIxTgSnEx5KBxpP9VINB8NgO+UjV80xBiTQXyVsvjtneMT3ZBLMbL0SlG/Dm03XQAsEshMA==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.50.0.tgz", + "integrity": "sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==", "dev": true, "license": "MIT", "bin": { - "oxc_language_server": "bin/oxc_language_server", "oxlint": "bin/oxlint" }, "engines": { @@ -29441,17 +29651,28 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxlint/darwin-arm64": "1.32.0", - "@oxlint/darwin-x64": "1.32.0", - "@oxlint/linux-arm64-gnu": "1.32.0", - "@oxlint/linux-arm64-musl": "1.32.0", - "@oxlint/linux-x64-gnu": "1.32.0", - "@oxlint/linux-x64-musl": "1.32.0", - "@oxlint/win32-arm64": "1.32.0", - "@oxlint/win32-x64": "1.32.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=0.8.1" + "@oxlint/binding-android-arm-eabi": "1.50.0", + "@oxlint/binding-android-arm64": "1.50.0", + "@oxlint/binding-darwin-arm64": "1.50.0", + "@oxlint/binding-darwin-x64": "1.50.0", + "@oxlint/binding-freebsd-x64": "1.50.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.50.0", + "@oxlint/binding-linux-arm-musleabihf": "1.50.0", + "@oxlint/binding-linux-arm64-gnu": "1.50.0", + "@oxlint/binding-linux-arm64-musl": "1.50.0", + "@oxlint/binding-linux-ppc64-gnu": "1.50.0", + "@oxlint/binding-linux-riscv64-gnu": "1.50.0", + "@oxlint/binding-linux-riscv64-musl": "1.50.0", + "@oxlint/binding-linux-s390x-gnu": "1.50.0", + "@oxlint/binding-linux-x64-gnu": "1.50.0", + "@oxlint/binding-linux-x64-musl": "1.50.0", + "@oxlint/binding-openharmony-arm64": "1.50.0", + "@oxlint/binding-win32-arm64-msvc": "1.50.0", + "@oxlint/binding-win32-ia32-msvc": "1.50.0", + "@oxlint/binding-win32-x64-msvc": "1.50.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.14.1" }, "peerDependenciesMeta": { "oxlint-tsgolint": { @@ -29460,21 +29681,21 @@ } }, "node_modules/oxlint-tsgolint": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.8.5.tgz", - "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.14.2.tgz", + "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, "license": "MIT", "bin": { "tsgolint": "bin/tsgolint.js" }, "optionalDependencies": { - "@oxlint-tsgolint/darwin-arm64": "0.8.5", - "@oxlint-tsgolint/darwin-x64": "0.8.5", - "@oxlint-tsgolint/linux-arm64": "0.8.5", - "@oxlint-tsgolint/linux-x64": "0.8.5", - "@oxlint-tsgolint/win32-arm64": "0.8.5", - "@oxlint-tsgolint/win32-x64": "0.8.5" + "@oxlint-tsgolint/darwin-arm64": "0.14.2", + "@oxlint-tsgolint/darwin-x64": "0.14.2", + "@oxlint-tsgolint/linux-arm64": "0.14.2", + "@oxlint-tsgolint/linux-x64": "0.14.2", + "@oxlint-tsgolint/win32-arm64": "0.14.2", + "@oxlint-tsgolint/win32-x64": "0.14.2" } }, "node_modules/p-cancelable": { @@ -49915,100 +50136,177 @@ "integrity": "sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==" }, "@oxlint-tsgolint/darwin-arm64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.8.5.tgz", - "integrity": "sha512-6Fmcrk33+PbA8fEeuz8AGD7G3KoGWTJfvCflQD8zgY8AYK8OIs7bh4WUfZiRLVJdZ0PLY6y85J2IbfXy5dTrjQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.14.2.tgz", + "integrity": "sha512-03WxIXguCXf1pTmoG2C6vqRcbrU9GaJCW6uTIiQdIQq4BrJnVWZv99KEUQQRkuHK78lOLa9g7B4K58NcVcB54g==", "dev": true, "optional": true }, "@oxlint-tsgolint/darwin-x64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.8.5.tgz", - "integrity": "sha512-vaB8oNS1gkJYpGq09UfpF62kPew3Ia7WHYQeD9IIOnUHWW1LNyZdNHuB6h99Kn9irMLj/uhbl7HtDzP+Lk4BNg==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.14.2.tgz", + "integrity": "sha512-ksMLl1cIWz3Jw+U79BhyCPdvohZcJ/xAKri5bpT6oeEM2GVnQCHBk/KZKlYrd7hZUTxz0sLnnKHE11XFnLASNQ==", "dev": true, "optional": true }, "@oxlint-tsgolint/linux-arm64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.8.5.tgz", - "integrity": "sha512-avfdBAcvqGacG78I919wMl4Cv3wT/to0u7CwyvFC/8vvIpPq983xmiPjMqFt1m/6ADtvRQfmSMK18C9l8uew7A==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.14.2.tgz", + "integrity": "sha512-2BgR535w7GLxBCyQD5DR3dBzbAgiBbG5QX1kAEVzOmWxJhhGxt5lsHdHebRo7ilukYLpBDkerz0mbMErblghCQ==", "dev": true, "optional": true }, "@oxlint-tsgolint/linux-x64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.8.5.tgz", - "integrity": "sha512-CvUc+0iCLBUKRiIzFIMhPJQpGI1JA29hiFWlLU/qBtf3V/IanxSbcgOm8zaO2/agg0yfS/oHrL/u8SR9xdcIvA==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.14.2.tgz", + "integrity": "sha512-TUHFyVHfbbGtnTQZbUFgwvv3NzXBgzNLKdMUJw06thpiC7u5OW5qdk4yVXIC/xeVvdl3NAqTfcT4sA32aiMubg==", "dev": true, "optional": true }, "@oxlint-tsgolint/win32-arm64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.8.5.tgz", - "integrity": "sha512-2opjh8Vev+Z1dsi0lTYeGeI+Pbm6JgLT2U7l3+t8Ww3d/lhXgxUP9l+nX3ioCQd8auUy198MoWYice3OhjCX1w==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.14.2.tgz", + "integrity": "sha512-OfYHa/irfVggIFEC4TbawsI7Hwrttppv//sO/e00tu4b2QRga7+VHAwtCkSFWSr0+BsO4InRYVA0+pun5BinpQ==", "dev": true, "optional": true }, "@oxlint-tsgolint/win32-x64": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.8.5.tgz", - "integrity": "sha512-HGsTFdQDbXJ6VP9smhQyv3Pi/Vybabad57vT/SH12xYBYaIt1A0YO9ioQN36iYOb+971G9lo+YZjifa3vwDilA==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.14.2.tgz", + "integrity": "sha512-5gxwbWYE2pP+pzrO4SEeYvLk4N609eAe18rVXUx+en3qtHBkU8VM2jBmMcZdIHn+G05leu4pYvwAvw6tvT9VbA==", + "dev": true, + "optional": true + }, + "@oxlint/binding-android-arm-eabi": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.50.0.tgz", + "integrity": "sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==", + "dev": true, + "optional": true + }, + "@oxlint/binding-android-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.50.0.tgz", + "integrity": "sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==", + "dev": true, + "optional": true + }, + "@oxlint/binding-darwin-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.50.0.tgz", + "integrity": "sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==", + "dev": true, + "optional": true + }, + "@oxlint/binding-darwin-x64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.50.0.tgz", + "integrity": "sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==", + "dev": true, + "optional": true + }, + "@oxlint/binding-freebsd-x64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.50.0.tgz", + "integrity": "sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==", "dev": true, "optional": true }, - "@oxlint/darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/darwin-arm64/-/darwin-arm64-1.32.0.tgz", - "integrity": "sha512-yrqPmZYu5Qb+49h0P5EXVIq8VxYkDDM6ZQrWzlh16+UGFcD8HOXs4oF3g9RyfaoAbShLCXooSQsM/Ifwx8E/eQ==", + "@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.50.0.tgz", + "integrity": "sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==", "dev": true, "optional": true }, - "@oxlint/darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/darwin-x64/-/darwin-x64-1.32.0.tgz", - "integrity": "sha512-pQRZrJG/2nAKc3IuocFbaFFbTDlQsjz2WfivRsMn0hw65EEsSuM84WMFMiAfLpTGyTICeUtHZLHlrM5lzVr36A==", + "@oxlint/binding-linux-arm-musleabihf": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.50.0.tgz", + "integrity": "sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==", "dev": true, "optional": true }, - "@oxlint/linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-gnu/-/linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-tyomSmU2DzwcTmbaWFmStHgVfRmJDDvqcIvcw4fRB1YlL2Qg/XaM4NJ0m2bdTap38gxD5FSxSgCo0DkQ8GTolg==", + "@oxlint/binding-linux-arm64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.50.0.tgz", + "integrity": "sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==", "dev": true, "optional": true }, - "@oxlint/linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-musl/-/linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-0W46dRMaf71OGE4+Rd+GHfS1uF/UODl5Mef6871pMhN7opPGfTI2fKJxh9VzRhXeSYXW/Z1EuCq9yCfmIJq+5Q==", + "@oxlint/binding-linux-arm64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.50.0.tgz", + "integrity": "sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==", "dev": true, "optional": true }, - "@oxlint/linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-gnu/-/linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-5+6myVCBOMvM62rDB9T3CARXUvIwhGqte6E+HoKRwYaqsxGUZ4bh3pItSgSFwHjLGPrvADS11qJUkk39eQQBzQ==", + "@oxlint/binding-linux-ppc64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.50.0.tgz", + "integrity": "sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==", "dev": true, "optional": true }, - "@oxlint/linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-musl/-/linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-qwQlwYYgVIC6ScjpUwiKKNyVdUlJckrfwPVpIjC9mvglIQeIjKuuyaDxUZWIOc/rEzeCV/tW6tcbehLkfEzqsw==", + "@oxlint/binding-linux-riscv64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.50.0.tgz", + "integrity": "sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==", "dev": true, "optional": true }, - "@oxlint/win32-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/win32-arm64/-/win32-arm64-1.32.0.tgz", - "integrity": "sha512-7qYZF9CiXGtdv8Z/fBkgB5idD2Zokht67I5DKWH0fZS/2R232sDqW2JpWVkXltk0+9yFvmvJ0ouJgQRl9M3S2g==", + "@oxlint/binding-linux-riscv64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.50.0.tgz", + "integrity": "sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==", "dev": true, "optional": true }, - "@oxlint/win32-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-1.32.0.tgz", - "integrity": "sha512-XW1xqCj34MEGJlHteqasTZ/LmBrwYIgluhNW0aP+XWkn90+stKAq3W/40dvJKbMK9F7o09LPCuMVtUW7FIUuiA==", + "@oxlint/binding-linux-s390x-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.50.0.tgz", + "integrity": "sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==", + "dev": true, + "optional": true + }, + "@oxlint/binding-linux-x64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.50.0.tgz", + "integrity": "sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==", + "dev": true, + "optional": true + }, + "@oxlint/binding-linux-x64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.50.0.tgz", + "integrity": "sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==", + "dev": true, + "optional": true + }, + "@oxlint/binding-openharmony-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.50.0.tgz", + "integrity": "sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==", + "dev": true, + "optional": true + }, + "@oxlint/binding-win32-arm64-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.50.0.tgz", + "integrity": "sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==", + "dev": true, + "optional": true + }, + "@oxlint/binding-win32-ia32-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.50.0.tgz", + "integrity": "sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==", + "dev": true, + "optional": true + }, + "@oxlint/binding-win32-x64-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.50.0.tgz", + "integrity": "sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==", "dev": true, "optional": true }, @@ -62584,33 +62882,44 @@ } }, "oxlint": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.32.0.tgz", - "integrity": "sha512-HYDQCga7flsdyLMUIxTgSnEx5KBxpP9VINB8NgO+UjV80xBiTQXyVsvjtneMT3ZBLMbL0SlG/Dm03XQAsEshMA==", - "dev": true, - "requires": { - "@oxlint/darwin-arm64": "1.32.0", - "@oxlint/darwin-x64": "1.32.0", - "@oxlint/linux-arm64-gnu": "1.32.0", - "@oxlint/linux-arm64-musl": "1.32.0", - "@oxlint/linux-x64-gnu": "1.32.0", - "@oxlint/linux-x64-musl": "1.32.0", - "@oxlint/win32-arm64": "1.32.0", - "@oxlint/win32-x64": "1.32.0" + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.50.0.tgz", + "integrity": "sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==", + "dev": true, + "requires": { + "@oxlint/binding-android-arm-eabi": "1.50.0", + "@oxlint/binding-android-arm64": "1.50.0", + "@oxlint/binding-darwin-arm64": "1.50.0", + "@oxlint/binding-darwin-x64": "1.50.0", + "@oxlint/binding-freebsd-x64": "1.50.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.50.0", + "@oxlint/binding-linux-arm-musleabihf": "1.50.0", + "@oxlint/binding-linux-arm64-gnu": "1.50.0", + "@oxlint/binding-linux-arm64-musl": "1.50.0", + "@oxlint/binding-linux-ppc64-gnu": "1.50.0", + "@oxlint/binding-linux-riscv64-gnu": "1.50.0", + "@oxlint/binding-linux-riscv64-musl": "1.50.0", + "@oxlint/binding-linux-s390x-gnu": "1.50.0", + "@oxlint/binding-linux-x64-gnu": "1.50.0", + "@oxlint/binding-linux-x64-musl": "1.50.0", + "@oxlint/binding-openharmony-arm64": "1.50.0", + "@oxlint/binding-win32-arm64-msvc": "1.50.0", + "@oxlint/binding-win32-ia32-msvc": "1.50.0", + "@oxlint/binding-win32-x64-msvc": "1.50.0" } }, "oxlint-tsgolint": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.8.5.tgz", - "integrity": "sha512-QpUm0kMilACiEQEgPa/APIvCMmVZOtiSne7kK6iLCcJb/5DvQD5ggyrYXkQLbUiEZj6ouV4XSnpvG/BzuPRnYw==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.14.2.tgz", + "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, "requires": { - "@oxlint-tsgolint/darwin-arm64": "0.8.5", - "@oxlint-tsgolint/darwin-x64": "0.8.5", - "@oxlint-tsgolint/linux-arm64": "0.8.5", - "@oxlint-tsgolint/linux-x64": "0.8.5", - "@oxlint-tsgolint/win32-arm64": "0.8.5", - "@oxlint-tsgolint/win32-x64": "0.8.5" + "@oxlint-tsgolint/darwin-arm64": "0.14.2", + "@oxlint-tsgolint/darwin-x64": "0.14.2", + "@oxlint-tsgolint/linux-arm64": "0.14.2", + "@oxlint-tsgolint/linux-x64": "0.14.2", + "@oxlint-tsgolint/win32-arm64": "0.14.2", + "@oxlint-tsgolint/win32-x64": "0.14.2" } }, "p-cancelable": { diff --git a/package.json b/package.json index 9a140e72c1..65b5a31218 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,8 @@ "@vitest/coverage-v8": "4.0.15", "@vitest/runner": "4.0.15", "baseline-browser-mapping": "^2.9.6", - "oxlint": "^1.32.0", - "oxlint-tsgolint": "^0.8.5", + "oxlint": "^1.50.0", + "oxlint-tsgolint": "^0.14.2", "prettier": "^3.5.3", "tsx": "^4.21.0", "turbo": "^2.4.4", From bc9aedf7d372fd09baa4819f5e185c11650c33db Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Wed, 25 Feb 2026 10:28:30 -0500 Subject: [PATCH 102/495] chore(terabugs): fix OOM by not pre-allocating arrays. (#5601) so we don't blow out memory when generating hundreds of millions of issues --- apps/zbugs/scripts/generate-synthetic.ts | 90 ++++++++---------------- 1 file changed, 29 insertions(+), 61 deletions(-) diff --git a/apps/zbugs/scripts/generate-synthetic.ts b/apps/zbugs/scripts/generate-synthetic.ts index 834cb159f6..6f03594420 100644 --- a/apps/zbugs/scripts/generate-synthetic.ts +++ b/apps/zbugs/scripts/generate-synthetic.ts @@ -75,39 +75,29 @@ function seededNanoid(size = 21): string { return id; } -// --- Pareto/Power-law distribution helpers --- -/** - * Assigns numItems to buckets using power-law distribution. - * Lower alpha = more uniform, higher alpha = more skewed. - * Returns array where result[i] = bucket index for item i. - */ -function assignWithPareto( - numItems: number, - numBuckets: number, - alpha = 2, -): Uint32Array { - const result = new Uint32Array(numItems); - for (let i = 0; i < numItems; i++) { - result[i] = Math.floor(Math.pow(rng(), alpha) * numBuckets); +// --- Deterministic per-index helpers (avoid large pre-allocated arrays) --- + +/** Derive a deterministic issue ID for a given index without storing all IDs. */ +function issueIDForIndex(i: number): string { + const idRng = mulberry32(SEED ^ (i * 2654435761)); // Knuth multiplicative hash + let id = ''; + for (let j = 0; j < 21; j++) { + id += NANOID_ALPHABET[Math.floor(idRng() * NANOID_ALPHABET.length)]; } - return result; + return id; } -/** - * Distributes totalItems across numBuckets with Pareto distribution. - * Returns array where result[i] = count for bucket i. - */ -function distributeWithPareto( - numBuckets: number, - totalItems: number, - alpha = 2, -): Uint32Array { - const result = new Uint32Array(numBuckets); - for (let i = 0; i < totalItems; i++) { - const idx = Math.floor(Math.pow(rng(), alpha) * numBuckets); - result[idx]++; - } - return result; +/** Derive the project index for a given issue index (Pareto distribution). */ +function projectForIssue(i: number, numBuckets: number, alpha = 2): number { + const r = mulberry32(SEED ^ ((i + 1) * 2246822519))(); // single draw + return Math.floor(Math.pow(r, alpha) * numBuckets); +} + +/** Derive the comment count for a given issue index (exponential distribution matching mean). */ +function commentsForIssue(i: number, mean: number): number { + const r = mulberry32(SEED ^ ((i + 2) * 3266489917))(); // single draw + // Exponential distribution: -mean * ln(1 - r), floored + return Math.floor(-mean * Math.log(1 - r * 0.9999)); } // --- Template types --- @@ -564,20 +554,6 @@ async function main() { } await labelWriter.close(); - // --- Pre-compute distributions --- - // oxlint-disable-next-line no-console - console.log('\nPre-computing distributions...'); - - // Assign issues to projects using Pareto distribution (some projects get many more issues) - const issueProjects = assignWithPareto(NUM_ISSUES, allProjects.length, 2); - - // Distribute comments across issues using Pareto distribution (some issues get many comments) - const totalComments = Math.floor(NUM_ISSUES * COMMENTS_PER_ISSUE); - const commentsPerIssue = distributeWithPareto(NUM_ISSUES, totalComments, 2); - - // Calculate total issueLabels (average LABELS_PER_ISSUE per issue) - const totalIssueLabels = Math.floor(NUM_ISSUES * LABELS_PER_ISSUE); - // --- Generate issues --- // oxlint-disable-next-line no-console console.log(`\nGenerating ${NUM_ISSUES.toLocaleString()} issues...`); @@ -597,12 +573,6 @@ async function main() { endDate.getDate(), ); - // Pre-generate all issue IDs so comments and labels can reference them - const issueIDs = new Array(NUM_ISSUES); - for (let i = 0; i < NUM_ISSUES; i++) { - issueIDs[i] = seededNanoid(); - } - for (let i = 0; i < NUM_ISSUES; i++) { if (i % 100000 === 0) { // oxlint-disable-next-line no-console @@ -611,8 +581,8 @@ async function main() { ); } - const issueID = issueIDs[i]; - const projectIdx = issueProjects[i]; + const issueID = issueIDForIndex(i); + const projectIdx = projectForIssue(i, allProjects.length, 2); const project = allProjects[projectIdx]; const cat = categories[project.categoryIndex]; @@ -662,9 +632,7 @@ async function main() { // --- Generate comments --- // oxlint-disable-next-line no-console - console.log( - `\nGenerating ${totalComments.toLocaleString()} comments (avg ${COMMENTS_PER_ISSUE} per issue)...`, - ); + console.log(`\nGenerating comments (avg ${COMMENTS_PER_ISSUE} per issue)...`); const commentWriter = new ShardedCSVWriter( OUTPUT_DIR, @@ -682,12 +650,12 @@ async function main() { ); } - const issueID = issueIDs[issueIdx]; - const projectIdx = issueProjects[issueIdx]; + const issueID = issueIDForIndex(issueIdx); + const projectIdx = projectForIssue(issueIdx, allProjects.length, 2); const project = allProjects[projectIdx]; const cat = categories[project.categoryIndex]; - const numComments = commentsPerIssue[issueIdx]; + const numComments = commentsForIssue(issueIdx, COMMENTS_PER_ISSUE); // Issue created timestamp (use faker for realistic spread) const issueCreated = faker.date @@ -723,7 +691,7 @@ async function main() { // --- Generate issueLabels --- // oxlint-disable-next-line no-console console.log( - `\nGenerating ~${totalIssueLabels.toLocaleString()} issueLabels (avg ${LABELS_PER_ISSUE} per issue)...`, + `\nGenerating issueLabels (avg ${LABELS_PER_ISSUE} per issue)...`, ); const issueLabelWriter = new ShardedCSVWriter( @@ -742,8 +710,8 @@ async function main() { ); } - const issueID = issueIDs[issueIdx]; - const projectIdx = issueProjects[issueIdx]; + const issueID = issueIDForIndex(issueIdx); + const projectIdx = projectForIssue(issueIdx, allProjects.length, 2); const project = allProjects[projectIdx]; // Uniform distribution: 1-3 labels per issue (or fewer if project has fewer labels) From 69fcba89c6fe917a2b980830c436497df7dc6412 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 25 Feb 2026 10:04:13 -0800 Subject: [PATCH 103/495] chore(zero-cache): test non-publication acks (#5615) Add a more comprehensive test for non-publication ACKs (#5602) --- .../change-source/pg/change-source.pg.test.ts | 87 ++++++++++++++++++- 1 file changed, 83 insertions(+), 4 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index ab1ff40b36..01e5f4a261 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -87,6 +87,8 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { CREATE UNIQUE INDEX bar_idx ON my.bar (a); ALTER TABLE my.bar REPLICA IDENTITY USING INDEX bar_idx; + CREATE TABLE not_in_publication(a INT PRIMARY KEY); + CREATE PUBLICATION zero_zero FOR TABLES IN SCHEMA my; `); @@ -129,6 +131,19 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { ); } + async function getConfirmedFlushLSN(): Promise { + const [{confirmed}] = await upstream<{confirmed: string}[]> /*sql*/ ` + SELECT confirmed_flush_lsn as confirmed FROM pg_replication_slots + WHERE slot_name = ${replicationSlot}`; + return toBigInt(confirmed); + } + + async function getCurrentLSN(): Promise { + const [{lsn}] = await upstream<{lsn: string}[]> /*sql*/ ` + SELECT pg_current_wal_lsn() as lsn`; + return toBigInt(lsn); + } + async function startReplication() { ({changeSource: source} = await initializePostgresChangeSource( lc, @@ -359,12 +374,9 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { // Verify that the ACK stored with the replication slot includes // the first commit but not the second. - const [{confirmed}] = await upstream<{confirmed: string}[]>` - SELECT confirmed_flush_lsn as confirmed FROM pg_replication_slots - WHERE slot_name = ${replicationSlot}`; const min = majorVersionFromString(commit1[2].watermark); const max = majorVersionFromString(begin2[2].commitWatermark); - const actual = toBigInt(confirmed); + const actual = await getConfirmedFlushLSN(); expect(actual).toBeGreaterThanOrEqual(min); expect(actual).toBeLessThan(max); }); @@ -418,6 +430,73 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { acks.push(['status', {ack: true}, commit1[2]]); }); + test.each([ + [withTriggers], + [withoutTriggers], + [replicaIdentityFullWithTriggers], + [replicaIdentityFullWithoutTriggers], + ])('automatic acks for non-publication LSN advancement', async init => { + await init(); + const {replicaVersion} = getSubscriptionState( + new StatementRunner(replicaDbFile.connect(lc)), + ); + + const {changes, acks} = await startStream('00'); + const downstream = drainToQueue(changes); + + await upstream`INSERT INTO my.boo (a) VALUES ('b')`; + + const begin = (await downstream.dequeue()) as Begin; + expect(begin).toMatchObject([ + 'begin', + {tag: 'begin'}, + {commitWatermark: expect.stringMatching(WATERMARK_REGEX)}, + ]); + expect(begin[2].commitWatermark > replicaVersion).toBe(true); + expect(await downstream.dequeue()).toMatchObject([ + 'data', + { + tag: 'insert', + new: {a: 'b'}, + }, + ]); + const commit = (await downstream.dequeue()) as Commit; + expect(commit).toMatchObject([ + 'commit', + {tag: 'commit'}, + {watermark: begin[2].commitWatermark}, + ]); + + // Advance the WAL with non-publication entries. + await upstream`INSERT INTO not_in_publication(a) + VALUES (1), (2), (3), (4), (5)`; + + // Until the ack is sent, the confirmed_flush_lsn should not reflect + // the received transaction. + expect(await getConfirmedFlushLSN()).toBeLessThan( + majorVersionFromString(commit[2].watermark), + ); + + // Once the ack is sent, the slot should advance. + acks.push(['status', {ack: true}, commit[2]]); + await vi.waitFor(async () => { + expect(await getConfirmedFlushLSN()).toBeGreaterThanOrEqual( + majorVersionFromString(commit[2].watermark), + ); + }); + + // Advance the WAL with non-publication entries again. + await upstream`INSERT INTO not_in_publication(a) + VALUES (6), (7), (8), (9), (10)`; + + // This time these should be automatically ack'ed since the + // slot is caught up with the publication. + const newLSN = await getCurrentLSN(); + await vi.waitFor(async () => { + expect(await getConfirmedFlushLSN()).toBeGreaterThanOrEqual(newLSN); + }); + }); + test.each([ [withTriggers], [withoutTriggers], From 7ed0acf0c1d1d7fd5c20d70cb2af7012948c556b Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 25 Feb 2026 11:40:45 -0800 Subject: [PATCH 104/495] fix(zero-cache): fix occasional server crash when pg goes down (#5618) Fix a server crash when PG happens to go down when the change log is being purged. This previously manifested as an uncaught database or connection error. Alert: * https://rocicorp.slack.com/archives/C0ABMK92H47/p1770754386291819 --- .../services/change-streamer/change-streamer-service.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 6e754786b6..8225247beb 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -497,6 +497,11 @@ class ChangeStreamerImpl implements ChangeStreamerService { }; } + /** + * Makes a best effort to purge the change log. In the event of a database + * error, exceptions will be logged and swallowed, so this method is safe + * to run in a timeout. + */ async #purgeOldChanges(): Promise { const initial = [...this.#initialWatermarks]; if (initial.length === 0) { @@ -522,6 +527,8 @@ class ChangeStreamerImpl implements ChangeStreamerService { this.#lc.info?.(`Purged ${deleted} changes before ${earliestInitial}`); this.#initialWatermarks.delete(earliestInitial); } + } catch (e) { + this.#lc.warn?.(`error purging change log`, e); } finally { if (this.#initialWatermarks.size) { // If there are unpurged watermarks to check, schedule the next purge. From 441c5139bb1fa185319236f9a3133c622a20f179 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 25 Feb 2026 11:50:28 -0800 Subject: [PATCH 105/495] chore(zero-cache): decrease replication-identity timeout interval (#5617) Decrease the setting of the REPLICA IDENTITY for tables with no primary key (but with a usable index) from 500ms to 50ms. (The timeout is arbitrary and merely intended to finish processing all schema changes in the transaction). This eliminates the flakiness in the integration test due to unhandled rejections coming from the pg client when it internally queries array types. Reenable integration tests in the CI. --- .../src/integration/integration.pg.test.ts | 20 +------------------ .../change-source/pg/change-source.ts | 2 +- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/packages/zero-cache/src/integration/integration.pg.test.ts b/packages/zero-cache/src/integration/integration.pg.test.ts index f1c6dd6c76..7eecfaa6f7 100644 --- a/packages/zero-cache/src/integration/integration.pg.test.ts +++ b/packages/zero-cache/src/integration/integration.pg.test.ts @@ -649,25 +649,7 @@ describe('integration', {timeout: 30000}, () => { ], ] satisfies [string, 'pg' | 'custom', () => Envs, 'FULL' | undefined][])( '%s (%s)', - async ([_name, backend, makeEnvs, replicaIdentity], {skip}) => { - if (process.env.CI) { - // TODO: Track down this unhandled rejection that regularly happens - // when the test pg instances are shut down, particularly when - // running the test with concurrently pg versions. - // Then re-enable the test in the CI. - // - // ----⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ - // PostgresError: terminating connection due to administrator command - // ❯ ErrorResponse node_modules/postgres/src/connection.js:794:26 - // ❯ handle node_modules/postgres/src/connection.js:480:6 - // ❯ Socket.data node_modules/postgres/src/connection.js:315:9 - // ❯ Socket.emit node:events:508:28 - // ❯ addChunk node:internal/streams/readable:559:12 - // ❯ readableAddChunkPushByteMode node:internal/streams/readable:510:3 - // ❯ Socket.Readable.push node:internal/streams/readable:390:5 - // ❯ TCP.onStreamRead node:internal/stream_base_commons:189:23 - skip(); - } + async ([_name, backend, makeEnvs, replicaIdentity]) => { if (backend === 'pg') { await upDB.unsafe(initialPGSetup(replicaIdentity)); } diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 62b29a9932..95f326943f 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -612,7 +612,7 @@ type ReplicationError = { lastLogTime: number; }; -const SET_REPLICA_IDENTITY_DELAY_MS = 500; +const SET_REPLICA_IDENTITY_DELAY_MS = 50; class ChangeMaker { readonly #lc: LogContext; From cc7147bb29099e44eb5548c9d1f3ceb05f7b6df6 Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Wed, 25 Feb 2026 16:57:29 -0700 Subject: [PATCH 106/495] Revert "feat(zql): make applyChange immutable for React.memo optimization (#5462)" (#5616) This reverts commit a40a69b26abf4a0e99c4dc80a5cea50b31e7eb27. Per regressions were discovered. We will work to fix those and reland this with better benchmarks for confidence. https://rocicorp.slack.com/archives/C0A8NUDMDM1/p1771983306782649?thread_ts=1771969137.598129&cid=C0A8NUDMDM1 --- package-lock.json | 22 + packages/zero-react/src/use-query.tsx | 8 +- packages/zero-react/src/use-rows.test.tsx | 128 +- .../src/use-zero-virtualizer.test.tsx | 36 +- packages/zero-solid/src/solid-view.test.ts | 7 +- packages/zero-solid/src/solid-view.ts | 44 +- packages/zql/src/ivm/array-view.test.ts | 207 +-- packages/zql/src/ivm/array-view.ts | 97 +- .../zql/src/ivm/test/fetch-and-push-tests.ts | 24 +- .../zql/src/ivm/view-apply-change.test.ts | 1339 +---------------- packages/zql/src/ivm/view-apply-change.ts | 729 ++------- packages/zql/src/query/query-delegate-base.ts | 4 +- .../zql/src/query/query-impl.query.test.ts | 2 +- tsconfig.json | 2 +- 14 files changed, 327 insertions(+), 2322 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9f65f931c..ffd5fe1f6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26166,6 +26166,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26187,6 +26188,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26208,6 +26210,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26229,6 +26232,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26250,6 +26254,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26271,6 +26276,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26292,6 +26298,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26313,6 +26320,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26334,6 +26342,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26355,6 +26364,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26376,6 +26386,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -60541,6 +60552,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "dev": true, "optional": true, "peer": true }, @@ -60548,6 +60560,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "dev": true, "optional": true, "peer": true }, @@ -60555,6 +60568,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "dev": true, "optional": true, "peer": true }, @@ -60562,6 +60576,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "dev": true, "optional": true, "peer": true }, @@ -60569,6 +60584,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "dev": true, "optional": true, "peer": true }, @@ -60576,6 +60592,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "dev": true, "optional": true, "peer": true }, @@ -60583,6 +60600,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "dev": true, "optional": true, "peer": true }, @@ -60590,6 +60608,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "dev": true, "optional": true, "peer": true }, @@ -60597,6 +60616,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "dev": true, "optional": true, "peer": true }, @@ -60604,6 +60624,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "dev": true, "optional": true, "peer": true }, @@ -60611,6 +60632,7 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "dev": true, "optional": true, "peer": true }, diff --git a/packages/zero-react/src/use-query.tsx b/packages/zero-react/src/use-query.tsx index 790cd14768..95f8a85719 100644 --- a/packages/zero-react/src/use-query.tsx +++ b/packages/zero-react/src/use-query.tsx @@ -4,6 +4,7 @@ import { type Immutable, addContextToQuery, asQueryInternals, + deepClone, DEFAULT_TTL_MS, } from './bindings.ts'; import {useZero} from './zero-provider.tsx'; @@ -538,9 +539,10 @@ class ViewWrapper< resultType: ResultType, error?: ErroredQuery, ) => { - // applyChange now returns immutable data structures, so no deep clone needed. - // Unchanged rows preserve their object identity for React.memo optimization. - const data = snap as HumanReadable; + const data = + snap === undefined + ? snap + : (deepClone(snap as ReadonlyJSONValue) as HumanReadable); this.#snapshot = getSnapshot( this.#singular, data, diff --git a/packages/zero-react/src/use-rows.test.tsx b/packages/zero-react/src/use-rows.test.tsx index 80dd7f4419..789923c7ec 100644 --- a/packages/zero-react/src/use-rows.test.tsx +++ b/packages/zero-react/src/use-rows.test.tsx @@ -219,40 +219,30 @@ describe('useRows', () => { expect(result.current.permalinkNotFound).toBe(false); // Check the anchor item (ID 500 = "Item 0500") - expect(result.current.rowAt(500)).toEqual( - expect.objectContaining({ - id: '500', - name: 'Item 0500', - }), - ); + expect(result.current.rowAt(500)).toEqual({ + id: '500', + name: 'Item 0500', + }); // Check items before - expect(result.current.rowAt(495)).toEqual( - expect.objectContaining({ - id: '495', - name: 'Item 0495', - }), - ); - expect(result.current.rowAt(499)).toEqual( - expect.objectContaining({ - id: '499', - name: 'Item 0499', - }), - ); + expect(result.current.rowAt(495)).toEqual({ + id: '495', + name: 'Item 0495', + }); + expect(result.current.rowAt(499)).toEqual({ + id: '499', + name: 'Item 0499', + }); // Check items after - expect(result.current.rowAt(501)).toEqual( - expect.objectContaining({ - id: '501', - name: 'Item 0501', - }), - ); - expect(result.current.rowAt(504)).toEqual( - expect.objectContaining({ - id: '504', - name: 'Item 0504', - }), - ); + expect(result.current.rowAt(501)).toEqual({ + id: '501', + name: 'Item 0501', + }); + expect(result.current.rowAt(504)).toEqual({ + id: '504', + name: 'Item 0504', + }); // Out of range should be undefined expect(result.current.rowAt(494)).toBeUndefined(); @@ -278,18 +268,10 @@ describe('useRows', () => { expect(result.current.atStart).toBe(true); expect(result.current.atEnd).toBe(false); - expect(result.current.rowAt(0)).toEqual( - expect.objectContaining({id: '1', name: 'Item 0001'}), - ); - expect(result.current.rowAt(1)).toEqual( - expect.objectContaining({id: '2', name: 'Item 0002'}), - ); - expect(result.current.rowAt(2)).toEqual( - expect.objectContaining({id: '3', name: 'Item 0003'}), - ); - expect(result.current.rowAt(6)).toEqual( - expect.objectContaining({id: '7', name: 'Item 0007'}), - ); + expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); + expect(result.current.rowAt(1)).toEqual({id: '2', name: 'Item 0002'}); + expect(result.current.rowAt(2)).toEqual({id: '3', name: 'Item 0003'}); + expect(result.current.rowAt(6)).toEqual({id: '7', name: 'Item 0007'}); }); test('permalink anchor - item near end', async () => { @@ -311,24 +293,18 @@ describe('useRows', () => { expect(result.current.atStart).toBe(false); expect(result.current.atEnd).toBe(true); - expect(result.current.rowAt(992)).toEqual( - expect.objectContaining({ - id: '993', - name: 'Item 0993', - }), - ); - expect(result.current.rowAt(997)).toEqual( - expect.objectContaining({ - id: '998', - name: 'Item 0998', - }), - ); - expect(result.current.rowAt(999)).toEqual( - expect.objectContaining({ - id: '1000', - name: 'Item 1000', - }), - ); + expect(result.current.rowAt(992)).toEqual({ + id: '993', + name: 'Item 0993', + }); + expect(result.current.rowAt(997)).toEqual({ + id: '998', + name: 'Item 0998', + }); + expect(result.current.rowAt(999)).toEqual({ + id: '1000', + name: 'Item 1000', + }); }); test('permalink anchor - item not found', async () => { @@ -380,26 +356,18 @@ describe('useRows', () => { // Verify the new items are included and properly sorted expect(result.current.rowsLength).toBe(10); - expect(result.current.rowAt(0)).toEqual( - expect.objectContaining({ - id: '1001', - name: 'Item 0000', - }), - ); - expect(result.current.rowAt(1)).toEqual( - expect.objectContaining({ - id: '1002', - name: 'Item 00005', - }), - ); - expect(result.current.rowAt(2)).toEqual( - expect.objectContaining({id: '1', name: 'Item 0001'}), - ); + expect(result.current.rowAt(0)).toEqual({ + id: '1001', + name: 'Item 0000', + }); + expect(result.current.rowAt(1)).toEqual({ + id: '1002', + name: 'Item 00005', + }); + expect(result.current.rowAt(2)).toEqual({id: '1', name: 'Item 0001'}); // Original items shifted down - item 10 and 9 should be pushed out - expect(result.current.rowAt(9)).toEqual( - expect.objectContaining({id: '8', name: 'Item 0008'}), - ); + expect(result.current.rowAt(9)).toEqual({id: '8', name: 'Item 0008'}); expect(result.current.rowAt(10)).toBeUndefined(); }); @@ -459,9 +427,7 @@ describe('useRows', () => { // Verify the permalink item is centered expect(result.current.permalinkNotFound).toBe(false); - expect(result.current.rowAt(500)).toEqual( - expect.objectContaining({id: '501', name: 'Item 0501'}), - ); + expect(result.current.rowAt(500)).toEqual({id: '501', name: 'Item 0501'}); const initialFirstIndex = result.current.firstRowIndex; diff --git a/packages/zero-react/src/use-zero-virtualizer.test.tsx b/packages/zero-react/src/use-zero-virtualizer.test.tsx index d65d4e2007..d6b51cf996 100644 --- a/packages/zero-react/src/use-zero-virtualizer.test.tsx +++ b/packages/zero-react/src/use-zero-virtualizer.test.tsx @@ -187,9 +187,7 @@ describe('useZeroVirtualizer', () => { expect(result.current.estimatedTotal).toBeGreaterThan(0); // Verify we can access rows - expect(result.current.rowAt(0)).toEqual( - expect.objectContaining({id: '1', name: 'Item 0001'}), - ); + expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); }); test('permalink loading', async () => { @@ -407,15 +405,9 @@ describe('useZeroVirtualizer', () => { }); // Test rowAt function - expect(result.current.rowAt(0)).toEqual( - expect.objectContaining({id: '1', name: 'Item 0001'}), - ); - expect(result.current.rowAt(1)).toEqual( - expect.objectContaining({id: '2', name: 'Item 0002'}), - ); - expect(result.current.rowAt(99)).toEqual( - expect.objectContaining({id: '100', name: 'Item 0100'}), - ); + expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); + expect(result.current.rowAt(1)).toEqual({id: '2', name: 'Item 0002'}); + expect(result.current.rowAt(99)).toEqual({id: '100', name: 'Item 0100'}); // Out of range should be undefined expect(result.current.rowAt(10000)).toBeUndefined(); @@ -1221,12 +1213,10 @@ describe('useZeroVirtualizer', () => { }); // Verify getRowKey receives the correct row data (first row) - expect(getRowKey.mock.calls[0][0]).toEqual( - expect.objectContaining({ - id: '1', - name: 'Item 0001', - }), - ); + expect(getRowKey.mock.calls[0][0]).toEqual({ + id: '1', + name: 'Item 0001', + }); }); test('falls back to index for unloaded rows when using getRowKey', async () => { @@ -1429,12 +1419,10 @@ describe('useZeroVirtualizer', () => { // Get the first call and verify it received a proper Item const firstCall = getRowKey.mock.calls[0]; expect(firstCall).toBeDefined(); - expect(firstCall[0]).toEqual( - expect.objectContaining({ - id: '1', - name: 'Item 0001', - }), - ); + expect(firstCall[0]).toEqual({ + id: '1', + name: 'Item 0001', + }); }); test('getRowKey can return different key types (string, number)', async () => { diff --git a/packages/zero-solid/src/solid-view.test.ts b/packages/zero-solid/src/solid-view.test.ts index cb6e6ac92e..700e12e6f3 100644 --- a/packages/zero-solid/src/solid-view.test.ts +++ b/packages/zero-solid/src/solid-view.test.ts @@ -1546,12 +1546,7 @@ test('edit trigger reactivity at the column level', () => { ]; expect(data()).toEqual(data2); expect(row0Log).toEqual([]); - // PK change (a: 2→3) means idSymbol changes ('2'→'3'). - // reconcile treats different keys as remove+add (correct: different PK = different entity). - // row1Log sees the "new" row because the old row object was replaced. - expect(row1Log).toEqual([ - {a: 3, b: 'b3', [refCountSymbol]: 1, [idSymbol]: '3'}, - ]); + expect(row1Log).toEqual([]); expect(row0ALog).toEqual([]); expect(row0BLog).toEqual([]); expect(row1ALog).toEqual([3]); diff --git a/packages/zero-solid/src/solid-view.ts b/packages/zero-solid/src/solid-view.ts index b7537faea3..c2624871a8 100644 --- a/packages/zero-solid/src/solid-view.ts +++ b/packages/zero-solid/src/solid-view.ts @@ -28,48 +28,6 @@ export type State = [Entry, QueryResultDetails]; export const COMPLETE: QueryResultDetails = Object.freeze({type: 'complete'}); export const UNKNOWN: QueryResultDetails = Object.freeze({type: 'unknown'}); -/** - * SolidView bridges Zero's incremental view updates with Solid's reactive - * store. - * - * The challenge: Zero pushes individual row changes (add/remove/edit) as they - * arrive, but updating Solid's store on each push is expensive. We batch - * changes until transaction commit, then apply them all at once. - * - * Two code paths optimize for different scenarios: - * - * 1. BULK INSERT (builderRoot path): When building from empty, we skip - * Solid's reactive tracking entirely and build a plain JS object. This is - * 5x faster for large initial loads. Uses reconcile() to diff the final - * result into Solid. - * - * 2. INCREMENTAL UPDATE (#pendingChanges path): For existing views, we queue - * changes and apply them in-place within a produce() draft. produce() - * creates a mutable draft, applyChange mutates it directly, then produce() - * handles diffing and reactivity. - * - * - * push(change) - * │ - * ▼ - * ┌─────────────────────────────────┐ - * │ builderRoot defined? │ - * │ (building from empty) │ - * └─────────────────────────────────┘ - * │yes │no - * ▼ ▼ - * Build plain JS Queue in - * object (fast) #pendingChanges - * │ │ - * └───────┬───────────┘ - * ▼ - * onTransactionCommit() - * │ - * ┌───────┴──────────┐ - * │ │ - * builderRoot produce(draft => - * → reconcile() applyChange(draft, ..., mutate: true)) - */ export class SolidView implements Output { readonly #input: Input; readonly #format: Format; @@ -178,6 +136,7 @@ export class SolidView implements Output { key: idSymbol as unknown as string, }), ); + this.#setState(prev => [builderRoot, prev[1]]); this.#builderRoot = undefined; } } else { @@ -233,7 +192,6 @@ export class SolidView implements Output { '', this.#format, true /* withIDs */, - true /* mutate */, ); } diff --git a/packages/zql/src/ivm/array-view.test.ts b/packages/zql/src/ivm/array-view.test.ts index e2fe134794..e92dbf9ac5 100644 --- a/packages/zql/src/ivm/array-view.test.ts +++ b/packages/zql/src/ivm/array-view.test.ts @@ -12,10 +12,10 @@ import {Join} from './join.ts'; import {MemoryStorage} from './memory-storage.ts'; import type {Input} from './operator.ts'; import type {SourceSchema} from './schema.ts'; -import {consume} from './stream.ts'; import {Take} from './take.ts'; import {createSource} from './test/source-factory.ts'; import {refCountSymbol} from './view-apply-change.ts'; +import {consume} from './stream.ts'; const lc = createSilentLogContext(); @@ -111,13 +111,12 @@ test('basics', () => { view.flush(); expect(callCount).toBe(3); expect(view.data).toEqual([]); - // With immutability, old captured data reference is unchanged. - // The listener was unsubscribed, so no new data was captured. + // The data remains but the rc gets updated. expect(data).toEqual([ { a: 3, b: 'c', - [refCountSymbol]: 1, + [refCountSymbol]: 0, }, ]); }); @@ -154,25 +153,22 @@ test('single-format', () => { // trying to add another element should be an error // pipeline should have been configured with a limit of one - // With batched change application, the error is thrown when changes are applied - // (at flush() or .data access), not at push() time. - consume(ms.push({row: {a: 2, b: 'b'}, type: 'add'})); - expect(() => view.flush()).toThrow( + expect(() => consume(ms.push({row: {a: 2, b: 'b'}, type: 'add'}))).toThrow( "Singular relationship '' should not have multiple rows. You may need to declare this relationship with the `many` helper instead of the `one` helper in your schema.", ); // Adding the same element is not an error in the ArrayView but it is an error // in the Source. This case is tested in view-apply-change.ts. - // Note: After the failed flush, the pending change is still there. Let's verify - // that accessing .data also throws (auto-flush safety net). - expect(() => view.data).toThrow( - "Singular relationship '' should not have multiple rows. You may need to declare this relationship with the `many` helper instead of the `one` helper in your schema.", - ); + consume(ms.push({row: {a: 1, b: 'a'}, type: 'remove'})); - // The listener's data is still the old value since the flush failed + // no call until flush expect(data).toEqual({a: 1, b: 'a'}); expect(callCount).toBe(1); + view.flush(); + + expect(data).toEqual(undefined); + expect(callCount).toBe(2); unlisten(); }); @@ -2043,189 +2039,6 @@ test('listeners added after error still receive error state', async () => { expect(receivedError).toEqual(testError); }); -test('O(N + K) batching: multiple changes applied efficiently', () => { - // This test verifies that K changes are buffered and applied in one batch, - // achieving O(N + K) complexity instead of O(K × N). - const ms = createSource( - lc, - testLogConfig, - 'table', - {a: {type: 'number'}, b: {type: 'string'}}, - ['a'], - ); - - // Create initial array of N=10 items - for (let i = 0; i < 10; i++) { - consume(ms.push({row: {a: i * 10, b: `item-${i}`}, type: 'add'})); - } - - const view = new ArrayView( - ms.connect([['a', 'asc']]), - {singular: false, relationships: {}}, - true, - () => {}, - ); - - let callCount = 0; - let data: ReadonlyJSONValue[] = []; - view.addListener(entries => { - ++callCount; - assertArray(entries); - // Capture references to verify identity preservation - data = [...entries] as ReadonlyJSONValue[]; - }); - - // Initial hydration: 10 items - expect(data.length).toBe(10); - expect(callCount).toBe(1); - - // Store references to original items for identity comparison - const originalItems = [...data]; - - // Push K=5 changes WITHOUT calling flush (they should be buffered) - consume(ms.push({row: {a: 15, b: 'new-1'}, type: 'add'})); - consume(ms.push({row: {a: 25, b: 'new-2'}, type: 'add'})); - consume(ms.push({row: {a: 35, b: 'new-3'}, type: 'add'})); - consume(ms.push({row: {a: 45, b: 'new-4'}, type: 'add'})); - consume(ms.push({row: {a: 55, b: 'new-5'}, type: 'add'})); - - // Listener should NOT have been called yet (changes are buffered) - expect(callCount).toBe(1); - - // Now flush: all 5 changes should be applied in one batch - view.flush(); - - // Listener should be called exactly once for the batch - expect(callCount).toBe(2); - - // Verify all 15 items are present (10 original + 5 new) - expect(data.length).toBe(15); - - // Verify the data is correctly sorted (by 'a' ascending) - const sortedA = data.map(d => (d as {a: number}).a); - expect(sortedA).toEqual([ - 0, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 90, - ]); - - // Verify UNCHANGED items preserve reference identity - // Original items at indices 0, 1 (a=0, a=10) should still be the same references - // (Items at a=0 and a=10 are before all insertions, so their array indices don't change) - expect(data[0]).toBe(originalItems[0]); // a=0 - expect(data[1]).toBe(originalItems[1]); // a=10 - - // Items that were shifted should still have the same object identity - // (immutable updates preserve identity for unchanged rows) - // Original item with a=20 (was at index 2, now at index 3) - expect(data[3]).toBe(originalItems[2]); // a=20 - // Original item with a=30 (was at index 3, now at index 5) - expect(data[5]).toBe(originalItems[3]); // a=30 -}); - -test('O(N + K) batching: auto-flush in .data getter', () => { - // This test verifies the auto-flush safety net: accessing .data should - // apply any pending changes, ensuring backwards compatibility. - const ms = createSource( - lc, - testLogConfig, - 'table', - {a: {type: 'number'}, b: {type: 'string'}}, - ['a'], - ); - - consume(ms.push({row: {a: 1, b: 'a'}, type: 'add'})); - consume(ms.push({row: {a: 2, b: 'b'}, type: 'add'})); - - const view = new ArrayView( - ms.connect([['a', 'asc']]), - {singular: false, relationships: {}}, - true, - () => {}, - ); - - // Don't add a listener, just use .data directly - expect(view.data).toEqual([ - {a: 1, b: 'a', [refCountSymbol]: 1}, - {a: 2, b: 'b', [refCountSymbol]: 1}, - ]); - - // Push changes WITHOUT calling flush - consume(ms.push({row: {a: 3, b: 'c'}, type: 'add'})); - consume(ms.push({row: {a: 4, b: 'd'}, type: 'add'})); - - // Accessing .data should auto-flush and show the new data - // (This is the backwards compatibility safety net) - expect(view.data).toEqual([ - {a: 1, b: 'a', [refCountSymbol]: 1}, - {a: 2, b: 'b', [refCountSymbol]: 1}, - {a: 3, b: 'c', [refCountSymbol]: 1}, - {a: 4, b: 'd', [refCountSymbol]: 1}, - ]); -}); - -test('O(N + K) batching: listener called once per flush with all changes', () => { - // This test verifies that multiple pushes before flush result in - // a single listener notification with the final state. - const ms = createSource( - lc, - testLogConfig, - 'table', - {a: {type: 'number'}, b: {type: 'string'}}, - ['a'], - ); - - consume(ms.push({row: {a: 1, b: 'initial'}, type: 'add'})); - - const view = new ArrayView( - ms.connect([['a', 'asc']]), - {singular: false, relationships: {}}, - true, - () => {}, - ); - - const snapshots: ReadonlyJSONValue[][] = []; - view.addListener(entries => { - assertArray(entries); - // Store a snapshot of the data at each listener call - snapshots.push([...entries] as ReadonlyJSONValue[]); - }); - - // Initial hydration - expect(snapshots.length).toBe(1); - expect(snapshots[0].length).toBe(1); - - // Push 3 changes - consume(ms.push({row: {a: 2, b: 'second'}, type: 'add'})); - consume(ms.push({row: {a: 3, b: 'third'}, type: 'add'})); - consume(ms.push({row: {a: 4, b: 'fourth'}, type: 'add'})); - - // Still only 1 snapshot (changes are buffered) - expect(snapshots.length).toBe(1); - - // Flush - view.flush(); - - // Now we should have 2 snapshots total - expect(snapshots.length).toBe(2); - - // The second snapshot should have ALL 4 items (not intermediate states) - expect(snapshots[1].length).toBe(4); - expect(snapshots[1].map(d => (d as {a: number}).a)).toEqual([1, 2, 3, 4]); - - // Do another batch of changes - consume(ms.push({row: {a: 5, b: 'fifth'}, type: 'add'})); - consume(ms.push({row: {a: 6, b: 'sixth'}, type: 'add'})); - - // Still only 2 snapshots - expect(snapshots.length).toBe(2); - - // Flush again - view.flush(); - - // Now 3 snapshots - expect(snapshots.length).toBe(3); - expect(snapshots[2].length).toBe(6); -}); - test('error state persists through flush operations', async () => { const ms = createSource( lc, diff --git a/packages/zql/src/ivm/array-view.ts b/packages/zql/src/ivm/array-view.ts index ac5d9dae4a..ecdebf61f7 100644 --- a/packages/zql/src/ivm/array-view.ts +++ b/packages/zql/src/ivm/array-view.ts @@ -1,60 +1,15 @@ import {assert} from '../../../shared/src/asserts.ts'; import type {Immutable} from '../../../shared/src/immutable.ts'; -import {mapValues} from '../../../shared/src/objects.ts'; import {emptyArray} from '../../../shared/src/sentinels.ts'; import type {ErroredQuery} from '../../../zero-protocol/src/custom-queries.ts'; import type {TTL} from '../query/ttl.ts'; import type {Listener, ResultType, TypedView} from '../query/typed-view.ts'; import type {Change} from './change.ts'; -import type {Node} from './data.ts'; import {skipYields, type Input, type Output} from './operator.ts'; import type {SourceSchema} from './schema.ts'; -import { - applyChanges, - type ExpandedNode, - type ViewChange, -} from './view-apply-change.ts'; +import {applyChange} from './view-apply-change.ts'; import type {Entry, Format, View} from './view.ts'; -/** - * Eagerly expand a Node's lazy relationship generators into arrays. - * This captures the current state of the source at the moment of expansion. - */ -function expandNode(node: Node): ExpandedNode { - return { - row: node.row, - relationships: mapValues(node.relationships, v => - Array.from(skipYields(v()), expandNode), - ), - }; -} - -/** - * Expand a Change by eagerly evaluating all lazy relationship generators. - */ -function expandChange(change: Change): ViewChange { - switch (change.type) { - case 'add': - case 'remove': - return {type: change.type, node: expandNode(change.node)}; - case 'edit': - return { - type: 'edit', - node: expandNode(change.node), - oldNode: expandNode(change.oldNode), - }; - case 'child': - return { - type: 'child', - node: expandNode(change.node), - child: { - relationshipName: change.child.relationshipName, - change: expandChange(change.child.change), - }, - }; - } -} - /** * Implements a materialized view of the output of an operator. * @@ -74,7 +29,7 @@ export class ArrayView implements Output, TypedView { // Synthetic "root" entry that has a single "" relationship, so that we can // treat all changes, including the root change, generically. - #root: Entry; + readonly #root: Entry; onDestroy: (() => void) | undefined; @@ -83,9 +38,6 @@ export class ArrayView implements Output, TypedView { #error: ErroredQuery | undefined; readonly #updateTTL: (ttl: TTL) => void; - // Pending changes buffered for batch application (O(N + K) optimization) - #pendingChanges: ViewChange[] = []; - constructor( input: Input, format: Format, @@ -105,49 +57,24 @@ export class ArrayView implements Output, TypedView { this.#resultType = 'error'; this.#error = queryComplete; } else { - const flushAndFire = () => - this.#dirty ? this.flush() : this.#fireListeners(); void queryComplete .then(() => { this.#resultType = 'complete'; - flushAndFire(); + this.#fireListeners(); }) - .catch((e: ErroredQuery) => { + .catch(e => { this.#resultType = 'error'; this.#error = e; - flushAndFire(); + this.#fireListeners(); }); } this.#hydrate(); } get data() { - // Auto-flush for backwards compatibility. Recommended: push() then flush(). - // - // push(A) ──► buffer ──► push(B) ──► buffer ──► flush() ──► apply all - // │ - // Legacy code may read .data here ─────────────────┘ (before flush) - // │ - // ▼ - // Without auto-flush: stale data (missing A, B) - // With auto-flush: current data (has A, B) - this.#applyPendingChanges(); return this.#root[''] as V; } - #applyPendingChanges() { - if (this.#pendingChanges.length > 0) { - this.#root = applyChanges( - this.#root, - this.#pendingChanges, - this.#schema, - '', - this.#format, - ); - this.#pendingChanges = []; - } - } - addListener(listener: Listener) { assert(!this.#listeners.has(listener), 'Listener already registered'); this.#listeners.add(listener); @@ -175,12 +102,10 @@ export class ArrayView implements Output, TypedView { #hydrate() { this.#dirty = true; - // During hydration, expand and apply nodes immediately for (const node of skipYields(this.#input.fetch({}))) { - const expanded = expandNode(node); - this.#root = applyChanges( + applyChange( this.#root, - [{type: 'add', node: expanded}], + {type: 'add', node}, this.#schema, '', this.#format, @@ -191,11 +116,7 @@ export class ArrayView implements Output, TypedView { push(change: Change) { this.#dirty = true; - // Eagerly expand the change to capture current source state. - // This is critical: lazy generators would see stale data if deferred. - // Buffer the change for batch application (O(N + K) optimization). - const expanded = expandChange(change); - this.#pendingChanges.push(expanded); + applyChange(this.#root, change, this.#schema, '', this.#format); return emptyArray; } @@ -204,8 +125,6 @@ export class ArrayView implements Output, TypedView { return; } this.#dirty = false; - // Apply all pending changes in one batch (O(N + K) optimization) - this.#applyPendingChanges(); this.#fireListeners(); } diff --git a/packages/zql/src/ivm/test/fetch-and-push-tests.ts b/packages/zql/src/ivm/test/fetch-and-push-tests.ts index 66a664175f..db3c81eecb 100644 --- a/packages/zql/src/ivm/test/fetch-and-push-tests.ts +++ b/packages/zql/src/ivm/test/fetch-and-push-tests.ts @@ -101,7 +101,11 @@ export function runPushTest(t: PushTest) { }); let data; - const {finalOutput: view, actualStorage: actualStorage2} = innerTest(j => { + const { + log: log2, + finalOutput: view, + actualStorage: actualStorage2, + } = innerTest(j => { const view = new ArrayView(j, t.format, true, () => {}); data = view.data; return view; @@ -111,10 +115,9 @@ export function runPushTest(t: PushTest) { data = v; }); - // Note: With eager expansion of relationship generators at push time, - // ArrayView and Catch may produce different fetch logs since they - // iterate generators independently. We no longer compare logs. - // The important invariant is that they produce the same storage state. + // ArrayView does not expand relationships of removed nodes, so + // its logs should be a subset of the catch operator's logs. + expect(log).toEqual(expect.arrayContaining(log2)); expect(actualStorage).toEqual(actualStorage2); view.flush(); @@ -185,7 +188,11 @@ export function runFetchTest(t: FetchTest) { }); let data; - const {finalOutput: view, actualStorage: actualStorage2} = innerTest(j => { + const { + log: log2, + finalOutput: view, + actualStorage: actualStorage2, + } = innerTest(j => { const view = new ArrayView(j, t.format, true, () => {}); data = view.data; return view; @@ -195,10 +202,7 @@ export function runFetchTest(t: FetchTest) { data = v; }); - // Note: With eager expansion of relationship generators at push time, - // ArrayView and Catch may produce different fetch logs since they - // iterate generators independently. We no longer compare logs. - // The important invariant is that they produce the same storage state. + expect(log).toEqual(log2); expect(actualStorage).toEqual(actualStorage2); view.flush(); diff --git a/packages/zql/src/ivm/view-apply-change.test.ts b/packages/zql/src/ivm/view-apply-change.test.ts index 618c1278a2..484b6aada6 100644 --- a/packages/zql/src/ivm/view-apply-change.test.ts +++ b/packages/zql/src/ivm/view-apply-change.test.ts @@ -1,22 +1,9 @@ import {describe, expect, test} from 'vitest'; import {makeComparator} from './data.ts'; import type {SourceSchema} from './schema.ts'; -import { - applyChange, - idSymbol, - refCountSymbol, - type ViewChange, -} from './view-apply-change.ts'; +import {applyChange, type ViewChange} from './view-apply-change.ts'; import type {Entry, Format} from './view.ts'; -// Test helpers for cleaner entry access (casts are safe in tests) -const entries = (e: Entry, key: string): Entry[] => e[key] as Entry[]; -const at = (e: Entry, key: string, i: number): Entry => entries(e, key)[i]; - -const MUTATE = true as const; -const NO_MUTATE = false as const; -const WITH_IDS = true as const; - describe('applyChange', () => { const relationship = ''; const schema: SourceSchema = { @@ -82,21 +69,17 @@ describe('applyChange', () => { describe('Multiple entries', () => { test('singular: false', () => { - let root: Entry = {'': []}; + // This should really be a WeakMap but for testing purposes we use a Map. + + const parentEntry: Entry = {'': []}; const format: Format = { singular: false, - relationships: {athletes: {relationships: {}, singular: false}}, - }; - const apply = (change: ViewChange) => { - root = applyChange( - root, - change, - schema, - relationship, - format, - WITH_IDS, - NO_MUTATE, - ); + relationships: { + athletes: { + relationships: {}, + singular: false, + }, + }, }; { @@ -185,9 +168,11 @@ describe('applyChange', () => { }, ]; - changes.forEach(apply); + for (const change of changes) { + applyChange(parentEntry, change, schema, relationship, format, true); + } - expect(root).toMatchInlineSnapshot(` + expect(parentEntry).toMatchInlineSnapshot(` { "": [ { @@ -249,9 +234,11 @@ describe('applyChange', () => { }, ]; - changes.forEach(apply); + for (const change of changes) { + applyChange(parentEntry, change, schema, relationship, format, true); + } - expect(root).toMatchInlineSnapshot(` + expect(parentEntry).toMatchInlineSnapshot(` { "": [ { @@ -313,9 +300,11 @@ describe('applyChange', () => { }, ]; - changes.forEach(apply); + for (const change of changes) { + applyChange(parentEntry, change, schema, relationship, format, true); + } - expect(root).toMatchInlineSnapshot(` + expect(parentEntry).toMatchInlineSnapshot(` { "": [ { @@ -334,7 +323,7 @@ describe('applyChange', () => { test('singular: true', () => { // This should really be a WeakMap but for testing purposes we use a Map. - let root: Entry = {'': []}; + const parentEntry: Entry = {'': []}; const format: Format = { singular: false, relationships: { @@ -344,17 +333,6 @@ describe('applyChange', () => { }, }, }; - const apply = (change: ViewChange) => { - root = applyChange( - root, - change, - schema, - relationship, - format, - WITH_IDS, - NO_MUTATE, - ); - }; { const changes: ViewChange[] = [ @@ -442,9 +420,11 @@ describe('applyChange', () => { }, ]; - changes.forEach(apply); + for (const change of changes) { + applyChange(parentEntry, change, schema, relationship, format, true); + } - expect(root).toMatchInlineSnapshot(` + expect(parentEntry).toMatchInlineSnapshot(` { "": [ { @@ -504,9 +484,11 @@ describe('applyChange', () => { }, ]; - changes.forEach(apply); + for (const change of changes) { + applyChange(parentEntry, change, schema, relationship, format, true); + } - expect(root).toMatchInlineSnapshot(` + expect(parentEntry).toMatchInlineSnapshot(` { "": [ { @@ -566,9 +548,11 @@ describe('applyChange', () => { }, ]; - changes.forEach(apply); + for (const change of changes) { + applyChange(parentEntry, change, schema, relationship, format, true); + } - expect(root).toMatchInlineSnapshot(` + expect(parentEntry).toMatchInlineSnapshot(` { "": [ { @@ -600,23 +584,14 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - let root: Entry = {'': []}; + const root = {'': []}; const format = { singular: false, relationships: {}, }; - const apply = (change: ViewChange) => { - root = applyChange( - root, - change, - schema, - '', - format, - WITH_IDS, - NO_MUTATE, - ); - }; + const apply = (change: ViewChange) => + applyChange(root, change, schema, '', format, true); apply({ type: 'add', @@ -755,23 +730,14 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - let root: Entry = {'': undefined}; + const root = {'': undefined}; const format = { singular: true, relationships: {}, }; - const apply = (change: ViewChange) => { - root = applyChange( - root, - change, - schema, - relationship, - format, - WITH_IDS, - NO_MUTATE, - ); - }; + const apply = (change: ViewChange) => + applyChange(root, change, schema, relationship, format, true); apply({ type: 'add', @@ -922,23 +888,14 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - let root: Entry = {'': []}; + const root = {'': []}; const format = { singular: false, relationships: {}, }; - const apply = (change: ViewChange) => { - root = applyChange( - root, - change, - schema, - '', - format, - WITH_IDS, - NO_MUTATE, - ); - }; + const apply = (change: ViewChange) => + applyChange(root, change, schema, '', format, true); apply({ type: 'add', @@ -1059,23 +1016,14 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - let root: Entry = {'': []}; + const root = {'': []}; const format = { singular: false, relationships: {}, }; - const apply = (change: ViewChange) => { - root = applyChange( - root, - change, - schema, - '', - format, - WITH_IDS, - NO_MUTATE, - ); - }; + const apply = (change: ViewChange) => + applyChange(root, change, schema, '', format, true); apply({ type: 'add', @@ -1245,23 +1193,14 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - let root: Entry = {'': undefined}; + const root = {'': undefined}; const format = { singular: true, relationships: {}, }; - const apply = (change: ViewChange) => { - root = applyChange( - root, - change, - schema, - '', - format, - WITH_IDS, - NO_MUTATE, - ); - }; + const apply = (change: ViewChange) => + applyChange(root, change, schema, '', format, true); apply({ type: 'add', @@ -1372,23 +1311,14 @@ describe('applyChange', () => { isHidden: false, compareRows: makeComparator([['id', 'asc']]), } as const; - let root: Entry = {'': undefined}; + const root = {'': undefined}; const format = { singular: true, relationships: {}, }; - const apply = (change: ViewChange) => { - root = applyChange( - root, - change, - schema, - '', - format, - WITH_IDS, - NO_MUTATE, - ); - }; + const apply = (change: ViewChange) => + applyChange(root, change, schema, '', format, true); apply({ type: 'add', @@ -1485,1167 +1415,4 @@ describe('applyChange', () => { `); }); }); - - // ═══════════════════════════════════════════════════════════════════════════ - // ADD WITH CHILDREN TESTS - // Verify entries with child relationships are correctly positioned. - // Tests the indexOf optimization: add() returns pos, avoiding O(n) scan. - // - // [] ──add B+kids──► [B] ──add A+kids──► [A, B] - // │ ↑ - // │ binary search finds pos=0 - // └──────────────────────┘ - // ═══════════════════════════════════════════════════════════════════════════ - describe('add with initialized relationships', () => { - const schemaWithChildren: SourceSchema = { - tableName: 'parent', - columns: {id: {type: 'string'}, name: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: { - children: { - tableName: 'child', - columns: {id: {type: 'string'}, parentId: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: {}, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }, - }, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - } as const; - - const formatWithChildren: Format = { - singular: false, - relationships: { - children: {singular: false, relationships: {}}, - }, - }; - - const apply = (root: Entry, change: ViewChange) => - applyChange( - root, - change, - schemaWithChildren, - '', - formatWithChildren, - WITH_IDS, - NO_MUTATE, - ); - - test('entry with children is placed at correct position', () => { - let root: Entry = {'': []}; - - // Add entries in non-alphabetical order to verify binary search positioning - root = apply(root, { - type: 'add', - node: { - row: {id: 'b', name: 'Bob'}, - relationships: { - children: () => [ - {row: {id: 'c1', parentId: 'b'}, relationships: {}}, - ], - }, - }, - }); - - root = apply(root, { - type: 'add', - node: { - row: {id: 'd', name: 'Dave'}, - relationships: { - children: () => [ - {row: {id: 'c2', parentId: 'd'}, relationships: {}}, - ], - }, - }, - }); - - // Add entry that should be inserted at position 0 (before 'b') - // This entry has children, so initializeRelationships will return a new entry - root = apply(root, { - type: 'add', - node: { - row: {id: 'a', name: 'Alice'}, - relationships: { - children: () => [ - {row: {id: 'c3', parentId: 'a'}, relationships: {}}, - ], - }, - }, - }); - - // Verify entries are in correct sorted order with their children - expect(root).toMatchInlineSnapshot(` - { - "": [ - { - "children": [ - { - "id": "c3", - "parentId": "a", - Symbol(rc): 1, - Symbol(id): ""c3"", - }, - ], - "id": "a", - "name": "Alice", - Symbol(rc): 1, - Symbol(id): ""a"", - }, - { - "children": [ - { - "id": "c1", - "parentId": "b", - Symbol(rc): 1, - Symbol(id): ""c1"", - }, - ], - "id": "b", - "name": "Bob", - Symbol(rc): 1, - Symbol(id): ""b"", - }, - { - "children": [ - { - "id": "c2", - "parentId": "d", - Symbol(rc): 1, - Symbol(id): ""c2"", - }, - ], - "id": "d", - "name": "Dave", - Symbol(rc): 1, - Symbol(id): ""d"", - }, - ], - } - `); - }); - - test('entry inserted in middle position with children', () => { - let root: Entry = {'': []}; - - // Add entries with gap for middle insertion - root = apply(root, { - type: 'add', - node: { - row: {id: 'a', name: 'Alice'}, - relationships: {children: () => []}, - }, - }); - - root = apply(root, { - type: 'add', - node: { - row: {id: 'c', name: 'Charlie'}, - relationships: {children: () => []}, - }, - }); - - // Insert entry in middle (at position 1) with multiple children - root = apply(root, { - type: 'add', - node: { - row: {id: 'b', name: 'Bob'}, - relationships: { - children: () => [ - {row: {id: 'child1', parentId: 'b'}, relationships: {}}, - {row: {id: 'child2', parentId: 'b'}, relationships: {}}, - ], - }, - }, - }); - - // Verify middle entry has children and is at correct position - expect(at(root, '', 0)).toEqual( - expect.objectContaining({id: 'a', name: 'Alice'}), - ); - expect(at(root, '', 1)).toEqual( - expect.objectContaining({id: 'b', name: 'Bob'}), - ); - expect(at(root, '', 2)).toEqual( - expect.objectContaining({id: 'c', name: 'Charlie'}), - ); - - // Verify Bob's children are correctly initialized - const bobEntry = at(root, '', 1); - expect(entries(bobEntry, 'children')).toHaveLength(2); - expect(at(bobEntry, 'children', 0)).toEqual( - expect.objectContaining({id: 'child1', parentId: 'b'}), - ); - expect(at(bobEntry, 'children', 1)).toEqual( - expect.objectContaining({id: 'child2', parentId: 'b'}), - ); - }); - }); - - // ═══════════════════════════════════════════════════════════════════════════ - // IMMUTABILITY TESTS - // Verify unchanged rows keep their object reference (enables React.memo etc.) - // - // root ─┬─ [A, B, C] edit B root' ─┬─ [A, B', C] - // │ ────► │ - // └─ users:[X,Y] └─ users:[X,Y] ← same ref - // - // A, C: same ref (unchanged) - // B': new ref (edited) - // users: same ref (sibling relationship untouched) - // ═══════════════════════════════════════════════════════════════════════════ - describe('Object identity preservation (immutability)', () => { - const simpleSchema = { - tableName: 'item', - columns: {id: {type: 'string'}, name: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: {}, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - } as const; - - const format: Format = {singular: false, relationships: {}}; - - // Helper to reduce boilerplate in tests - const apply = (root: Entry, change: ViewChange) => - applyChange(root, change, simpleSchema, '', format, WITH_IDS, NO_MUTATE); - - // [A] ──add B──► [A, B] - // ↑ ↑ - // └─── same ref ────┘ - test('unchanged rows keep their reference when adding a new row', () => { - let root: Entry = {'': []}; - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const firstRowRef = at(root, '', 0); - - root = apply(root, { - type: 'add', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - // First row should keep same reference (toBe checks reference equality) - expect(at(root, '', 0)).toBe(firstRowRef); - expect(entries(root, '')).toHaveLength(2); - }); - - test('unchanged rows keep their reference when removing another row', () => { - let root: Entry = {'': []}; - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - root = apply(root, { - type: 'add', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - const firstRowRef = at(root, '', 0); - - root = apply(root, { - type: 'remove', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - // First row should keep same reference - expect(at(root, '', 0)).toBe(firstRowRef); - expect(entries(root, '')).toHaveLength(1); - }); - - test('unchanged rows keep their reference when editing another row', () => { - let root: Entry = {'': []}; - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - root = apply(root, { - type: 'add', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - const firstRowRef = at(root, '', 0); - - root = apply(root, { - type: 'edit', - oldNode: {row: {id: '2', name: 'Bob'}}, - node: {row: {id: '2', name: 'Bobby'}}, - }); - - // First row should keep same reference - expect(at(root, '', 0)).toBe(firstRowRef); - // Second row should have new reference with updated data - expect(at(root, '', 1)).not.toBe(firstRowRef); - expect(at(root, '', 1)).toEqual( - expect.objectContaining({id: '2', name: 'Bobby'}), - ); - }); - - // [A] ──edit A──► [A'] - // │ │ - // └── different ref ─┘ - test('edited row gets new reference', () => { - let root: Entry = {'': []}; - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const originalRef = at(root, '', 0); - - root = apply(root, { - type: 'edit', - oldNode: {row: {id: '1', name: 'Alice'}}, - node: {row: {id: '1', name: 'Alicia'}}, - }); - - // Edited row should have a new reference - expect(at(root, '', 0)).not.toBe(originalRef); - expect(at(root, '', 0)).toEqual( - expect.objectContaining({id: '1', name: 'Alicia'}), - ); - }); - - test('root object changes when any modification occurs', () => { - let root: Entry = {'': []}; - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const rootRef = root; - const listRef = entries(root, ''); - - root = apply(root, { - type: 'add', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - // Root and list should have new references - expect(root).not.toBe(rootRef); - expect(root['']).not.toBe(listRef); - }); - - // Parent changes but untouched children keep their references: - // - // P1 ─┬─ [C1, C2] add C3 P1' ─┬─ [C1, C2, C3] - // │ ────► │ ↑ ↑ - // └─ ... └─ same refs - test('unchanged nested relationships keep their reference', () => { - const schemaWithRelationship: SourceSchema = { - tableName: 'parent', - columns: {id: {type: 'string'}, name: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: { - children: { - tableName: 'child', - columns: {id: {type: 'string'}, parentId: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: {}, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }, - }, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }; - - const formatWithRelationship: Format = { - singular: false, - relationships: { - children: { - singular: false, - relationships: {}, - }, - }, - }; - - const apply = (entry: Entry, change: ViewChange) => - applyChange( - entry, - change, - schemaWithRelationship, - '', - formatWithRelationship, - WITH_IDS, - NO_MUTATE, - ); - - let root: Entry = {'': []}; - - // Add parent with children - root = apply(root, { - type: 'add', - node: { - row: {id: 'p1', name: 'Parent1'}, - relationships: { - children: () => [ - {row: {id: 'c1', parentId: 'p1'}, relationships: {}}, - {row: {id: 'c2', parentId: 'p1'}, relationships: {}}, - ], - }, - }, - }); - - const parent1 = at(root, '', 0); - const child1Ref = at(parent1, 'children', 0); - const child2Ref = at(parent1, 'children', 1); - - // Add a new child to the parent - root = apply(root, { - type: 'child', - node: {row: {id: 'p1', name: 'Parent1'}}, - child: { - relationshipName: 'children', - change: { - type: 'add', - node: {row: {id: 'c3', parentId: 'p1'}, relationships: {}}, - }, - }, - }); - - const newParent1 = at(root, '', 0); - // Parent should have new reference (its children changed) - expect(newParent1).not.toBe(parent1); - // But existing children should keep their references - expect(at(newParent1, 'children', 0)).toBe(child1Ref); - expect(at(newParent1, 'children', 1)).toBe(child2Ref); - // New child is added - expect(entries(newParent1, 'children')).toHaveLength(3); - }); - - // [A:rc=1] ──add A──► [A:rc=2] - // │ │ - // └─── different ref ───┘ (but same data) - test('refCount increment creates new reference but preserves data', () => { - let root: Entry = {'': []}; - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const originalRef = at(root, '', 0); - const originalRefCount = (originalRef as {[refCountSymbol]: number})[ - refCountSymbol - ]; - - // Add same row again (should increment refCount) - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const newRef = at(root, '', 0); - - // Reference should change (immutability) - expect(newRef).not.toBe(originalRef); - // RefCount should be incremented - expect((newRef as {[refCountSymbol]: number})[refCountSymbol]).toBe( - originalRefCount + 1, - ); - // Data should be the same - expect(newRef).toEqual(expect.objectContaining({id: '1', name: 'Alice'})); - }); - - // Sibling parents are independent. Changing P1's children doesn't touch P2: - // - // [P1─[C1], P2─[C2]] add C3 to P1 [P1'─[C1,C3], P2─[C2]] - // ↑ ────► ↑ - // └────────────── same ref ────────────────┘ - test('child change on one parent does not affect other parents', () => { - const schemaWithRelationship: SourceSchema = { - tableName: 'parent', - columns: {id: {type: 'string'}, name: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: { - children: { - tableName: 'child', - columns: {id: {type: 'string'}, parentId: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: {}, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }, - }, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }; - - const formatWithRelationship: Format = { - singular: false, - relationships: { - children: { - singular: false, - relationships: {}, - }, - }, - }; - - const apply = (entry: Entry, change: ViewChange) => - applyChange( - entry, - change, - schemaWithRelationship, - '', - formatWithRelationship, - WITH_IDS, - NO_MUTATE, - ); - - let root: Entry = {'': []}; - - // Add two parents with children - root = apply(root, { - type: 'add', - node: { - row: {id: 'p1', name: 'Parent1'}, - relationships: { - children: () => [ - {row: {id: 'c1', parentId: 'p1'}, relationships: {}}, - ], - }, - }, - }); - - root = apply(root, { - type: 'add', - node: { - row: {id: 'p2', name: 'Parent2'}, - relationships: { - children: () => [ - {row: {id: 'c2', parentId: 'p2'}, relationships: {}}, - ], - }, - }, - }); - - const parent1Ref = at(root, '', 0); - const parent2Ref = at(root, '', 1); - const parent2ChildrenRef = entries(parent2Ref, 'children'); - - // Add a child to parent1 only - root = apply(root, { - type: 'child', - node: {row: {id: 'p1', name: 'Parent1'}}, - child: { - relationshipName: 'children', - change: { - type: 'add', - node: {row: {id: 'c3', parentId: 'p1'}, relationships: {}}, - }, - }, - }); - - // Parent1 should have new reference - expect(at(root, '', 0)).not.toBe(parent1Ref); - // Parent2 should keep same reference (unchanged) - expect(at(root, '', 1)).toBe(parent2Ref); - // Parent2's children should keep same reference - expect(at(root, '', 1)['children']).toBe(parent2ChildrenRef); - }); - - // When withIDs is enabled, edited rows get a new idSymbol - test('edited row with withIDs gets new idSymbol', () => { - let root: Entry = {'': []}; - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const originalRef = at(root, '', 0); - const originalId = (originalRef as {[idSymbol]?: string})[idSymbol]; - expect(originalId).toBeDefined(); - - root = apply(root, { - type: 'edit', - oldNode: {row: {id: '1', name: 'Alice'}}, - node: {row: {id: '1', name: 'Alicia'}}, - }); - - const newRef = at(root, '', 0); - const newId = (newRef as {[idSymbol]?: string})[idSymbol]; - - // Reference should change (immutability) - expect(newRef).not.toBe(originalRef); - // idSymbol should be set on the new entry - expect(newId).toBeDefined(); - expect(newId).toBe(originalId); // Same ID since primary key unchanged - expect(newRef).toEqual( - expect.objectContaining({id: '1', name: 'Alicia'}), - ); - }); - }); - - // ═══════════════════════════════════════════════════════════════════════════ - // IN-PLACE MUTATION TESTS (mutate = true) - // Verify that with mutate=true, containers are mutated in place but rows - // remain immutable and views remain isolated. - // - // Key invariants: - // 1. Multiple views never share object instances - // 2. Row objects never mutate (always get new references when changed) - // 3. Within a view: root and arrays ARE mutated in place - // ═══════════════════════════════════════════════════════════════════════════ - describe('In-place mutation (mutate = true)', () => { - // Deep freeze helper to catch bugs where we mutate inputs - function deepFreeze(obj: T): T { - Object.freeze(obj); - for (const prop of Object.getOwnPropertyNames(obj)) { - // oxlint-disable-next-line no-explicit-any - const val = (obj as any)[prop]; - if (val && typeof val === 'object' && !Object.isFrozen(val)) { - deepFreeze(val); - } - } - - return obj; - } - - const simpleSchema = { - tableName: 'item', - columns: {id: {type: 'string'}, name: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: {}, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - } as const; - - const format: Format = {singular: false, relationships: {}}; - - // Helper to reduce boilerplate in tests - const apply = (root: Entry, change: ViewChange) => - applyChange( - root, - // we freeze here to catch potential bugs where applyChange mutates the - // input change object (it shouldn't) - deepFreeze(change), - simpleSchema, - '', - format, - WITH_IDS, - MUTATE, - ); - - // root/[A] ──add B──► root/[A, B] - // ↑ ↑ ↑ ↑ - // └───┴─ same refs ─────┴───┘ - test('root and array keep their reference when adding a new row', () => { - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const firstRowRef = at(root, '', 0); - - root = apply(root, { - type: 'add', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(entries(root, '')).toBe(listRef); - // First row should keep same reference (unchanged) - expect(at(root, '', 0)).toBe(firstRowRef); - expect(entries(root, '')).toHaveLength(2); - }); - - test('root and array keep their reference when removing a row', () => { - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - root = apply(root, { - type: 'add', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - const firstRowRef = at(root, '', 0); - - root = apply(root, { - type: 'remove', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(entries(root, '')).toBe(listRef); - // First row should keep same reference (unchanged) - expect(at(root, '', 0)).toBe(firstRowRef); - expect(entries(root, '')).toHaveLength(1); - }); - - test('root, array and entries keep reference when editing a row', () => { - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - root = apply(root, { - type: 'add', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - const firstRowRef = at(root, '', 0); - const secondRowRef = at(root, '', 1); - // Verify secondRowRef data before edit - expect(secondRowRef).toEqual( - expect.objectContaining({id: '2', name: 'Bob'}), - ); - - root = apply(root, { - type: 'edit', - oldNode: {row: {id: '2', name: 'Bob'}}, - node: {row: {id: '2', name: 'Bobby'}}, - }); - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(entries(root, '')).toBe(listRef); - // First row should keep same reference (unchanged) - expect(at(root, '', 0)).toBe(firstRowRef); - expect(at(root, '', 1)).toBe(secondRowRef); - }); - - // [A] ──edit A──► [A'] - // ↑ │ - // same ref different ref - // (array) (row) - test('edited row keeps reference', () => { - // TODO(arv): Mutate element if compare === 0 - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const originalRef = at(root, '', 0); - // Verify original data before edit - expect(originalRef).toEqual( - expect.objectContaining({id: '1', name: 'Alice'}), - ); - - root = apply(root, { - type: 'edit', - oldNode: {row: {id: '1', name: 'Alice'}}, - node: {row: {id: '1', name: 'Alicia'}}, - }); - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(entries(root, '')).toBe(listRef); - expect(at(root, '', 0)).toBe(originalRef); - expect(at(root, '', 0)).toEqual( - expect.objectContaining({id: '1', name: 'Alicia'}), - ); - }); - - test('root and list keep same reference on any mutation', () => { - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(root['']).toBe(listRef); - - root = apply(root, { - type: 'add', - node: {row: {id: '2', name: 'Bob'}, relationships: {}}, - }); - - // Root and list should still keep same reference - expect(root).toBe(rootRef); - expect(root['']).toBe(listRef); - }); - - // Root, parent, and children arrays all mutate in place; unchanged child rows keep refs: - // - // P1 ─┬─ [C1, C2] add C3 P1 ─┬─ [C1, C2, C3] - // ↑ │ ────► ↑ │ ↑ ↑ - // │ └─ same refs ───────────────┘ └───┴─ same refs - // └────────────────────────────────────┘ - test('parent and child arrays mutated in place, child rows preserved', () => { - const schemaWithRelationship: SourceSchema = { - tableName: 'parent', - columns: {id: {type: 'string'}, name: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: { - children: { - tableName: 'child', - columns: {id: {type: 'string'}, parentId: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: {}, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }, - }, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }; - - const formatWithRelationship: Format = { - singular: false, - relationships: { - children: { - singular: false, - relationships: {}, - }, - }, - }; - - const apply = (entry: Entry, change: ViewChange) => - applyChange( - entry, - // we freeze here to catch potential bugs where applyChange mutates the - // input change object (it shouldn't) - deepFreeze(change), - schemaWithRelationship, - '', - formatWithRelationship, - WITH_IDS, - MUTATE, - ); - - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - // Add parent with children - root = apply(root, { - type: 'add', - node: { - row: {id: 'p1', name: 'Parent1'}, - relationships: { - children: () => [ - {row: {id: 'c1', parentId: 'p1'}, relationships: {}}, - {row: {id: 'c2', parentId: 'p1'}, relationships: {}}, - ], - }, - }, - }); - - const parent1 = at(root, '', 0); - const childrenArrayRef = entries(parent1, 'children'); - const child1Ref = at(parent1, 'children', 0); - const child2Ref = at(parent1, 'children', 1); - - // Add a new child to the parent - root = apply(root, { - type: 'child', - node: {row: {id: 'p1', name: 'Parent1'}}, - child: { - relationshipName: 'children', - change: { - type: 'add', - node: {row: {id: 'c3', parentId: 'p1'}, relationships: {}}, - }, - }, - }); - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(entries(root, '')).toBe(listRef); - // Parent should keep same reference (mutated in place) - expect(at(root, '', 0)).toBe(parent1); - // Children array should keep same reference (mutated in place) - expect(entries(at(root, '', 0), 'children')).toBe(childrenArrayRef); - // Existing children should keep their references - expect(at(at(root, '', 0), 'children', 0)).toBe(child1Ref); - expect(at(at(root, '', 0), 'children', 1)).toBe(child2Ref); - // New child is added - expect(entries(at(root, '', 0), 'children')).toHaveLength(3); - }); - - // [A:rc=1] ──add A──► [A:rc=2] - // ↑ │ - // same array same array ref - test('refCount increment mutates entry', () => { - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const originalRef = at(root, '', 0); - const originalRefCount = (originalRef as {[refCountSymbol]: number})[ - refCountSymbol - ]; - expect(originalRefCount).toBe(1); - - // Add same row again (should increment refCount) - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alicia'}, relationships: {}}, - }); - - const newRef = at(root, '', 0); - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(entries(root, '')).toBe(listRef); - expect(newRef).toBe(originalRef); - // RefCount should be incremented - expect((newRef as {[refCountSymbol]: number})[refCountSymbol]).toBe( - originalRefCount + 1, - ); - }); - - // Sibling parents are independent. Changing P1's children doesn't touch P2: - // - // [P1─[C1], P2─[C2]] add C3 to P1 [P1─[C1,C3], P2─[C2]] - // ↑ ↑ ↑ ────► ↑ ↑ ↑ - // └───┴──────┴───────── all same refs ─┴───┴────────┘ - test('child change on one parent does not affect other parents', () => { - const schemaWithRelationship: SourceSchema = { - tableName: 'parent', - columns: {id: {type: 'string'}, name: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: { - children: { - tableName: 'child', - columns: {id: {type: 'string'}, parentId: {type: 'string'}}, - primaryKey: ['id'], - sort: [['id', 'asc']], - system: 'client', - relationships: {}, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }, - }, - isHidden: false, - compareRows: makeComparator([['id', 'asc']]), - }; - - const formatWithRelationship: Format = { - singular: false, - relationships: { - children: { - singular: false, - relationships: {}, - }, - }, - }; - - const apply = (entry: Entry, change: ViewChange) => - applyChange( - entry, - // we freeze here to catch potential bugs where applyChange mutates the - // input change object (it shouldn't) - deepFreeze(change), - schemaWithRelationship, - '', - formatWithRelationship, - WITH_IDS, - MUTATE, - ); - - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - // Add two parents with children - root = apply(root, { - type: 'add', - node: { - row: {id: 'p1', name: 'Parent1'}, - relationships: { - children: () => [ - {row: {id: 'c1', parentId: 'p1'}, relationships: {}}, - ], - }, - }, - }); - - root = apply(root, { - type: 'add', - node: { - row: {id: 'p2', name: 'Parent2'}, - relationships: { - children: () => [ - {row: {id: 'c2', parentId: 'p2'}, relationships: {}}, - ], - }, - }, - }); - - const parent1Ref = at(root, '', 0); - const parent2Ref = at(root, '', 1); - const parent2ChildrenRef = entries(parent2Ref, 'children'); - - // Add a child to parent1 only - root = apply(root, { - type: 'child', - node: {row: {id: 'p1', name: 'Parent1'}}, - child: { - relationshipName: 'children', - change: { - type: 'add', - node: {row: {id: 'c3', parentId: 'p1'}, relationships: {}}, - }, - }, - }); - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(entries(root, '')).toBe(listRef); - // Both parents should keep same reference (mutated in place) - expect(at(root, '', 0)).toBe(parent1Ref); - expect(at(root, '', 1)).toBe(parent2Ref); - // Parent2's children should keep same reference - expect(at(root, '', 1)['children']).toBe(parent2ChildrenRef); - }); - - // ═════════════════════════════════════════════════════════════════════════ - // VIEW ISOLATION TESTS - // Verify that different views never share object instances - // ═════════════════════════════════════════════════════════════════════════ - test('different views never share row instances', () => { - let view1: Entry = {'': []}; - let view2: Entry = {'': []}; - - // Add same row to both views - view1 = apply(view1, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - view2 = apply(view2, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - // Views should be different objects - expect(view1).not.toBe(view2); - expect(entries(view1, '')).not.toBe(entries(view2, '')); - // Row instances should be different (no sharing between views) - expect(at(view1, '', 0)).not.toBe(at(view2, '', 0)); - }); - - test('editing a row in one view does not affect other views', () => { - let view1: Entry = {'': []}; - let view2: Entry = {'': []}; - - // Add same row to both views - view1 = apply(view1, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - view2 = apply(view2, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const view2RowRef = at(view2, '', 0); - - // Edit row in view1 - view1 = apply(view1, { - type: 'edit', - oldNode: {row: {id: '1', name: 'Alice'}}, - node: {row: {id: '1', name: 'Alicia'}}, - }); - - // View1 should have updated data - expect(at(view1, '', 0)).toEqual( - expect.objectContaining({id: '1', name: 'Alicia'}), - ); - // View2 should be completely unchanged (same reference, same data) - expect(at(view2, '', 0)).toBe(view2RowRef); - expect(at(view2, '', 0)).toEqual( - expect.objectContaining({id: '1', name: 'Alice'}), - ); - }); - - // When withIDs is enabled with mutation, idSymbol is set by mutating the entry - test('edited row with withIDs mutates idSymbol in place', () => { - let root: Entry = {'': []}; - const rootRef = root; - const listRef = entries(root, ''); - - root = apply(root, { - type: 'add', - node: {row: {id: '1', name: 'Alice'}, relationships: {}}, - }); - - const originalRef = at(root, '', 0); - const originalId = (originalRef as {[idSymbol]?: string})[idSymbol]; - expect(originalId).toBeDefined(); - - root = apply(root, { - type: 'edit', - oldNode: {row: {id: '1', name: 'Alice'}}, - node: {row: {id: '1', name: 'Alicia'}}, - }); - - const newRef = at(root, '', 0); - const newId = (newRef as {[idSymbol]?: string})[idSymbol]; - - // Root and list should keep same reference (mutated in place) - expect(root).toBe(rootRef); - expect(entries(root, '')).toBe(listRef); - // Entry reference should stay the same (mutated in place) - expect(newRef).toBe(originalRef); - // idSymbol should be set on the mutated entry - expect(newId).toBeDefined(); - expect(newId).toBe(originalId); // Same ID since primary key unchanged - expect(newRef).toEqual( - expect.objectContaining({id: '1', name: 'Alicia'}), - ); - }); - }); }); diff --git a/packages/zql/src/ivm/view-apply-change.ts b/packages/zql/src/ivm/view-apply-change.ts index ab4b3665f3..d88dbbe68d 100644 --- a/packages/zql/src/ivm/view-apply-change.ts +++ b/packages/zql/src/ivm/view-apply-change.ts @@ -15,43 +15,11 @@ import type {Entry, Format} from './view.ts'; export const refCountSymbol = Symbol('rc'); export const idSymbol = Symbol('id'); -type ReadonlyMetaEntry = Entry & { - readonly [refCountSymbol]: number; - readonly [idSymbol]?: string | undefined; -}; - -type MutableMetaEntry = Writable; - -/** - * MetaEntry is an Entry with internal tracking fields for reference counting - * and stable identity. All entries in the view tree are MetaEntry instances, - * created through makeNewMetaEntry(). - */ -type MetaEntry = M extends true - ? MutableMetaEntry - : ReadonlyMetaEntry; - -type MutableArray = M extends true ? T[] : readonly T[]; - -type MetaEntryList = MutableArray>; - -type MutableMetaEntryList = MutableMetaEntry[]; - -/** - * Node with eagerly-expanded relationships (arrays instead of generators). - * Used when batching changes to capture source state at push time. - */ -export type ExpandedNode = { - row: Row; - relationships: Record; +type MetaEntry = Writable & { + [refCountSymbol]: number; + [idSymbol]?: string | undefined; }; - -/** - * A node for view changes. Can be either: - * - A lazy Node with generator relationships (original behavior) - * - An ExpandedNode with pre-computed relationship arrays (for batching) - */ -export type ViewNode = Node | ExpandedNode; +type MetaEntryList = MetaEntry[]; /** * `applyChange` does not consume the `relationships` of `ChildChange#node`, @@ -68,12 +36,12 @@ export type RowOnlyNode = {row: Row}; export type AddViewChange = { type: 'add'; - node: ViewNode; + node: Node; }; export type RemoveViewChange = { type: 'remove'; - node: ViewNode; + node: Node; }; type ChildViewChange = { @@ -101,38 +69,6 @@ export interface RefCountMap { delete(entry: Entry): boolean; } -/** - * Get child nodes from a relationship, handling both lazy (Node) and expanded (ExpandedNode). - */ -function* getChildNodes( - node: ViewNode, - relationship: string, -): Generator { - const children = node.relationships[relationship]; - if (Array.isArray(children)) { - // ExpandedNode: already an array - yield* children; - } else { - // Node: lazy generator function - yield* skipYields(children()); - } -} - -type Mutate = boolean; -type WithIDs = boolean; - -/** - * Immutable view update. Returns new Entry on change, same Entry if unchanged. - * Unchanged entries keep identity, enabling shallow comparison optimizations - * in UI frameworks (React.memo, Solid's fine-grained reactivity, etc). - * - * Propagation: recurse DOWN to find target, copy objects on the way UP. - * Siblings keep original refs. Only the ancestor path is copied. - * - * root {users:[A,B], items:[C,D,E]} --edit C--> root' {users:[A,B], items':[C',D,E]} - * │ same ref │ │ │ - * └─────────────────┴── unchanged ──────────────┘ new array C' new, D/E same - */ export function applyChange( parentEntry: Entry, change: ViewChange, @@ -140,68 +76,46 @@ export function applyChange( relationship: string, format: Format, withIDs = false, - mutate = false, -): Entry { - return applyChangeInternal( - parentEntry as MetaEntry, - change, - schema, - relationship, - format, - withIDs, - mutate, - ); -} - -export function applyChangeInternal( - parentEntry: MetaEntry, - change: ViewChange, - schema: SourceSchema, - relationship: string, - format: Format, - withIDs: WithIDs, - mutate: M, -): MetaEntry { +): void { if (schema.isHidden) { switch (change.type) { case 'add': - case 'remove': { - let currentParent = parentEntry; - for (const relationship of Object.keys(change.node.relationships)) { + case 'remove': + for (const [relationship, children] of Object.entries( + change.node.relationships, + )) { const childSchema = must(schema.relationships[relationship]); - for (const node of getChildNodes(change.node, relationship)) { - currentParent = applyChangeInternal( - currentParent, + for (const node of skipYields(children())) { + applyChange( + parentEntry, {type: change.type, node}, childSchema, relationship, format, withIDs, - mutate, ); } } - return currentParent; - } + return; case 'edit': // If hidden at this level it means that the hidden row was changed. If // the row was changed in such a way that it would change the // relationships then the edit would have been split into remove and // add. - return parentEntry; + return; case 'child': { const childSchema = must( schema.relationships[change.child.relationshipName], ); - return applyChangeInternal( + applyChange( parentEntry, change.child.change, childSchema, relationship, format, withIDs, - mutate, ); + return; } default: unreachable(change); @@ -210,119 +124,85 @@ export function applyChangeInternal( const {singular, relationships: childFormats} = format; switch (change.type) { - // ADD: Insert row (rc=1) or increment refCount if duplicate. - // RefCount tracks when the same row is reachable via multiple edges - // within a relationship: - // - // issue.labels: [L1, L2] both point to same creator - // │ │ │ - // ▼ ▼ ▼ - // label.creator ──────────► [User:rc=2] (one row, two refs) - // - // add(A) add(A) remove(A) remove(A) - // ↓ ↓ ↓ ↓ - // [A:rc=1] → [A:rc=2] → [A:rc=1] → (deleted) case 'add': { + let newEntry: MetaEntry | undefined; + if (singular) { - const oldEntry = getOptionalSingularEntry(parentEntry, relationship); + const oldEntry = parentEntry[relationship] as MetaEntry | undefined; if (oldEntry !== undefined) { - // Duplicate add: increment refCount assert( schema.compareRows(oldEntry, change.node.row) === 0, `Singular relationship '${relationship}' should not have multiple rows. You may need to declare this relationship with the \`many\` helper instead of the \`one\` helper in your schema.`, ); - - const newEntry = incRefCount(mutate, oldEntry); - return setRelation(mutate, parentEntry, relationship, newEntry); + // adding same again. + oldEntry[refCountSymbol]++; } else { - // New row: create with rc=1, initialize nested relationships - const newEntry = makeNewMetaEntry( - change.node.row, - schema, - withIDs, - 1, - ); - initializeRelationshipsForNewEntryIfAny( - newEntry, - change.node, - schema, - childFormats, - withIDs, - ); - return setRelation(true, parentEntry, relationship, newEntry); + newEntry = makeNewMetaEntry(change.node.row, schema, withIDs, 1); + + (parentEntry as Writable)[relationship] = newEntry; } } else { - // Plural: binary search for position, insert or increment refCount - const view = getChildEntryList(parentEntry, relationship); - const {newEntry, newView} = add( + newEntry = add( change.node.row, - view, + getChildEntryList(parentEntry, relationship), schema, withIDs, - mutate, ); + } - if (newEntry) { - initializeRelationshipsForNewEntryIfAny( - newEntry, - change.node, - schema, - childFormats, - withIDs, - ); + if (newEntry) { + for (const [relationship, children] of Object.entries( + change.node.relationships, + )) { + // TODO: Is there a flag to make TypeScript complain that dictionary access might be undefined? + const childSchema = must(schema.relationships[relationship]); + const childFormat = childFormats[relationship]; + if (childFormat === undefined) { + continue; + } + + const newView = childFormat.singular + ? undefined + : ([] as MetaEntryList); + newEntry[relationship] = newView; + + for (const node of skipYields(children())) { + applyChange( + newEntry, + {type: 'add', node}, + childSchema, + relationship, + childFormat, + withIDs, + ); + } } - return setRelation(mutate, parentEntry, relationship, newView); } + break; } - // REMOVE: Decrement refCount, physically remove when rc=0. case 'remove': { if (singular) { - const oldEntry = getSingularEntry(parentEntry, relationship); + const oldEntry = parentEntry[relationship] as MetaEntry | undefined; + assert(oldEntry !== undefined, 'node does not exist'); const rc = oldEntry[refCountSymbol]; if (rc === 1) { - return setRelation(mutate, parentEntry, relationship, undefined); + (parentEntry as Writable)[relationship] = undefined; } - const newEntry = decRefCount(mutate, oldEntry); - return setRelation(mutate, parentEntry, relationship, newEntry); + oldEntry[refCountSymbol]--; } else { - const view = getChildEntryList(parentEntry, relationship); - const newView = removeAndUpdateRefCount( - view, + removeAndUpdateRefCount( + getChildEntryList(parentEntry, relationship), change.node.row, schema.compareRows, - mutate, ); - return setRelation(mutate, parentEntry, relationship, newView); } + break; } - // CHILD: Propagate nested change up to this level (leaf-to-root pattern). case 'child': { - const childSchema = must( - schema.relationships[change.child.relationshipName], - ); - const childFormat = format.relationships[change.child.relationshipName]; - if (childFormat === undefined) { - return parentEntry; // Relationship not in view format - } - + let existing: MetaEntry; if (singular) { - const existing = getSingularEntry(parentEntry, relationship); - const newExisting = applyChangeInternal( - existing, - change.child.change, - childSchema, - change.child.relationshipName, - childFormat, - withIDs, - mutate, - ); - // Preserve identity if child didn't change (enables shallow-compare optimizations). - if (newExisting === existing) { - return parentEntry; - } - return setRelation(mutate, parentEntry, relationship, newExisting); + existing = getSingularEntry(parentEntry, relationship); } else { - // Find the target row in the sorted array via binary search. const view = getChildEntryList(parentEntry, relationship); const {pos, found} = binarySearch( view, @@ -330,48 +210,33 @@ export function applyChangeInternal( schema.compareRows, ); assert(found, 'node does not exist'); - const existing = view[pos]; - const newExisting = applyChangeInternal( + existing = view[pos]; + } + + const childSchema = must( + schema.relationships[change.child.relationshipName], + ); + const childFormat = format.relationships[change.child.relationshipName]; + if (childFormat !== undefined) { + applyChange( existing, change.child.change, childSchema, change.child.relationshipName, childFormat, withIDs, - mutate, - ); - // Preserve identity if descendant didn't change. - if (newExisting === existing) { - return parentEntry; - } - // applyChangeInternal preserves MetaEntry structure when input is MetaEntry - assertMetaEntry(newExisting); - return setRelation( - mutate, - parentEntry, - relationship, - arrayWith(mutate, view, pos, newExisting), ); } + break; } - // EDIT: Update row fields. If sort key changes, row may move position. - // - // Position change with rc>1 (two query paths reach same row): - // - // Before: [A, B(rc=2), C, D] After: [A, B(rc=1), C, B'(rc=1), D] - // │ │ │ - // path1 + path2 path1 ghost path2 moved - // - // Why ghost stays: path1 still expects B at old position. - // B' appears where path2's sort order places it. case 'edit': { if (singular) { - const existing = getSingularEntry(parentEntry, relationship); - const newEntry = applyEdit(existing, change, schema, withIDs, mutate); - return setRelation(mutate, parentEntry, relationship, newEntry); + const existing = parentEntry[relationship]; + assertMetaEntry(existing); + applyEdit(existing, change, schema, withIDs); } else { const view = getChildEntryList(parentEntry, relationship); - // Sort key changed: row may need to move + // The position of the row in the list may have changed due to the edit. if (schema.compareRows(change.oldNode.row, change.node.row) !== 0) { const {pos: oldPos, found: oldFound} = binarySearch( view, @@ -386,322 +251,115 @@ export function applyChangeInternal( schema.compareRows, ); // A special case: - // when refCount is 1 (so the row is being moved without leaving a - // placeholder behind), and the new pos is the same as the old, or - // directly after the old (so after the remove of the old it would be - // in the same pos): the row does not need to be moved, just edited. + // when refCount is 1 (so the row is being moved + // without leaving a placeholder behind), and the new pos is + // the same as the old, or directly after the old (so after the remove + // of the old it would be in the same pos): + // the row does not need to be moved, it can just be edited in place. if ( oldEntry[refCountSymbol] === 1 && (pos === oldPos || pos - 1 === oldPos) ) { - const newEntry = applyEdit( - oldEntry, - change, - schema, - withIDs, - mutate, - ); - return setRelation( - mutate, - parentEntry, - relationship, - arrayWith(mutate, view, oldPos, newEntry), - ); + applyEdit(oldEntry, change, schema, withIDs); } else { - // Move the row. If rc > 1, an edit will be received for each ref. - // On first edit: move row, apply edit, set rc=1. Leave a copy at - // old pos with decremented rc. As each edit arrives, old copy's rc - // decrements and new pos rc increments. When copy rc hits 0, remove. - const newRefCount = oldEntry[refCountSymbol] - 1; - let newView: MutableMetaEntryList; + // Move the row. If the row has > 1 ref count, an edit should + // be received for each ref count. On the first edit, the original + // row is moved, the edit is applied to it and its ref count is set + // to 1. A shallow copy of the row is left at the old pos for + // processing of the remaining edit, and the copy's ref count + // is decremented. As each edit is received the ref count of the + // copy is decrement, and the ref count of the row at the new + // position is incremented. When the copy's ref count goes to 0, + // it is removed. + oldEntry[refCountSymbol]--; let adjustedPos = pos; - - if (newRefCount === 0) { - newView = removeAt(mutate, view, oldPos); + if (oldEntry[refCountSymbol] === 0) { + view.splice(oldPos, 1); adjustedPos = oldPos < pos ? pos - 1 : pos; - } else { - const oldEntryCopy = setRefCount(mutate, oldEntry, newRefCount); - newView = arrayWith(mutate, view, oldPos, oldEntryCopy); } + let entryToEdit; if (found) { - // Merge with existing at new pos - const existingEntry = newView[adjustedPos]; - const editedEntry = applyEdit( - existingEntry, - change, - schema, - withIDs, - mutate, - ); - const updatedEntry = setRefCount( - mutate, - editedEntry, - existingEntry[refCountSymbol] + 1, - ); - return setRelation( - mutate, - parentEntry, - relationship, - arrayWith(mutate, newView, adjustedPos, updatedEntry), - ); + entryToEdit = view[adjustedPos]; } else { - // Insert at new pos with rc=1 - const editedEntry = applyEdit( - oldEntry, - change, - schema, - withIDs, - mutate, - ); - const movedEntry = setRefCount(mutate, editedEntry, 1); - return setRelation( - mutate, - parentEntry, - relationship, - insertAt(mutate, newView, adjustedPos, movedEntry), - ); + view.splice(adjustedPos, 0, oldEntry); + entryToEdit = oldEntry; + if (oldEntry[refCountSymbol] > 0) { + const oldEntryCopy = {...oldEntry}; + view[oldPos] = oldEntryCopy; + } } + entryToEdit[refCountSymbol]++; + applyEdit(entryToEdit, change, schema, withIDs); } } else { - // Sort key unchanged: edit in place + // Position could not have changed, so simply edit in place. const {pos, found} = binarySearch( view, change.oldNode.row, schema.compareRows, ); assert(found, 'node does not exist'); - const newEntry = applyEdit( - view[pos], - change, - schema, - withIDs, - mutate, - ); - return setRelation( - mutate, - parentEntry, - relationship, - arrayWith(mutate, view, pos, newEntry), - ); + applyEdit(view[pos], change, schema, withIDs); } } + + break; } default: unreachable(change); } } -/** - * Batch apply multiple changes to an Entry tree. - * For small batches or complex cases, falls back to sequential applyChange. - * Future optimization: O(N + K) batch processing for large K. - */ -export function applyChanges( - parentEntry: Entry, - changes: ViewChange[], - schema: SourceSchema, - relationship: string, - format: Format, - withIDs: WithIDs = false, - mutate: Mutate = false, -): Entry { - let result = parentEntry; - for (const change of changes) { - result = applyChange( - result, - change, - schema, - relationship, - format, - withIDs, - mutate, - ); - } - return result; -} - -function applyEdit( - existing: MetaEntry, +function applyEdit( + existing: MetaEntry, change: EditViewChange, schema: SourceSchema, - withIDs: WithIDs, - mutate: Mutate, -): MetaEntry { - const newEntry: MutableMetaEntry = - // Even for mutate we want to create a new entry if the primary key changed. - mutate && schema.compareRows(change.oldNode.row, change.node.row) === 0 - ? Object.assign(existing, change.node.row) - : {...existing, ...change.node.row}; - + withIDs: boolean, +) { + Object.assign(existing, change.node.row); if (withIDs) { - return setProperty( - mutate, - newEntry, - idSymbol, - makeID(change.node.row, schema), - ); + existing[idSymbol] = makeID(change.node.row, schema); } - return newEntry; } -/** - * Initialize child relationships on a newly-added entry. - * Returns the same entry reference if no relationships to initialize, - * or a new entry (via spread) if relationships were added. - * - * New nodes don't exist in the view yet, so we can build in-place (no refs to preserve): - * - * Existing node edit (must path-copy): New node (can build in-place): - * - * view: [A, B, C] view: [A, B, _] - * │ │ - * edit C.child add C with children - * │ │ - * ▼ ▼ - * view': [A, B, C'] ◄─ path-copy view': [A, B, C{children:[...]}] - * up the tree └─ built in-place - * - * Hidden schemas still use applyChange to collapse junction levels. - */ -function initializeRelationshipsForNewEntryIfAny( - entry: MutableMetaEntry, - node: ViewNode, - schema: SourceSchema, - childFormats: Record, - withIDs: WithIDs, -): void { - let result = entry; - for (const relationship of Object.keys(node.relationships)) { - const childSchema = must(schema.relationships[relationship]); - const childFormat = childFormats[relationship]; - if (childFormat === undefined) { - continue; - } - - // Hidden/singular: use applyChange to handle properly - if (childSchema.isHidden || childFormat.singular) { - const newView = childFormat.singular - ? undefined - : ([] as MutableMetaEntryList); - result[relationship] = newView; - - for (const childNode of getChildNodes(node, relationship)) { - applyChangeInternal( - result, - {type: 'add', node: childNode}, - childSchema, - relationship, - childFormat, - withIDs, - true, // this is a new entry, so we can mutate - ); - } - } else { - // Plural non-hidden: build array in-place for efficiency - const childArray: MutableMetaEntryList = []; - - for (const childNode of getChildNodes(node, relationship)) { - const newEntry = makeNewMetaEntry( - childNode.row, - childSchema, - withIDs, - 1, - ); - const {pos, found} = binarySearch( - childArray, - childNode.row, - childSchema.compareRows, - ); - - if (found) { - childArray[pos][refCountSymbol]++; - } else { - childArray.splice(pos, 0, newEntry); - initializeRelationshipsForNewEntryIfAny( - newEntry, - childNode, - childSchema, - childFormat.relationships, - withIDs, - ); - } - } - - result[relationship] = childArray; - } - } -} - -function add( +function add( row: Row, - view: MetaEntryList, + view: MetaEntryList, schema: SourceSchema, - withIDs: WithIDs, - mutate: M, -): { - newEntry: MutableMetaEntry | undefined; - newView: MutableMetaEntryList; -} { + withIDs: boolean, +): MetaEntry | undefined { const {pos, found} = binarySearch(view, row, schema.compareRows); if (found) { - const existing = view[pos]; - - const updated = incRefCount(mutate, existing); - return { - newEntry: undefined, - newView: arrayWith(mutate, view, pos, updated), - }; + view[pos][refCountSymbol]++; + return undefined; } const newEntry = makeNewMetaEntry(row, schema, withIDs, 1); - return {newEntry, newView: insertAt(mutate, view, pos, newEntry)}; -} - -function insertAt( - mutate: M, - array: MutableArray, - index: number, - item: T, -): T[] { - if (mutate) { - (array as T[]).splice(index, 0, item); - return array as T[]; - } - return array.toSpliced(index, 0, item); -} - -function removeAt( - mutate: M, - array: MutableArray, - index: number, -): T[] { - if (mutate) { - (array as T[]).splice(index, 1); - return array as T[]; - } - return array.toSpliced(index, 1); + view.splice(pos, 0, newEntry); + return newEntry; } -function removeAndUpdateRefCount( - view: MetaEntryList, +function removeAndUpdateRefCount( + view: MetaEntryList, row: Row, compareRows: Comparator, - mutate: M, -): MutableMetaEntryList { +): MetaEntry { const {pos, found} = binarySearch(view, row, compareRows); assert(found, 'node does not exist'); const oldEntry = view[pos]; const rc = oldEntry[refCountSymbol]; if (rc === 1) { - return removeAt(mutate, view, pos); + view.splice(pos, 1); } - const newEntry = decRefCount(mutate, oldEntry); - return arrayWith(mutate, view, pos, newEntry); + oldEntry[refCountSymbol]--; + + return oldEntry; } +// TODO: Do not return an object. It puts unnecessary pressure on the GC. function binarySearch( - view: MetaEntryList, + view: MetaEntryList, target: Row, comparator: Comparator, ) { @@ -709,8 +367,7 @@ function binarySearch( let high = view.length - 1; while (low <= high) { const mid = (low + high) >>> 1; - // MetaEntry has all Row props; comparator only reads string keys - const comparison = comparator(view[mid] as Row, target); + const comparison = comparator(view[mid] as Row, target as Row); if (comparison < 0) { low = mid + 1; } else if (comparison > 0) { @@ -722,61 +379,36 @@ function binarySearch( return {pos: low, found: false}; } -/** Assert value is MetaEntry (has refCountSymbol). */ -function assertMetaEntry( - v: unknown, -): asserts v is MetaEntry { - assertNumber((v as Partial>)[refCountSymbol]); -} - -/** Get singular MetaEntry, throws if missing. */ -function getSingularEntry( - parentEntry: MetaEntry, +function getChildEntryList( + parentEntry: Entry, relationship: string, -): MetaEntry { - const entry = parentEntry[relationship]; - assert(entry !== undefined, 'node does not exist'); - assertMetaEntry(entry); - return entry; +): MetaEntryList { + const view = parentEntry[relationship]; + assertArray(view); + return view as MetaEntryList; } -/** Get singular MetaEntry or undefined if not set. */ -function getOptionalSingularEntry( - parentEntry: MetaEntry, - relationship: string, -): MetaEntry | undefined { - const entry = parentEntry[relationship]; - if (entry === undefined) { - return undefined; - } - assertMetaEntry(entry); - return entry; +function assertMetaEntry(v: unknown): asserts v is MetaEntry { + assertNumber((v as Partial)[refCountSymbol]); } -/** Get child array as MetaEntryList. */ -function getChildEntryList( - parentEntry: MetaEntry, - relationship: string, -): MetaEntryList { - const view = parentEntry[relationship]; - assertArray(view); - return view as MetaEntryList; +function getSingularEntry(parentEntry: Entry, relationship: string): MetaEntry { + const e = parentEntry[relationship]; + assertNumber((e as Partial)[refCountSymbol]); + return e as MetaEntry; } -/** Create MetaEntry from row with given refCount. */ function makeNewMetaEntry( row: Row, schema: SourceSchema, - withIDs: WithIDs, + withIDs: boolean, rc: number, -): MutableMetaEntry { - // This creates a new MetaEntry from a Row. We never mutate Rows. +): MetaEntry { if (withIDs) { return {...row, [refCountSymbol]: rc, [idSymbol]: makeID(row, schema)}; } return {...row, [refCountSymbol]: rc}; } - function makeID(row: Row, schema: SourceSchema) { // optimization for case of non-compound primary key if (schema.primaryKey.length === 1) { @@ -784,66 +416,3 @@ function makeID(row: Row, schema: SourceSchema) { } return JSON.stringify(schema.primaryKey.map(k => row[k])); } - -function incRefCount( - mutate: M, - entry: MetaEntry, -): MutableMetaEntry { - return setRefCount(mutate, entry, entry[refCountSymbol] + 1); -} - -function decRefCount( - mutate: M, - entry: MetaEntry, -): MutableMetaEntry { - return setRefCount(mutate, entry, entry[refCountSymbol] - 1); -} - -function setRefCount( - mutate: M, - entry: MetaEntry, - count: number, -): MutableMetaEntry { - if (mutate) { - (entry as MutableMetaEntry)[refCountSymbol] = count; - return entry; - } - return {...entry, [refCountSymbol]: count}; -} - -function arrayWith( - mutate: M, - array: MutableArray, - index: number, - value: T, -): T[] { - if (mutate) { - (array as T[])[index] = value; - return array as T[]; - } - return array.with(index, value); -} - -function setProperty< - M extends Mutate, - K extends string | keyof MetaEntry, - V, ->( - mutate: M, - parentEntry: MetaEntry, - key: K, - value: V, -): MutableMetaEntry & {[P in K]: V} { - if (mutate) { - (parentEntry as {[P in K]: V})[key] = value; - return parentEntry as MutableMetaEntry & {[P in K]: V}; - } - return {...parentEntry, [key]: value}; -} - -const setRelation: ( - mutate: M, - parentEntry: MetaEntry, - relationship: string, - value: Entry | Entry[] | undefined, -) => MutableMetaEntry = setProperty; diff --git a/packages/zql/src/query/query-delegate-base.ts b/packages/zql/src/query/query-delegate-base.ts index a472bf4589..7ad9da3b07 100644 --- a/packages/zql/src/query/query-delegate-base.ts +++ b/packages/zql/src/query/query-delegate-base.ts @@ -433,6 +433,8 @@ function arrayViewFactory< updateTTL, ); v.onDestroy = onDestroy; - onTransactionCommit(() => v.flush()); + onTransactionCommit(() => { + v.flush(); + }); return v; } diff --git a/packages/zql/src/query/query-impl.query.test.ts b/packages/zql/src/query/query-impl.query.test.ts index 8e5bc8ee80..7f02305caa 100644 --- a/packages/zql/src/query/query-impl.query.test.ts +++ b/packages/zql/src/query/query-impl.query.test.ts @@ -6,8 +6,8 @@ import {must} from '../../../shared/src/must.ts'; import {relationships} from '../../../zero-schema/src/builder/relationship-builder.ts'; import {createSchema} from '../../../zero-schema/src/builder/schema-builder.ts'; import {number, table} from '../../../zero-schema/src/builder/table-builder.ts'; -import {consume} from '../ivm/stream.ts'; import {createSource} from '../ivm/test/source-factory.ts'; +import {consume} from '../ivm/stream.ts'; import type {QueryDelegate} from './query-delegate.ts'; import {newQuery} from './query-impl.ts'; import {asQueryInternals} from './query-internals.ts'; diff --git a/tsconfig.json b/tsconfig.json index 28b7788f7e..59da6fd5c2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "es2022", - "lib": ["ES2022", "ES2023.Array", "ES2023.Collection", "DOM", "DOM.Iterable"], + "lib": ["ES2022", "ES2023.Collection", "DOM", "DOM.Iterable"], "module": "NodeNext", "verbatimModuleSyntax": true, "erasableSyntaxOnly": true, From d2ea4201cb5fcea094941b938138020c753279fb Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 26 Feb 2026 11:54:50 -0800 Subject: [PATCH 107/495] chore(zero-cache): set an idle_in_transaction_session_timeout (#5620) Sets an `idle_in_transaction_session_timeout` on all zero-cache transactions to mitigate the effect an orphaned transaction (due to network issues / lost commands) from wreaking havoc on the db. Also explicitly set each transaction's isolation level to avoid any complications due to provider or user settings of the `default_transaction_isolation`. (None are actually changed in this PR) Incident: * https://rocicorp.slack.com/archives/C0A8NUDMDM1/p1772050286908219?thread_ts=1772049792.193079&cid=C0A8NUDMDM1 --- packages/zero-cache/src/db/migration.ts | 13 +- .../src/db/run-transaction.pg.test.ts | 54 ++++++ packages/zero-cache/src/db/run-transaction.ts | 61 +++++++ .../zero-cache/src/db/transaction-pool.ts | 11 +- .../src/scripts/deploy-permissions.ts | 3 +- .../change-source/pg/change-source.ts | 3 +- .../services/change-source/pg/decommission.ts | 3 +- .../services/change-source/pg/initial-sync.ts | 13 +- .../services/change-streamer/schema/tables.ts | 7 +- .../src/services/change-streamer/storer.ts | 46 ++--- .../src/services/mutagen/mutagen.ts | 41 +++-- .../src/services/view-syncer/cvr-purger.ts | 109 ++++++------ .../src/services/view-syncer/cvr-store.ts | 164 +++++++++--------- .../services/view-syncer/row-record-cache.ts | 19 +- packages/zero-cache/src/types/pg.pg.test.ts | 24 +-- 15 files changed, 339 insertions(+), 232 deletions(-) create mode 100644 packages/zero-cache/src/db/run-transaction.pg.test.ts create mode 100644 packages/zero-cache/src/db/run-transaction.ts diff --git a/packages/zero-cache/src/db/migration.ts b/packages/zero-cache/src/db/migration.ts index 5e1da5cbef..ec150c1ca5 100644 --- a/packages/zero-cache/src/db/migration.ts +++ b/packages/zero-cache/src/db/migration.ts @@ -3,11 +3,8 @@ import type postgres from 'postgres'; import {assert} from '../../../shared/src/asserts.ts'; import {must} from '../../../shared/src/must.ts'; import * as v from '../../../shared/src/valita.ts'; -import { - disableStatementTimeout, - type PostgresDB, - type PostgresTransaction, -} from '../types/pg.ts'; +import {type PostgresDB, type PostgresTransaction} from '../types/pg.ts'; +import {runTx} from './run-transaction.ts'; type Operations = (log: LogContext, tx: PostgresTransaction) => Promise; @@ -84,7 +81,7 @@ export async function runSchemaMigrations( `Checking schema for compatibility with ${debugName} at schema v${codeVersion}`, ); - let versions = await db.begin(async tx => { + let versions = await runTx(db, async tx => { const versions = await ensureVersionHistory(tx, schemaName); if (codeVersion < versions.minSafeVersion) { throw new Error( @@ -115,9 +112,7 @@ export async function runSchemaMigrations( ); void log.flush(); // Flush logs before each migration to help debug crash-y migrations. - versions = await db.begin(async tx => { - disableStatementTimeout(tx); - + versions = await runTx(db, async tx => { // Fetch meta from within the transaction to make the migration atomic. let versions = await ensureVersionHistory(tx, schemaName); if (versions.dataVersion < dest) { diff --git a/packages/zero-cache/src/db/run-transaction.pg.test.ts b/packages/zero-cache/src/db/run-transaction.pg.test.ts new file mode 100644 index 0000000000..8f8578c8bd --- /dev/null +++ b/packages/zero-cache/src/db/run-transaction.pg.test.ts @@ -0,0 +1,54 @@ +import {beforeEach, describe, expect} from 'vitest'; +import {test, type PgTest} from '../test/db.ts'; +import {type PostgresDB} from '../types/pg.ts'; +import {runTx} from './run-transaction.ts'; + +describe('db/run-transaction', () => { + let db: PostgresDB; + + beforeEach(async ({testDBs}) => { + db = await testDBs.create('run_transaction'); + // Ensures deterministic behavior of the tests + + return () => testDBs.drop(db); + }); + + test('statement timeout disabled', async () => { + await db`SET statement_timeout = 100000`; + expect(await db`SHOW statement_timeout`).toMatchInlineSnapshot(` + Result [ + { + "statement_timeout": "100s", + }, + ] + `); + + const txResult = await runTx(db, tx => tx`SHOW statement_timeout`); + expect(txResult).toMatchInlineSnapshot(` + Result [ + { + "statement_timeout": "0", + }, + ] + `); + }); + + test('idle in transaction session timeout', async () => { + expect(await db`SHOW idle_in_transaction_session_timeout`) + .toMatchInlineSnapshot(` + Result [ + { + "idle_in_transaction_session_timeout": "0", + }, + ] + `); + expect(await runTx(db, tx => tx`SHOW idle_in_transaction_session_timeout`)) + .toMatchInlineSnapshot(` + Result [ + { + "idle_in_transaction_session_timeout": "1min", + }, + ] + `); + }); +}); diff --git a/packages/zero-cache/src/db/run-transaction.ts b/packages/zero-cache/src/db/run-transaction.ts new file mode 100644 index 0000000000..f1b194ef39 --- /dev/null +++ b/packages/zero-cache/src/db/run-transaction.ts @@ -0,0 +1,61 @@ +import type {Enum} from '../../../shared/src/enum.ts'; +import {type PostgresDB, type PostgresTransaction} from '../types/pg.ts'; +import type * as Mode from './mode-enum.ts'; +import {READ_COMMITTED} from './mode-enum.ts'; + +type Mode = Enum; + +// The default timeout is settable by ZERO_IDLE_IN_TRANSACTION_SESSION_TIMEOUT +// as an emergency measure and is explicitly not made available as a server +// option. This value is function of how the zero-cache uses transactions, and +// should never need to be "tuned" or adjusted for different environments. +const IDLE_IN_TRANSACTION_SESSION_TIMEOUT_MS = parseInt( + process.env.ZERO_IDLE_IN_TRANSACTION_SESSION_TIMEOUT ?? '60000', +); + +export type TransactionOptions = { + mode?: Mode; +}; + +/** + * Runs a zero-cache transaction on the given postgres DB. For consistency + * across various postgres providers, certain transaction-level parameters + * are set to override any defaults set by the provider, including: + * * `statement_timeout` (disabled) + * * `idle_in_transaction_session_timeout` (1min) + */ +export function runTx( + db: PostgresDB, + fn: (tx: PostgresTransaction) => T | Promise, + opts: TransactionOptions = {}, +) { + const { + // Explicitly default to the Postgres default to override any custom + // `default_transaction_isolation`. + mode = READ_COMMITTED, + } = opts; + return db.begin(mode, sql => { + // Disable any statement_timeout for the current transaction. By default, + // Postgres does not impose a statement timeout, but some users and + // providers set one at the database level (even though it is explicitly + // discouraged by the Postgres documentation). + // + // Zero logic in particular often does not fit into the category of general + // application logic; for potentially long-running operations like + // migrations and background cleanup, the statement timeout should be + // disabled to prevent these operations from timing out. + void sql`SET LOCAL statement_timeout = 0;`.execute(); + + // Set an idle_in_transaction_session_timeout to limit the blast radius of + // orphaned transactions. The zero-cache does not keep transactions open + // and idle (though this may change if support for streaming of in-progress + // transactions is added to our logical replication layer). + void sql + .unsafe( + /*sql*/ `SET LOCAL idle_in_transaction_session_timeout = ${IDLE_IN_TRANSACTION_SESSION_TIMEOUT_MS}`, + ) + .execute(); + + return fn(sql); + }); +} diff --git a/packages/zero-cache/src/db/transaction-pool.ts b/packages/zero-cache/src/db/transaction-pool.ts index bf2c8c354b..5ba6699369 100644 --- a/packages/zero-cache/src/db/transaction-pool.ts +++ b/packages/zero-cache/src/db/transaction-pool.ts @@ -5,12 +5,9 @@ import {assert} from '../../../shared/src/asserts.ts'; import type {Enum} from '../../../shared/src/enum.ts'; import {Queue} from '../../../shared/src/queue.ts'; import {promiseVoid} from '../../../shared/src/resolved-promises.ts'; -import { - disableStatementTimeout, - type PostgresDB, - type PostgresTransaction, -} from '../types/pg.ts'; +import {type PostgresDB, type PostgresTransaction} from '../types/pg.ts'; import type * as Mode from './mode-enum.ts'; +import {runTx} from './run-transaction.ts'; type Mode = Enum; @@ -186,7 +183,6 @@ export class TransactionPool { const start = performance.now(); try { lc.debug?.('started transaction'); - disableStatementTimeout(tx); let last: Promise = promiseVoid; @@ -235,8 +231,7 @@ export class TransactionPool { }; this.#workers.push( - db - .begin(this.#mode, worker) + runTx(db, worker, {mode: this.#mode}) .catch(e => { if (e instanceof RollbackSignal) { // A RollbackSignal is used to gracefully rollback the postgres.js diff --git a/packages/zero-cache/src/scripts/deploy-permissions.ts b/packages/zero-cache/src/scripts/deploy-permissions.ts index 7205a3a763..2556b254c6 100644 --- a/packages/zero-cache/src/scripts/deploy-permissions.ts +++ b/packages/zero-cache/src/scripts/deploy-permissions.ts @@ -13,6 +13,7 @@ import { } from '../../../zero-schema/src/compiled-permissions.ts'; import {validator} from '../../../zero-schema/src/name-mapper.ts'; import {ZERO_ENV_VAR_PREFIX} from '../config/zero-config.ts'; +import {runTx} from '../db/run-transaction.ts'; import {getPublicationInfo} from '../services/change-source/pg/schema/published.ts'; import { ensureGlobalTables, @@ -128,7 +129,7 @@ async function deployPermissions( try { await ensureGlobalTables(db, shard); - const {hash, changed} = await db.begin(async tx => { + const {hash, changed} = await runTx(db, async tx => { if (force) { colorConsole.warn(`--force specified. Skipping validation.`); } else { diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 95f326943f..0d104d4a88 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -22,6 +22,7 @@ import { mapPostgresToLiteColumn, UnsupportedColumnDefaultError, } from '../../../db/pg-to-lite.ts'; +import {runTx} from '../../../db/run-transaction.ts'; import type {ColumnSpec, PublishedTableSpec} from '../../../db/specs.ts'; import {StatementRunner} from '../../../db/statements.ts'; import {type LexiVersion} from '../../../types/lexi-version.ts'; @@ -442,7 +443,7 @@ class PostgresChangeSource implements ChangeSource { const slotExpression = replicationSlotExpression(this.#shard); const legacySlotName = legacyReplicationSlot(this.#shard); - const result = await db.begin(async sql => { + const result = await runTx(db, async sql => { // Note: `slot_name <= slotToKeep` uses a string compare of the millisecond // timestamp, which works until it exceeds 13 digits (sometime in 2286). const result = await sql< diff --git a/packages/zero-cache/src/services/change-source/pg/decommission.ts b/packages/zero-cache/src/services/change-source/pg/decommission.ts index 857bfc3c6d..47edb76383 100644 --- a/packages/zero-cache/src/services/change-source/pg/decommission.ts +++ b/packages/zero-cache/src/services/change-source/pg/decommission.ts @@ -1,4 +1,5 @@ import type {LogContext} from '@rocicorp/logger'; +import {runTx} from '../../../db/run-transaction.ts'; import type {PostgresDB} from '../../../types/pg.ts'; import {dropShard} from './schema/shard.ts'; @@ -11,7 +12,7 @@ export async function decommissionShard( const shard = `${appID}_${shardID}`; lc.info?.(`Decommissioning zero shard ${shard}`); - await db.begin(async sql => { + await runTx(db, async sql => { // Kill the active_pid's on existing slots before altering publications, // as deleting a publication associated with an existing subscriber causes // weirdness; the active_pid becomes null and thus unable to be terminated. diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index dfcb09c6e5..8971bfafa9 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -21,6 +21,7 @@ import { mapPostgresToLiteIndex, } from '../../../db/pg-to-lite.ts'; import {getTypeParsers} from '../../../db/pg-type-parser.ts'; +import {runTx} from '../../../db/run-transaction.ts'; import type {IndexSpec, PublishedTableSpec} from '../../../db/specs.ts'; import {importSnapshot, TransactionPool} from '../../../db/transaction-pool.ts'; import { @@ -140,10 +141,14 @@ export async function initialSync( // Run up to MAX_WORKERS to copy of tables at the replication slot's snapshot. const start = performance.now(); // Retrieve the published schema at the consistent_point. - const published = await sql.begin(Mode.READONLY, async tx => { - await tx.unsafe(/* sql*/ `SET TRANSACTION SNAPSHOT '${snapshot}'`); - return getPublicationInfo(tx, publications); - }); + const published = await runTx( + sql, + async tx => { + await tx.unsafe(/* sql*/ `SET TRANSACTION SNAPSHOT '${snapshot}'`); + return getPublicationInfo(tx, publications); + }, + {mode: Mode.READONLY}, + ); // Note: If this throws, initial-sync is aborted. validatePublications(lc, published); diff --git a/packages/zero-cache/src/services/change-streamer/schema/tables.ts b/packages/zero-cache/src/services/change-streamer/schema/tables.ts index 7ec376f830..76c514d260 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/tables.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/tables.ts @@ -4,7 +4,8 @@ import type postgres from 'postgres'; import {type PendingQuery, type Row} from 'postgres'; import {AbortError} from '../../../../../shared/src/abort-error.ts'; import {equals} from '../../../../../shared/src/set-utils.ts'; -import {disableStatementTimeout, type PostgresDB} from '../../../types/pg.ts'; +import {runTx} from '../../../db/run-transaction.ts'; +import {type PostgresDB} from '../../../types/pg.ts'; import {cdcSchema, type ShardID} from '../../../types/shards.ts'; import type { BackfillID, @@ -177,9 +178,7 @@ export async function ensureReplicationConfig( }; const schema = cdcSchema(shard); - await db.begin(async sql => { - disableStatementTimeout(sql); - + await runTx(db, async sql => { const stmts: PendingQuery[] = []; const results = await sql< { diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 46d473baee..186d2e00bf 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -10,12 +10,9 @@ import {Queue} from '../../../../shared/src/queue.ts'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; import * as v from '../../../../shared/src/valita.ts'; import * as Mode from '../../db/mode-enum.ts'; +import {runTx} from '../../db/run-transaction.ts'; import {TransactionPool} from '../../db/transaction-pool.ts'; -import { - disableStatementTimeout, - type PostgresDB, - type PostgresTransaction, -} from '../../types/pg.ts'; +import {type PostgresDB, type PostgresTransaction} from '../../types/pg.ts'; import {cdcSchema, type ShardID} from '../../types/shards.ts'; import { backfillRequestSchema, @@ -188,8 +185,8 @@ export class Storer implements Service { this.#queue.enqueue(['ready', resolve]); await ready; - const [[{lastWatermark}], result] = await this.#db.begin( - Mode.READONLY, + const [[{lastWatermark}], result] = await runTx( + this.#db, sql => [ sql<{lastWatermark: string}[]>` SELECT "lastWatermark" FROM ${this.#cdc('replicationState')}`, @@ -212,6 +209,7 @@ export class Storer implements Service { GROUP BY b."schema", b."table", t."metadata" `, ], + {mode: Mode.READONLY}, ); return { @@ -229,28 +227,30 @@ export class Storer implements Service { } purgeRecordsBefore(watermark: string): Promise { - return this.#db.begin(Mode.SERIALIZABLE, async sql => { - disableStatementTimeout(sql); - - // Check ownership before performing the purge. The server is expected to - // exit immediately when an ownership change is detected, but checking - // explicitly guards against race conditions. - const [{owner}] = await sql` + return runTx( + this.#db, + async sql => { + // Check ownership before performing the purge. The server is expected to + // exit immediately when an ownership change is detected, but checking + // explicitly guards against race conditions. + const [{owner}] = await sql` SELECT * FROM ${this.#cdc('replicationState')}`; - if (owner !== this.#taskID) { - this.#lc.warn?.( - `Ignoring change log purge request (${watermark}) while not owner`, - ); - return 0; - } + if (owner !== this.#taskID) { + this.#lc.warn?.( + `Ignoring change log purge request (${watermark}) while not owner`, + ); + return 0; + } - const [{deleted}] = await sql<{deleted: bigint}[]>` + const [{deleted}] = await sql<{deleted: bigint}[]>` WITH purged AS ( DELETE FROM ${this.#cdc('changeLog')} WHERE watermark < ${watermark} RETURNING watermark, pos ) SELECT COUNT(*) as deleted FROM purged;`; - return Number(deleted); - }); + return Number(deleted); + }, + {mode: Mode.SERIALIZABLE}, // TODO: remove SERIALIZABLE + ); } /** diff --git a/packages/zero-cache/src/services/mutagen/mutagen.ts b/packages/zero-cache/src/services/mutagen/mutagen.ts index 529d1924be..95e11d4077 100644 --- a/packages/zero-cache/src/services/mutagen/mutagen.ts +++ b/packages/zero-cache/src/services/mutagen/mutagen.ts @@ -32,6 +32,7 @@ import { } from '../../auth/write-authorizer.ts'; import {type ZeroConfig} from '../../config/zero-config.ts'; import * as Mode from '../../db/mode-enum.ts'; +import {runTx} from '../../db/run-transaction.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import {recordMutation} from '../../server/anonymous-otel-start.ts'; import type {PostgresDB, PostgresTransaction} from '../../types/pg.ts'; @@ -233,24 +234,28 @@ export async function processMutation( let errorMode = false; for (let i = 0; i < MAX_SERIALIZATION_ATTEMPTS; i++) { try { - await db.begin(Mode.SERIALIZABLE, async tx => { - // Simulates a concurrent request for testing. In production this is a noop. - const done = onTxStart?.(); - try { - return await processMutationWithTx( - lc, - tx, - authData, - shard, - clientGroupID, - mutation, - errorMode, - writeAuthorizer, - ); - } finally { - await done; - } - }); + await runTx( + db, + async tx => { + // Simulates a concurrent request for testing. In production this is a noop. + const done = onTxStart?.(); + try { + return await processMutationWithTx( + lc, + tx, + authData, + shard, + clientGroupID, + mutation, + errorMode, + writeAuthorizer, + ); + } finally { + await done; + } + }, + {mode: Mode.SERIALIZABLE}, + ); if (errorMode) { lc.debug?.('Ran mutation successfully in error mode'); } diff --git a/packages/zero-cache/src/services/view-syncer/cvr-purger.ts b/packages/zero-cache/src/services/view-syncer/cvr-purger.ts index 03951ec37d..6595a32cfd 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr-purger.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr-purger.ts @@ -1,7 +1,8 @@ import type {LogContext} from '@rocicorp/logger'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; import {READ_COMMITTED} from '../../db/mode-enum.ts'; -import {disableStatementTimeout, type PostgresDB} from '../../types/pg.ts'; +import {runTx} from '../../db/run-transaction.ts'; +import {type PostgresDB} from '../../types/pg.ts'; import {cvrSchema, type ShardID} from '../../types/shards.ts'; import {RunningState} from '../running-state.ts'; import type {Service} from '../service.ts'; @@ -100,56 +101,56 @@ export class CVRPurger implements Service { purgeInactiveCVRs( maxCVRs: number, ): Promise<{purged: number; remaining: number}> { - return this.#db.begin(READ_COMMITTED, async sql => { - disableStatementTimeout(sql); - - const now = Date.now(); - const threshold = now - this.#inactivityThresholdMs; - const tombstonePurgeThreshold = now - this.#tombstonePurgeThresholdMs; - // Implementation note: `FOR UPDATE` will prevent a syncer from - // concurrently updating the CVR, since the update also performs - // a `SELECT ... FOR UPDATE`, instead causing that update to - // fail, which will cause the client to create a new CVR. - // - // `SKIP LOCKED` will skip over CVRs that a syncer is already - // in the process of updating. In this manner, an in-progress - // update effectively excludes the CVR from the purge. - const ids = ( - await sql<{clientGroupID: string}[]>` + return runTx( + this.#db, + async sql => { + const now = Date.now(); + const threshold = now - this.#inactivityThresholdMs; + const tombstonePurgeThreshold = now - this.#tombstonePurgeThresholdMs; + // Implementation note: `FOR UPDATE` will prevent a syncer from + // concurrently updating the CVR, since the update also performs + // a `SELECT ... FOR UPDATE`, instead causing that update to + // fail, which will cause the client to create a new CVR. + // + // `SKIP LOCKED` will skip over CVRs that a syncer is already + // in the process of updating. In this manner, an in-progress + // update effectively excludes the CVR from the purge. + const ids = ( + await sql<{clientGroupID: string}[]>` SELECT "clientGroupID" FROM ${sql(this.#schema)}.instances WHERE NOT "deleted" AND "lastActive" < ${threshold} ORDER BY "lastActive" ASC LIMIT ${maxCVRs} FOR UPDATE SKIP LOCKED `.values() - ).flat(); - - if (ids.length > 0) { - // Explicitly delete rows from cvr tables from "bottom" up. Relying on - // foreign key cascading deletes can be suboptimal when the foreign key - // is not a prefix of the primary key (e.g. the "desires" foreign key - // reference to the "queries" table is not a prefix of the "desires" - // primary key). - const stmts = [ - 'desires', - 'queries', - 'clients', - 'rows', - 'rowsVersion', - ].map(table => - sql` + ).flat(); + + if (ids.length > 0) { + // Explicitly delete rows from cvr tables from "bottom" up. Relying on + // foreign key cascading deletes can be suboptimal when the foreign key + // is not a prefix of the primary key (e.g. the "desires" foreign key + // reference to the "queries" table is not a prefix of the "desires" + // primary key). + const stmts = [ + 'desires', + 'queries', + 'clients', + 'rows', + 'rowsVersion', + ].map(table => + sql` DELETE FROM ${sql(this.#schema)}.${sql(table)} WHERE "clientGroupID" IN ${sql(ids)}`.execute(), - ); - // Tombstones are written for the `instances` rows, preserving the - // "profileID" and "lastActive" columns for computing usage stats. - // - // For backwards compatibility (i.e. older zero-caches that do not - // check the "deleted" column) reset the "version" to '00' to trigger - // the ClientNotFound error via - // view-syncer.ts:checkClientAndCVRVersions() - stmts.push( - sql` + ); + // Tombstones are written for the `instances` rows, preserving the + // "profileID" and "lastActive" columns for computing usage stats. + // + // For backwards compatibility (i.e. older zero-caches that do not + // check the "deleted" column) reset the "version" to '00' to trigger + // the ClientNotFound error via + // view-syncer.ts:checkClientAndCVRVersions() + stmts.push( + sql` UPDATE ${sql(this.#schema)}.instances SET "deleted" = TRUE, "version" = '00', @@ -159,24 +160,26 @@ export class CVRPurger implements Service { "grantedAt" = NULL, "clientSchema" = NULL WHERE "clientGroupID" IN ${sql(ids)}`.execute(), - ); - // Tombstone rows are deleted after the tombstonePurgeThreshold. - stmts.push( - sql` + ); + // Tombstone rows are deleted after the tombstonePurgeThreshold. + stmts.push( + sql` DELETE FROM ${sql(this.#schema)}.instances WHERE "deleted" AND "lastActive" < ${tombstonePurgeThreshold} `.execute(), - ); - await Promise.all(stmts); - } + ); + await Promise.all(stmts); + } - const [{remaining}] = await sql<[{remaining: bigint}]>` + const [{remaining}] = await sql<[{remaining: bigint}]>` SELECT COUNT(*) AS remaining FROM ${sql(this.#schema)}.instances WHERE NOT "deleted" AND "lastActive" < ${threshold} `; - return {purged: ids.length, remaining: Number(remaining)}; - }); + return {purged: ids.length, remaining: Number(remaining)}; + }, + {mode: READ_COMMITTED}, + ); } stop(): Promise { diff --git a/packages/zero-cache/src/services/view-syncer/cvr-store.ts b/packages/zero-cache/src/services/view-syncer/cvr-store.ts index ad77cd4fdd..434369bd46 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr-store.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr-store.ts @@ -19,6 +19,7 @@ import {ErrorOrigin} from '../../../../zero-protocol/src/error-origin.ts'; import type {InspectQueryRow} from '../../../../zero-protocol/src/inspect-down.ts'; import {clampTTL, DEFAULT_TTL_MS} from '../../../../zql/src/query/ttl.ts'; import * as Mode from '../../db/mode-enum.ts'; +import {runTx} from '../../db/run-transaction.ts'; import {TransactionPool} from '../../db/transaction-pool.ts'; import {recordRowsSynced} from '../../server/anonymous-otel-start.ts'; import {ProtocolErrorWithLevel} from '../../types/error-with-level.ts'; @@ -272,8 +273,9 @@ export class CVRStore { profileID: null, }; - const [instance, clientsRows, queryRows, desiresRows] = - await this.#db.begin(Mode.READONLY, tx => { + const [instance, clientsRows, queryRows, desiresRows] = await runTx( + this.#db, + tx => { lc.debug?.(`CVR tx started after ${Date.now() - start} ms`); return [ tx< @@ -313,7 +315,9 @@ export class CVRStore { FROM ${this.#cvr('desires')} WHERE "clientGroupID" = ${id}`, ]; - }); + }, + {mode: Mode.READONLY}, + ); lc.debug?.( `CVR tx completed after ${Date.now() - start} ms ` + `(${clientsRows.length} clients, ${queryRows.length} queries, ${desiresRows.length} desires)`, @@ -1007,88 +1011,92 @@ export class CVRStore { // Use an async callback so we can await the version/ownership check and // validate it INSIDE the transaction. If validation fails, the exception // causes postgres.js to ROLLBACK, ensuring no writes are committed on error. - const results = await this.#db.begin(Mode.READ_COMMITTED, async tx => { - lc.debug?.(`flush tx begun after ${Date.now() - start} ms`); - - // Acquire row-level lock and validate version/ownership before queuing writes. - // Throwing here (inside the begin callback) rolls back the transaction so that - // no writes are committed when concurrent modification or ownership errors occur. - await this.#checkVersionAndOwnership( - lc, - tx, - expectedCurrentVersion, - lastConnectTime, - ); - - const writeQueries = []; - if (this.#pendingInstanceWrite) { - writeQueries.push(this.#pendingInstanceWrite(tx, lastConnectTime)); - stats.instances++; - stats.statements++; - } - for (const write of this.#writes) { - stats.clients += write.stats.clients ?? 0; - stats.rows += write.stats.rows ?? 0; - - writeQueries.push(write.write(tx, lastConnectTime)); - stats.statements++; - } - - // Batch flush config writes - // Flush queries first (desires depend on queries via foreign key) - const hasQueryUpdates = - this.#pendingQueryUpdates.size > 0 || - this.#pendingQueryPartialUpdates.size > 0; - - const desireFlush = this.#flushDesires(tx, lc); - - let queryFlushes: PendingQuery[] = []; - if (hasQueryUpdates) { - queryFlushes = this.#flushQueries(tx, lc); + const results = await runTx( + this.#db, + async tx => { + lc.debug?.(`flush tx begun after ${Date.now() - start} ms`); + + // Acquire row-level lock and validate version/ownership before queuing writes. + // Throwing here (inside the begin callback) rolls back the transaction so that + // no writes are committed when concurrent modification or ownership errors occur. + await this.#checkVersionAndOwnership( + lc, + tx, + expectedCurrentVersion, + lastConnectTime, + ); - // Count both full updates and partial-only updates - const partialOnlyCount = Array.from( - this.#pendingQueryPartialUpdates.keys(), - ).filter(key => !this.#pendingQueryUpdates.has(key)).length; + const writeQueries = []; + if (this.#pendingInstanceWrite) { + writeQueries.push(this.#pendingInstanceWrite(tx, lastConnectTime)); + stats.instances++; + stats.statements++; + } + for (const write of this.#writes) { + stats.clients += write.stats.clients ?? 0; + stats.rows += write.stats.rows ?? 0; - stats.queries = this.#pendingQueryUpdates.size + partialOnlyCount; - stats.statements += - (this.#pendingQueryUpdates.size > 0 ? 1 : 0) + - (partialOnlyCount > 0 ? 1 : 0); + writeQueries.push(write.write(tx, lastConnectTime)); + stats.statements++; + } - if (desireFlush) { + // Batch flush config writes + // Flush queries first (desires depend on queries via foreign key) + const hasQueryUpdates = + this.#pendingQueryUpdates.size > 0 || + this.#pendingQueryPartialUpdates.size > 0; + + const desireFlush = this.#flushDesires(tx, lc); + + let queryFlushes: PendingQuery[] = []; + if (hasQueryUpdates) { + queryFlushes = this.#flushQueries(tx, lc); + + // Count both full updates and partial-only updates + const partialOnlyCount = Array.from( + this.#pendingQueryPartialUpdates.keys(), + ).filter(key => !this.#pendingQueryUpdates.has(key)).length; + + stats.queries = this.#pendingQueryUpdates.size + partialOnlyCount; + stats.statements += + (this.#pendingQueryUpdates.size > 0 ? 1 : 0) + + (partialOnlyCount > 0 ? 1 : 0); + + if (desireFlush) { + stats.desires = this.#pendingDesireUpdates.size; + stats.statements++; + } + } else if (desireFlush) { stats.desires = this.#pendingDesireUpdates.size; stats.statements++; } - } else if (desireFlush) { - stats.desires = this.#pendingDesireUpdates.size; - stats.statements++; - } - const rowUpdates = this.#rowCache.executeRowUpdates( - tx, - cvr.version, - this.#pendingRowRecordUpdates, - 'allow-defer', - lc, - ); - stats.statements += rowUpdates.length; - - // Pipeline writes now that the version check has passed. - const pipelined = [ - ...writeQueries, - ...queryFlushes, - ...(desireFlush ? [desireFlush] : []), - ...rowUpdates, - ]; - - lc.debug?.(`returning ${pipelined.length} queries for pipelining`); - - // Explicitly await all pipelined queries. When the begin callback is async, - // postgres.js does not call Promise.all() on the return value the way it does - // for sync callbacks, so we must do it ourselves. - return Promise.all(pipelined); - }); + const rowUpdates = this.#rowCache.executeRowUpdates( + tx, + cvr.version, + this.#pendingRowRecordUpdates, + 'allow-defer', + lc, + ); + stats.statements += rowUpdates.length; + + // Pipeline writes now that the version check has passed. + const pipelined = [ + ...writeQueries, + ...queryFlushes, + ...(desireFlush ? [desireFlush] : []), + ...rowUpdates, + ]; + + lc.debug?.(`returning ${pipelined.length} queries for pipelining`); + + // Explicitly await all pipelined queries. When the begin callback is async, + // postgres.js does not call Promise.all() on the return value the way it does + // for sync callbacks, so we must do it ourselves. + return Promise.all(pipelined); + }, + {mode: Mode.READ_COMMITTED}, + ); lc.debug?.(`flush tx completed after ${Date.now() - start} ms`); diff --git a/packages/zero-cache/src/services/view-syncer/row-record-cache.ts b/packages/zero-cache/src/services/view-syncer/row-record-cache.ts index f8315d77f4..6b13cc8979 100644 --- a/packages/zero-cache/src/services/view-syncer/row-record-cache.ts +++ b/packages/zero-cache/src/services/view-syncer/row-record-cache.ts @@ -5,16 +5,13 @@ import {CustomKeyMap} from '../../../../shared/src/custom-key-map.ts'; import {must} from '../../../../shared/src/must.ts'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; import * as Mode from '../../db/mode-enum.ts'; +import {runTx} from '../../db/run-transaction.ts'; import {TransactionPool} from '../../db/transaction-pool.ts'; import { getOrCreateCounter, getOrCreateHistogram, } from '../../observability/metrics.ts'; -import { - disableStatementTimeout, - type PostgresDB, - type PostgresTransaction, -} from '../../types/pg.ts'; +import {type PostgresDB, type PostgresTransaction} from '../../types/pg.ts'; import {rowIDString} from '../../types/row-key.ts'; import {cvrSchema, type ShardID} from '../../types/shards.ts'; import {checkVersion, type CVRFlushStats} from './cvr-store.ts'; @@ -161,6 +158,7 @@ export class RowRecordCache { } const start = Date.now(); const r = resolver>(); + r.promise.catch(() => {}); // Set this.#cache immediately (before await) so that only one db // query is made even if there are multiple callers. this.#cache = r.promise; @@ -228,6 +226,10 @@ export class RowRecordCache { // Initiate a flush if not already flushing. if (!flushed && this.#flushing === null) { this.#flushing = resolver(); + // The #flush() method handles propagating errors to #failService. + // Attach a rejection handler to this promise to avoid unhandled + // rejections. + this.#flushing.promise.catch(() => {}); this.#setTimeout(() => this.#flush(), 0); } return cache.size; @@ -239,11 +241,9 @@ export class RowRecordCache { while (this.#pendingRowsVersion !== this.#flushedRowsVersion) { const start = performance.now(); - const {rows, rowsVersion} = await this.#db.begin( - Mode.READ_COMMITTED, + const {rows, rowsVersion} = await runTx( + this.#db, tx => { - disableStatementTimeout(tx); - // Note: This code block is synchronous, guaranteeing that the // #pendingRowsVersion is consistent with the #pending rows. const rows = this.#pending.size; @@ -258,6 +258,7 @@ export class RowRecordCache { this.#pending.clear(); return {rows, rowsVersion}; }, + {mode: Mode.READ_COMMITTED}, ); const elapsed = performance.now() - start; this.#lc.debug?.( diff --git a/packages/zero-cache/src/types/pg.pg.test.ts b/packages/zero-cache/src/types/pg.pg.test.ts index 5d0561d406..eb9ef3ac5a 100644 --- a/packages/zero-cache/src/types/pg.pg.test.ts +++ b/packages/zero-cache/src/types/pg.pg.test.ts @@ -1,7 +1,7 @@ import {beforeEach, describe, expect, test} from 'vitest'; import {test as testPg, type PgTest} from '../test/db.ts'; import {BYTEA, INT4, TEXT, VARCHAR} from './pg-types.ts'; -import {disableStatementTimeout, typeNameByOID, type PostgresDB} from './pg.ts'; +import {typeNameByOID, type PostgresDB} from './pg.ts'; describe('types/pg-types', () => { test('typeNameByIOD', () => { @@ -138,26 +138,4 @@ describe('types/pg', () => { timetzs: [expectedTimeTz, expectedTimeTz], }); }); - - testPg('disable statement timeout', async () => { - await db`SET statement_timeout = 100000`; - expect(await db`SHOW statement_timeout`).toMatchInlineSnapshot(` - Result [ - { - "statement_timeout": "100s", - }, - ] - `); - - await db.begin(async tx => { - disableStatementTimeout(tx); - expect(await tx`SHOW statement_timeout`).toMatchInlineSnapshot(` - Result [ - { - "statement_timeout": "0", - }, - ] - `); - }); - }); }); From 6f591c9a318ff4525b865d96bb2d5fb2e884fd22 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 26 Feb 2026 13:44:12 -0800 Subject: [PATCH 108/495] chore(zero-cache): use row locks instead of SERIALIZABLE for cdc concurrency management (#5622) Replace the use of `SERIALIZABLE` cdc transactions with explicit row locking, the latter being more efficient when entities are cooperatively coordinating with each other, and the former being susceptible to sustained lock errors under pathological conditions such as xmin pinning => memory bloat => lock escalation. Incident: * https://rocicorp.slack.com/archives/C0A8NUDMDM1/p1772050286908219?thread_ts=1772049792.193079&cid=C0A8NUDMDM1 Tangential changes: * Fix catchup transaction to capture a snapshot synchronously (within the storer loop) before running the catchup query in the background * bookend change log purges and ownership takeovers with logging and timing information --- .../change-streamer-service.pg.test.ts | 73 +++++--------- .../change-streamer-service.ts | 7 +- .../change-streamer/storer.pg.test.ts | 47 ++++++--- .../src/services/change-streamer/storer.ts | 99 ++++++++----------- 4 files changed, 103 insertions(+), 123 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index 5d66f28b87..ca0f639534 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -1212,67 +1212,37 @@ describe('change-streamer/service', () => { }); }); - test('ownership takeover during tx', async () => { + test('ownership takeover not possible during tx', async () => { changes.push(['begin', {tag: 'begin'}, {commitWatermark: '0d'}]); changes.push(['data', messages.insert('foo', {id: 'hello'})]); - changes.push(['commit', {tag: 'commit'}, {watermark: '0d'}]); - - changes.push(['begin', {tag: 'begin'}, {commitWatermark: '0f'}]); - changes.push(['data', messages.insert('foo', {id: 'world'})]); - - // Wait for the ack of the first commit. - await expectAcks('0d'); - // Let the next transaction begin, reading the old owner. + // Let the next transaction begin, acquiring the lock. await sleep(10); - // Take over ownership. - await sql` - UPDATE "zoro_3/cdc"."replicationState" - SET "owner" = 'other-task', "ownerAddress" = 'change.streamer2:9876'`; - // The commit should fail (with a SERIALIZATION error). - changes.push(['commit', {tag: 'commit'}, {watermark: '0f'}]); - - await streamerDone; + // Verify that the lock is held. + let result; + try { + result = await sql` + SELECT owner FROM "zoro_3/cdc"."replicationState" FOR UPDATE NOWAIT`; + } catch (e) { + result = e; + } + expect(result).toMatchInlineSnapshot( + `[PostgresError: could not obtain lock on row in relation "replicationState"]`, + ); + // The commit should release the lock. + changes.push(['commit', {tag: 'commit'}, {watermark: '0d'}]); - // Only the first changes should be committed. expect( - await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), + await sql` + SELECT owner FROM "zoro_3/cdc"."replicationState" FOR UPDATE`, ).toMatchInlineSnapshot(` Result [ - [ - "01", - "begin", - ], - [ - "01", - "commit", - ], - [ - "0d", - "begin", - ], - [ - "0d", - "insert", - ], - [ - "0d", - "commit", - ], - ] - `); - - await expectTables(sql, { - ['zoro_3/cdc.replicationState']: [ { - lock: 1, - owner: 'other-task', - ownerAddress: 'change.streamer2:9876', - lastWatermark: '0d', + "owner": "task-id", }, - ], - }); + ] + `); }); test('reset required', async () => { @@ -1286,7 +1256,8 @@ describe('change-streamer/service', () => { test('reset required if backup is behind', async () => { await sql` INSERT INTO "zoro_3/cdc"."changeLog" (watermark, pos, change) VALUES ('03', 0, '{"tag":"begin"}'::json); - `; + UPDATE "zoro_3/cdc"."replicationState" SET "lastWatermark" = '03'; + `.simple(); void streamer.subscribe({ protocolVersion: PROTOCOL_VERSION, diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 8225247beb..3b19b01147 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -523,8 +523,13 @@ class ChangeStreamerImpl implements ChangeStreamerService { `At least one client is behind backup (${earliestCurrent} < ${earliestInitial})`, ); } else { + this.#lc.info?.(`Purging changes before ${earliestInitial} ...`); + const start = performance.now(); const deleted = await this.#storer.purgeRecordsBefore(earliestInitial); - this.#lc.info?.(`Purged ${deleted} changes before ${earliestInitial}`); + const elapsed = (performance.now() - start).toFixed(2); + this.#lc.info?.( + `Purged ${deleted} changes before ${earliestInitial} (${elapsed} ms)`, + ); this.#initialWatermarks.delete(earliestInitial); } } catch (e) { diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 9f6c019dd1..c6742620ea 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -827,7 +827,16 @@ describe('change-streamer/storer', () => { test('non-owner purge prevented', async () => { await db`UPDATE "xero_5/cdc"."replicationState" SET owner = 'different-task-id'`; - expect(await storer.purgeRecordsBefore('06')).toBe(0); + let result; + try { + result = await storer.purgeRecordsBefore('06'); + } catch (e) { + result = e; + } + expect(result).toMatchInlineSnapshot( + `[AbortError: aborting changeLog purge to 06 because ownership has been taken by different-task-id]`, + ); + expect( await db`SELECT watermark, pos FROM "xero_5/cdc"."changeLog"`, ).toEqual([ @@ -861,7 +870,7 @@ describe('change-streamer/storer', () => { done = Promise.resolve(); }); - test('ownership change during transaction includes new owner in error', async () => { + test('ownership change not possible during transaction', async () => { // Start a transaction — this begins a SERIALIZABLE tx that // reads replicationState (owner = 'task-id'). storer.store([ @@ -874,20 +883,32 @@ describe('change-streamer/storer', () => { // The pipelined SELECT of replicationState should have executed by now. await sleep(100); - // Change ownership externally — this commits immediately on a separate - // connection, modifying the replicationState row that the storer's - // SERIALIZABLE tx has already read. - await db`UPDATE "xero_5/cdc"."replicationState" SET owner = 'new-owner-task'`; + // Simulate an ownership change attempt. This should fail. + let result; + try { + result = + await db`SELECT owner FROM "xero_5/cdc"."replicationState" FOR UPDATE NOWAIT`; + } catch (e) { + result = e; + } + expect(result).toMatchInlineSnapshot( + `[PostgresError: could not obtain lock on row in relation "replicationState"]`, + ); - // Now send commit. The storer's initial read shows owner = 'task-id' - // (matching), so it proceeds to UPDATE lastWatermark. But Postgres - // detects the serialization conflict and throws PG_SERIALIZATION_FAILURE. + // Now send commit. storer.store(['08', ['commit', messages.commit(), {watermark: '08'}]]); - // The AbortError should include the new owner read from a fresh query. - await expect(done).rejects.toThrow( - 'changeLog ownership was concurrently assumed by new-owner-task (serialization failure)', - ); + // Now an ownership change should succeed. + expect( + await db`SELECT owner FROM "xero_5/cdc"."replicationState" FOR UPDATE`, + ).toMatchInlineSnapshot(` + Result [ + { + "owner": "task-id", + }, + ] + `); + // Prevent the beforeEach cleanup from re-throwing the rejected done. done = Promise.resolve(); }); diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 186d2e00bf..b0a9ff8faa 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -1,8 +1,7 @@ -import {PG_SERIALIZATION_FAILURE} from '@drdgvhbh/postgres-error-codes'; import type {LogContext} from '@rocicorp/logger'; import {resolver, type Resolver} from '@rocicorp/resolver'; import {getHeapStatistics} from 'node:v8'; -import postgres, {type PendingQuery, type Row} from 'postgres'; +import {type PendingQuery, type Row} from 'postgres'; import {AbortError} from '../../../../shared/src/abort-error.ts'; import {assert} from '../../../../shared/src/asserts.ts'; import {BigIntJSON} from '../../../../shared/src/bigint-json.ts'; @@ -170,8 +169,13 @@ export class Storer implements Service { ownerProtocol === 'ws' ? ownerAddress : `${ownerProtocol}://${ownerAddress}`; + this.#lc.info?.(`assuming ownership at ${addressWithProtocol}`); + const start = performance.now(); await db`UPDATE ${this.#cdc('replicationState')} SET ${db({owner, ownerAddress: addressWithProtocol})}`; - this.#lc.info?.(`assumed ownership at ${addressWithProtocol}`); + const elapsed = (performance.now() - start).toFixed(2); + this.#lc.info?.( + `assumed ownership at ${addressWithProtocol} (${elapsed} ms)`, + ); } async getStartStreamInitializationParameters(): Promise<{ @@ -227,30 +231,25 @@ export class Storer implements Service { } purgeRecordsBefore(watermark: string): Promise { - return runTx( - this.#db, - async sql => { - // Check ownership before performing the purge. The server is expected to - // exit immediately when an ownership change is detected, but checking - // explicitly guards against race conditions. - const [{owner}] = await sql` - SELECT * FROM ${this.#cdc('replicationState')}`; - if (owner !== this.#taskID) { - this.#lc.warn?.( - `Ignoring change log purge request (${watermark}) while not owner`, - ); - return 0; - } - - const [{deleted}] = await sql<{deleted: bigint}[]>` + return runTx(this.#db, async sql => { + const [{deleted}] = await sql<{deleted: bigint}[]>` WITH purged AS ( DELETE FROM ${this.#cdc('changeLog')} WHERE watermark < ${watermark} RETURNING watermark, pos ) SELECT COUNT(*) as deleted FROM purged;`; - return Number(deleted); - }, - {mode: Mode.SERIALIZABLE}, // TODO: remove SERIALIZABLE - ); + + // Before committing the purge, check that this process is still the + // owner. This is done after the DELETE to minimize the amount of time + // that writes to the changeLog are delayed. + const [{owner}] = await sql` + SELECT * FROM ${this.#cdc('replicationState')} FOR SHARE`; + if (owner !== this.#taskID) { + throw new AbortError( + `aborting changeLog purge to ${watermark} because ownership has been taken by ${owner}`, + ); + } + return Number(deleted); + }); } /** @@ -392,7 +391,7 @@ export class Storer implements Service { tx = { pool: new TransactionPool( this.#lc.withContext('watermark', watermark), - Mode.SERIALIZABLE, + Mode.READ_COMMITTED, ), preCommitWatermark: watermark, pos: 0, @@ -400,11 +399,11 @@ export class Storer implements Service { ack: !change.skipAck, }; tx.pool.run(this.#db); - // Pipeline a read of the current ReplicationState, - // which will be checked before committing. + // Acquire a lock on the replicationState row to detect and/or prevent + // a concurrent ownership change. void tx.pool.process(tx => { - tx` - SELECT * FROM ${this.#cdc('replicationState')}`.then( + tx /*sql*/ ` + SELECT * FROM ${this.#cdc('replicationState')} FOR UPDATE`.then( ([result]) => resolve(result), reject, ); @@ -454,29 +453,7 @@ export class Storer implements Service { tx.pool.setDone(); } - try { - await tx.pool.done(); - } catch (e) { - if ( - e instanceof postgres.PostgresError && - e.code === PG_SERIALIZATION_FAILURE - ) { - // Ownership change happened after the replicationState was read in 'begin'. - let ownerInfo: string; - try { - const [{owner}] = await this.#db` - SELECT * FROM ${this.#cdc('replicationState')}`; - ownerInfo = `ownership was concurrently assumed by ${owner}`; - } catch { - ownerInfo = `ownership was concurrently changed (failed to read current owner)`; - } - throw new AbortError( - `changeLog ${ownerInfo} (serialization failure)`, - {cause: e}, - ); - } - throw e; - } + await tx.pool.done(); // ACK the LSN to the upstream Postgres. if (tx.ack) { @@ -512,19 +489,24 @@ export class Storer implements Service { // Ensure that the transaction has started (and is thus holding a snapshot // of the database) before continuing on to commit more changes. This is - // done by waiting for a no-op task to be processed by the pool, which - // indicates that the BEGIN statement has been sent to the database. - await reader.processReadTask(() => {}); + // done by performing a single read on the db, which determines the + // snapshot for the REPEATABLE_READ transaction. + const [{lastWatermark}] = await reader.processReadTask( + sql => sql` + SELECT * FROM ${this.#cdc('replicationState')} + `, + ); // Run the actual catchup queries in the background. Errors are handled in // #catchup() by disconnecting the associated subscriber. - void Promise.all(subs.map(sub => this.#catchup(sub, reader))).finally(() => - reader.setDone(), - ); + void Promise.all( + subs.map(sub => this.#catchup(sub, lastWatermark, reader)), + ).finally(() => reader.setDone()); } async #catchup( {subscriber: sub, mode}: SubscriberAndMode, + lastWatermark: string, reader: TransactionPool, ) { try { @@ -537,9 +519,10 @@ export class Storer implements Service { let count = 0; let lastBatchConsumed: Promise | undefined; - for await (const entries of tx` + for await (const entries of tx /*sql*/ ` SELECT watermark, change FROM ${this.#cdc('changeLog')} WHERE watermark >= ${sub.watermark} + AND watermark <= ${lastWatermark} ORDER BY watermark, pos`.cursor(2000)) { // Wait for the last batch of entries to be consumed by the // subscriber before sending down the current batch. This pipelining From 22ef8e22b7cd001d310ad8aa7b877c7686ba970b Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Thu, 26 Feb 2026 16:52:21 -0500 Subject: [PATCH 109/495] chore(terabugs): more bits for RNG (#5613) we were getting id collisions with the old RNG --- apps/zbugs/scripts/generate-synthetic.ts | 48 ++++++++++++++++++------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/apps/zbugs/scripts/generate-synthetic.ts b/apps/zbugs/scripts/generate-synthetic.ts index 6f03594420..fea81dea1b 100644 --- a/apps/zbugs/scripts/generate-synthetic.ts +++ b/apps/zbugs/scripts/generate-synthetic.ts @@ -39,20 +39,44 @@ const SEED = parseInt(process.env.SEED ?? '42', 10); const SKIP_USERS = process.env.SKIP_USERS === 'true'; const TEMPLATES_DIR = path.join(__dirname, '../db/seed-data/templates'); -// --- Seeded PRNG (mulberry32) --- -function mulberry32(seed: number): () => number { - let s = seed | 0; +// --- Seeded PRNG (xoshiro128** — 128-bit state, period 2^128-1) --- +// SplitMix32 expands a single 32-bit seed into the 4×32-bit xoshiro state. +function xoshiro128ss(seed: number): () => number { + // SplitMix32 to initialize state + let z = seed | 0; + function splitmix32(): number { + z = (z + 0x9e3779b9) | 0; + let t = z ^ (z >>> 16); + t = Math.imul(t, 0x21f0aaad); + t = t ^ (t >>> 15); + t = Math.imul(t, 0x735a2d97); + t = t ^ (t >>> 15); + return t >>> 0; + } + let s0 = splitmix32(); + let s1 = splitmix32(); + let s2 = splitmix32(); + let s3 = splitmix32(); + return () => { - s = (s + 0x6d2b79f5) | 0; - let t = Math.imul(s ^ (s >>> 15), 1 | s); - t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; - return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + const result = Math.imul(s1 * 5, 9); + const r = (((result << 7) | (result >>> 25)) * 9) >>> 0; + + const t = s1 << 9; + s2 ^= s0; + s3 ^= s1; + s1 ^= s2; + s0 ^= s3; + s2 ^= t; + s3 = ((s3 << 11) | (s3 >>> 21)) >>> 0; + + return r / 4294967296; }; } -const rng = mulberry32(SEED); +const rng = xoshiro128ss(SEED); -// Seed faker for reproducibility (use same SEED as mulberry32) +// Seed faker for reproducibility (use same SEED as xoshiro128ss) faker.seed(SEED); function randomInt(min: number, max: number): number { @@ -79,7 +103,7 @@ function seededNanoid(size = 21): string { /** Derive a deterministic issue ID for a given index without storing all IDs. */ function issueIDForIndex(i: number): string { - const idRng = mulberry32(SEED ^ (i * 2654435761)); // Knuth multiplicative hash + const idRng = xoshiro128ss(SEED ^ (i * 2654435761)); // Knuth multiplicative hash let id = ''; for (let j = 0; j < 21; j++) { id += NANOID_ALPHABET[Math.floor(idRng() * NANOID_ALPHABET.length)]; @@ -89,13 +113,13 @@ function issueIDForIndex(i: number): string { /** Derive the project index for a given issue index (Pareto distribution). */ function projectForIssue(i: number, numBuckets: number, alpha = 2): number { - const r = mulberry32(SEED ^ ((i + 1) * 2246822519))(); // single draw + const r = xoshiro128ss(SEED ^ ((i + 1) * 2246822519))(); // single draw return Math.floor(Math.pow(r, alpha) * numBuckets); } /** Derive the comment count for a given issue index (exponential distribution matching mean). */ function commentsForIssue(i: number, mean: number): number { - const r = mulberry32(SEED ^ ((i + 2) * 3266489917))(); // single draw + const r = xoshiro128ss(SEED ^ ((i + 2) * 3266489917))(); // single draw // Exponential distribution: -mean * ln(1 - r), floored return Math.floor(-mean * Math.log(1 - r * 0.9999)); } From 23ed3e2779796c8bd9391bcac47ab8611729622b Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 26 Feb 2026 16:55:04 -0800 Subject: [PATCH 110/495] chore(zero-cache): allow Source consumers to error out of an iteration (#5624) Allow the consumer of a `Source` (i.e. a `Subscription` under the covers) to cancel an iteration with an error, similar to what would happen if the producer called `fail()`. This will be useful for consolidating error handling of multiple components into one codepath (upcoming change-streamer PR). --- packages/zero-cache/src/types/streams.ts | 4 +++- packages/zero-cache/src/types/subscription.test.ts | 11 +++++++++-- packages/zero-cache/src/types/subscription.ts | 10 ++++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/zero-cache/src/types/streams.ts b/packages/zero-cache/src/types/streams.ts index 640c338e67..17717339b7 100644 --- a/packages/zero-cache/src/types/streams.ts +++ b/packages/zero-cache/src/types/streams.ts @@ -34,8 +34,10 @@ export type Source = AsyncIterable & { * Immediately terminates all current iterations (i.e. {@link AsyncIterator.next next()}) * will return `{value: undefined, done: true}`), and prevents any subsequent iterations * from yielding any values. + * + * @param err Terminate the iteration by throwing the `err` instead. */ - cancel: () => void; + cancel: (err?: Error) => void; /** * The presence of a `pipeline` iterable allows the usual "consumed-on-iterate" semantics diff --git a/packages/zero-cache/src/types/subscription.test.ts b/packages/zero-cache/src/types/subscription.test.ts index 2e4b651baf..478626d1a0 100644 --- a/packages/zero-cache/src/types/subscription.test.ts +++ b/packages/zero-cache/src/types/subscription.test.ts @@ -91,7 +91,10 @@ describe('types/subscription', () => { expect(await subscription.push(6).result).toBe('unconsumed'); }); - test('fail', async () => { + test.each([ + ['fail', true], + ['cancel', false], + ])('fail or cancel: %s', async (_, fail) => { const consumed = new Set(); const cleanup = vi.fn(); const results: Promise[] = []; @@ -119,7 +122,11 @@ describe('types/subscription', () => { received.push(m); if (j++ === 2) { expect(subscription.active).toBe(true); - subscription.fail(failure); + if (fail) { + subscription.fail(failure); + } else { + subscription.cancel(failure); + } expect(subscription.active).toBe(false); } } diff --git a/packages/zero-cache/src/types/subscription.ts b/packages/zero-cache/src/types/subscription.ts index 729ac2229e..39838fbf05 100644 --- a/packages/zero-cache/src/types/subscription.ts +++ b/packages/zero-cache/src/types/subscription.ts @@ -202,9 +202,15 @@ export class Subscription implements Source, Sink { /** * Cancels the subscription immediately, cleans up, and terminates any iteration. + * This is intended for the consumer to call when it is no longer interested + * in the subscription. + * + * @param err If an `err` is specified, an iteration over the Subscription / + * Sink will throw the `err` (equivalent to the producer calling + * {@link fail()}). If undefined, the iteration will exit gracefully. */ - cancel() { - this.#terminate('canceled'); + cancel(err?: Error) { + this.#terminate(err ?? 'canceled'); } /** Fails the subscription, cleans up, and throws from any iteration. */ From 8d0804e4f50973a5eec293200223c912e30b9fed Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 26 Feb 2026 17:57:50 -0800 Subject: [PATCH 111/495] chore(zero-cache): backoff and retry on change-db runtime errors (#5625) Handle runtime errors (e.g. CONNECTION_CLOSED) from the change-db in the same way that we handle errors from upstream, by retrying with backoff. Previously a change-db error would result in a (graceful) shutdown, but this results in replication downtime while a new replication-manager starts up and restores. (Disconnects also appear to happen fairly often with PlanetScale dbs since they update regularly.) Now, the change-streamer `storer` service is stopped and restarted with each loop of a change stream subscription, thereby using the same backoff and retry logic that we employ for upstream errors. --- .../change-streamer-service.pg.test.ts | 76 +++++++++++++------ .../change-streamer-service.ts | 14 ++-- .../change-streamer/storer.pg.test.ts | 11 +++ .../src/services/change-streamer/storer.ts | 47 +++++++++--- 4 files changed, 108 insertions(+), 40 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index ca0f639534..7e9ab2cee6 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -999,6 +999,59 @@ describe('change-streamer/service', () => { expect(await hasRetried).toBe(true); }); + test('retry on unexpected storage error', async () => { + const {promise: hasRetried, resolve: retried} = resolver(); + const source = { + startStream: vi + .fn() + .mockImplementationOnce(() => + Promise.resolve({ + initialWatermark: '01', + changes, + acks: () => {}, + }), + ) + .mockImplementation(() => { + retried(true); + return resolver().promise; + }), + }; + const streamer = await initializeStreamer( + lc, + shard, + 'task-id', + 'change.streamer:12345', + 'ws', + sql, + source, + replicaConfig, + true, + 0.04, + ); + void streamer.run(); + + // Insert unexpected data simulating that the stream and store are not in the expected state. + await sql`INSERT INTO "zoro_3/cdc"."changeLog" (watermark, pos, change) + VALUES ('05', 3, ${{conflicting: 'entry'}})`; + + changes.push(['begin', messages.begin(), {commitWatermark: '05'}]); + changes.push(['data', messages.insert('foo', {id: 'hello'})]); + changes.push(['data', messages.insert('foo', {id: 'world'})]); + changes.push(['commit', messages.commit(), {watermark: '05'}]); + + // The streamer should have started a new stream. + expect(await hasRetried).toBe(true); + + // Commit should not have succeeded + expect( + await sql`SELECT watermark, pos FROM "zoro_3/cdc"."changeLog"`, + ).toEqual([ + {watermark: '01', pos: 0n}, + {watermark: '01', pos: 1n}, + {watermark: '05', pos: 3n}, + ]); + }); + test('retries at right watermark', async () => { const {promise: hasRetried, resolve: retried} = resolver(); const changes = Subscription.create(); @@ -1293,29 +1346,6 @@ describe('change-streamer/service', () => { ]); }); - test('shutdown on unexpected storage error', async () => { - // Insert unexpected data simulating that the stream and store are not in the expected state. - await sql`INSERT INTO "zoro_3/cdc"."changeLog" (watermark, pos, change) - VALUES ('05', 3, ${{conflicting: 'entry'}})`; - - changes.push(['begin', messages.begin(), {commitWatermark: '05'}]); - changes.push(['data', messages.insert('foo', {id: 'hello'})]); - changes.push(['data', messages.insert('foo', {id: 'world'})]); - changes.push(['commit', messages.commit(), {watermark: '05'}]); - - // Streamer should be shut down because of the error. - await streamerDone; - - // Commit should not have succeeded - expect( - await sql`SELECT watermark, pos FROM "zoro_3/cdc"."changeLog"`, - ).toEqual([ - {watermark: '01', pos: 0n}, - {watermark: '01', pos: 1n}, - {watermark: '05', pos: 3n}, - ]); - }); - test('transaction aborted on unexpected termination', async () => { const sub = await streamer.subscribe({ protocolVersion: PROTOCOL_VERSION, diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 3b19b01147..82fcfe0458 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -309,12 +309,6 @@ class ChangeStreamerImpl implements ChangeStreamerService { // Once this change-streamer acquires "ownership" of the change DB, // it is safe to start the storer. await this.#storer.assumeOwnership(); - // The storer will, in turn, detect changes to ownership and stop - // the change-streamer appropriately. - this.#storer - .run() - .then(() => this.stop()) - .catch(e => this.stop(e)); // The threshold in (estimated number of) bytes to send() on subscriber // websockets before `await`-ing the I/O buffers to be ready for more. @@ -331,6 +325,8 @@ class ChangeStreamerImpl implements ChangeStreamerService { lastWatermark, backfillRequests, ); + this.#storer.run().catch(e => stream.changes.cancel(e)); + this.#stream = stream; this.#state.resetBackoff(); watermark = null; @@ -407,7 +403,11 @@ class ChangeStreamerImpl implements ChangeStreamerService { ]); } - await this.#state.backoff(this.#lc, err); + // Backoff and drain any pending entries in the storer before reconnecting. + await Promise.all([ + this.#storer.stop(), + this.#state.backoff(this.#lc, err), + ]); } this.#lc.info?.('ChangeStreamer stopped'); } diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index c6742620ea..3a870d3610 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -166,6 +166,7 @@ describe('change-streamer/storer', () => { ]); storer.store(['08', ['commit', messages.commit(), {watermark: '08'}]]); + await storer.allProcessed(); expect( await storer.getStartStreamInitializationParameters(), ).toMatchObject({lastWatermark: '08', backfillRequests: []}); @@ -196,6 +197,7 @@ describe('change-streamer/storer', () => { storer.store(['09', ['commit', messages.commit(), {watermark: '09'}]]); // No backfillRequests should be present. + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -232,6 +234,7 @@ describe('change-streamer/storer', () => { // The table should appear in the backfillRequests, with null metadata // since none was ever specified. + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -286,6 +289,7 @@ describe('change-streamer/storer', () => { // Now the original table shows up in the backfillRequests, with its // table metadata. + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -362,6 +366,7 @@ describe('change-streamer/storer', () => { ]); storer.store(['0c', ['commit', messages.commit(), {watermark: '0c'}]]); + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -442,6 +447,7 @@ describe('change-streamer/storer', () => { ]); storer.store(['0d', ['commit', messages.commit(), {watermark: '0d'}]]); + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -531,6 +537,7 @@ describe('change-streamer/storer', () => { ]); storer.store(['0e', ['commit', messages.commit(), {watermark: '0e'}]]); + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -613,6 +620,7 @@ describe('change-streamer/storer', () => { ]); storer.store(['0f', ['commit', messages.commit(), {watermark: '0f'}]]); + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -693,6 +701,7 @@ describe('change-streamer/storer', () => { ]); storer.store(['110', ['commit', messages.commit(), {watermark: '110'}]]); + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -765,6 +774,7 @@ describe('change-streamer/storer', () => { ]); storer.store(['111', ['commit', messages.commit(), {watermark: '111'}]]); + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { @@ -815,6 +825,7 @@ describe('change-streamer/storer', () => { ]); storer.store(['112', ['commit', messages.commit(), {watermark: '112'}]]); + await storer.allProcessed(); expect(await storer.getStartStreamInitializationParameters()) .toMatchInlineSnapshot(` { diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index b0a9ff8faa..1ff073f8b0 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -182,13 +182,6 @@ export class Storer implements Service { lastWatermark: string; backfillRequests: BackfillRequest[]; }> { - // Before starting or restarting a stream from the change source, - // wait for all queued changes to be processed so that we pick up - // from the right spot. - const {promise: ready, resolve} = resolver(); - this.#queue.enqueue(['ready', resolve]); - await ready; - const [[{lastWatermark}], result] = await runTx( this.#db, sql => [ @@ -331,17 +324,36 @@ export class Storer implements Service { } } + #stopped = promiseVoid; + + /** + * Runs the storer loop until {@link stop()} is called, or an error is thrown. + * Once {@link run()} completes, it can be called again. + */ async run() { + assert(!this.#running, `storer is already running`); + + const {promise: stopped, resolve: signalStopped} = resolver(); this.#running = true; + this.#stopped = stopped; + + this.#lc.info?.('starting storer'); try { await this.#processQueue(); } finally { - this.#running = false; // Release any pending backpressure so the upstream can proceed if (this.#readyForMore !== null) { this.#readyForMore.resolve(); this.#readyForMore = null; } + const unprocessed = this.#queue.drain(); + if (unprocessed.length) { + this.#lc.warn?.( + `dropped ${unprocessed.length} entries from the changeLog queue`, + ); + } + this.#running = false; + signalStopped(); this.#lc.info?.('storer stopped'); } } @@ -725,9 +737,24 @@ export class Storer implements Service { `; } + /** + * Waits until all currently queued entries have been processed. + * This is only used in tests. + */ + async allProcessed() { + if (this.#running) { + const {promise, resolve} = resolver(); + this.#queue.enqueue(['ready', resolve]); + await promise; + } + } + stop() { - this.#queue.enqueue('stop'); - return promiseVoid; + if (this.#running) { + this.#lc.info?.(`draining ${this.#queue.size()} changeLog entries`); + this.#queue.enqueue('stop'); + } + return this.#stopped; } } From 7e7c41a2bc74839b8b1ab2eea847d440e3e97e0f Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Fri, 27 Feb 2026 09:13:33 -0500 Subject: [PATCH 112/495] chore(zero-cache): add missing assert messages (#5621) https://discord.com/channels/830183651022471199/1364717642937532476/1476334102029537390 This is a bit impossible to narrow down: ``` clientID=q3hehi5bgur4s562t4 wsid=mOhgAEYhTcz-ahdIauImC runLoopCounter=2 Failed to connect {"name":"ProtocolError","message":"Assertion failed","stack":"ProtocolError: Assertion failed\n at #ac (https://dev.chief.so/_next/static/chunks/327-70b34bccee320c63.js:52:115513)/n at #al ([https://dev.chief.so/_next/static/chunks/327-70b34bccee320c63.js:52:113820)"%7D](https://dev.chief.so/_next/static/chunks/327-70b34bccee320c63.js:52:113820)%22%7D) Internal {"lmid":0,"baseCookie":""} ``` given we're missing messages in so many places. --- packages/shared/src/arrays.ts | 2 +- packages/shared/src/btree-set.ts | 5 ++++- packages/shared/src/buffer-sizer.ts | 20 +++++++++++++++---- packages/shared/src/options.ts | 2 +- packages/shared/src/queue.ts | 2 +- packages/z2s/src/compiler.output.test.ts | 2 +- .../change-source/common/backfill-manager.ts | 4 ++-- packages/zero-cache/src/types/streams.ts | 2 +- .../zero-client/src/client/query-manager.ts | 2 +- packages/zero-client/src/client/zero.ts | 15 ++++++++------ packages/zero-protocol/src/ast.ts | 9 ++++++--- .../zero-protocol/src/protocol-version.ts | 5 ++++- packages/zql/src/builder/builder.ts | 5 ++++- packages/zql/src/query/query-impl.ts | 2 +- packages/zql/src/query/query-internals.ts | 2 +- 15 files changed, 53 insertions(+), 26 deletions(-) diff --git a/packages/shared/src/arrays.ts b/packages/shared/src/arrays.ts index aa629a0043..3b5e214551 100644 --- a/packages/shared/src/arrays.ts +++ b/packages/shared/src/arrays.ts @@ -25,7 +25,7 @@ export function areEqual(arr1: readonly T[], arr2: readonly T[]): boolean { } export function zip(a1: readonly T1[], a2: readonly T2[]): [T1, T2][] { - assert(a1.length === a2.length); + assert(a1.length === a2.length, 'zip: arrays must have equal length'); const result: [T1, T2][] = []; for (let i = 0; i < a1.length; i++) { result.push([a1[i], a2[i]]); diff --git a/packages/shared/src/btree-set.ts b/packages/shared/src/btree-set.ts index e06f837d75..38eceec6bf 100644 --- a/packages/shared/src/btree-set.ts +++ b/packages/shared/src/btree-set.ts @@ -200,7 +200,10 @@ function valuesFromReversed( let [nodeQueue, nodeIndex, leaf] = findPath(highestKey, root, comparator) || findPath(maxKey, root, comparator)!; - assert(!nodeQueue[0] || leaf === nodeQueue[0][nodeIndex[0]]); + assert( + !nodeQueue[0] || leaf === nodeQueue[0][nodeIndex[0]], + 'BTreeSet: leaf node mismatch in iteration', + ); let i = indexOf(highestKey, leaf.keys, 0, comparator); if ( inclusive && diff --git a/packages/shared/src/buffer-sizer.ts b/packages/shared/src/buffer-sizer.ts index 4db03cd931..53a8232e9e 100644 --- a/packages/shared/src/buffer-sizer.ts +++ b/packages/shared/src/buffer-sizer.ts @@ -19,10 +19,22 @@ export class BufferSizer { maxBufferSizeMs: number; adjustBufferSizeIntervalMs: number; }) { - assert(options.minBufferSizeMs <= options.maxBufferSizeMs); - assert(options.initialBufferSizeMs >= options.minBufferSizeMs); - assert(options.initialBufferSizeMs <= options.maxBufferSizeMs); - assert(options.adjustBufferSizeIntervalMs > 0); + assert( + options.minBufferSizeMs <= options.maxBufferSizeMs, + 'minBufferSizeMs must be <= maxBufferSizeMs', + ); + assert( + options.initialBufferSizeMs >= options.minBufferSizeMs, + 'initialBufferSizeMs must be >= minBufferSizeMs', + ); + assert( + options.initialBufferSizeMs <= options.maxBufferSizeMs, + 'initialBufferSizeMs must be <= maxBufferSizeMs', + ); + assert( + options.adjustBufferSizeIntervalMs > 0, + 'adjustBufferSizeIntervalMs must be positive', + ); this.#initialBufferSizeMs = options.initialBufferSizeMs; this.#minBufferSizeMs = options.minBufferSizeMs; this.#maxBufferSizeMs = options.maxBufferSizeMs; diff --git a/packages/shared/src/options.ts b/packages/shared/src/options.ts index 79e3981b7e..9bd2b3cbe5 100644 --- a/packages/shared/src/options.ts +++ b/packages/shared/src/options.ts @@ -245,7 +245,7 @@ export function parseOptionsAdvanced( if (terminalTypes.size > 1) { throw new TypeError(`${env} has mixed types ${[...terminalTypes]}`); } - assert(terminalTypes.size === 1); + assert(terminalTypes.size === 1, 'Expected exactly one terminal type'); const terminalType = [...terminalTypes][0]; if (processEnv[env]) { diff --git a/packages/shared/src/queue.ts b/packages/shared/src/queue.ts index 9b66764eec..d6d5faae12 100644 --- a/packages/shared/src/queue.ts +++ b/packages/shared/src/queue.ts @@ -41,7 +41,7 @@ export class Queue { * @returns The number of entries deleted. */ delete(value: T): number { - assert(value !== undefined); + assert(value !== undefined, 'Queue delete value must not be undefined'); let count = 0; for (let i = this.#produced.length - 1; i >= 0; i--) { diff --git a/packages/z2s/src/compiler.output.test.ts b/packages/z2s/src/compiler.output.test.ts index 0af4f05a49..2590824623 100644 --- a/packages/z2s/src/compiler.output.test.ts +++ b/packages/z2s/src/compiler.output.test.ts @@ -760,7 +760,7 @@ test('correlate', () => { zql: 'child_table', }), ), - ).toThrow('Assertion failed'); + ).toThrow('zip: arrays must have equal length'); }); test('simple', () => { diff --git a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts index 481caccebb..2073549160 100644 --- a/packages/zero-cache/src/services/change-source/common/backfill-manager.ts +++ b/packages/zero-cache/src/services/change-source/common/backfill-manager.ts @@ -213,7 +213,7 @@ export class BackfillManager implements Cancelable, Listener { const beginTxFor = async ( msg: MessageBackfill | BackfillCompleted, ): Promise => { - assert(backfillTx === null); + assert(backfillTx === null, 'Expected no active backfill transaction'); const lastWatermark = await changeStream.reserve('backfill'); // After obtaining the changeStream reservation, check if the stream @@ -223,7 +223,7 @@ export class BackfillManager implements Cancelable, Listener { (msg.tag === 'backfill' && msg.watermark < state.minWatermark) ) { if (state.canceledReason === undefined) { - assert(msg.tag === 'backfill'); // TypeScript should have figured this out. + assert(msg.tag === 'backfill', 'Expected backfill message tag'); // TypeScript should have figured this out. this.#stopRunningBackfill( `row key change at ${state.minWatermark} ` + `postdates backfill watermark at ${msg.watermark}`, diff --git a/packages/zero-cache/src/types/streams.ts b/packages/zero-cache/src/types/streams.ts index 17717339b7..a2243bd453 100644 --- a/packages/zero-cache/src/types/streams.ts +++ b/packages/zero-cache/src/types/streams.ts @@ -154,7 +154,7 @@ type PipeOptions = { export function pipe({source, sink, parse, bufferMessages}: PipeOptions) { bufferMessages ??= 0; - assert(bufferMessages >= 0); + assert(bufferMessages >= 0, 'bufferMessages must be non-negative'); const pending: Promise[] = []; pipeline( diff --git a/packages/zero-client/src/client/query-manager.ts b/packages/zero-client/src/client/query-manager.ts index 18df6dfcfe..2f44009549 100644 --- a/packages/zero-client/src/client/query-manager.ts +++ b/packages/zero-client/src/client/query-manager.ts @@ -434,7 +434,7 @@ export class QueryManager implements InspectorDelegate { this.#recentQueries.add(astHash); if (this.#recentQueries.size > this.#recentQueriesMaxSize) { const lruQueryID = this.#recentQueries.values().next().value; - assert(lruQueryID); + assert(lruQueryID, 'Expected LRU query ID to exist'); this.#queries.delete(lruQueryID); this.#recentQueries.delete(lruQueryID); this.#queryMetrics.delete(lruQueryID); diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index 2faf8e0eeb..0a9bc11388 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -1814,13 +1814,13 @@ export class Zero< async #pusher(req: PushRequest, requestID: string): Promise { // The deprecation of pushVersion 0 predates zero-client - assert(req.pushVersion === 1); + assert(req.pushVersion === 1, 'Expected pushVersion 1'); // If we are connecting we wait until we are connected. await this.#connectResolver.promise; const lc = this.#lc.withContext('requestID', requestID); lc.debug?.(`pushing ${req.mutations.length} mutations`); const socket = this.#socket; - assert(socket); + assert(socket, 'Expected socket to be connected for push'); const isMutationRecoveryPush = req.clientGroupID !== (await this.clientGroupID); @@ -1955,7 +1955,7 @@ export class Zero< throwIfConnectionError(this.#connectionManager.state); // Now we have a new socket, update lc with the new wsid. - assert(this.#socket); + assert(this.#socket, 'Expected socket after reconnection'); lc = getLogContext(); lc.debug?.('Connected successfully'); @@ -2159,7 +2159,7 @@ export class Zero< async #puller(req: PullRequest, requestID: string): Promise { // The deprecation of pushVersion 0 predates zero-client - assert(req.pullVersion === 1); + assert(req.pullVersion === 1, 'Expected pullVersion 1'); const lc = this.#lc.withContext('requestID', requestID); lc.debug?.('Pull', req); // Pull request for this instance's client group. A no-op response is @@ -2177,7 +2177,10 @@ export class Zero< // If we are connecting we wait until we are connected. await this.#connectResolver.promise; const socket = this.#socket; - assert(socket); + assert( + socket, + 'Expected socket to be connected for mutation recovery pull', + ); // Mutation recovery pull. lc.debug?.('Pull is for mutation recovery'); const cookie = valita.parse( @@ -2282,7 +2285,7 @@ export class Zero< this.#onPong = resolve; const pingMessage: PingMessage = ['ping', {}]; const t0 = performance.now(); - assert(this.#socket); + assert(this.#socket, 'Expected socket to be connected for ping'); send(this.#socket, pingMessage); const raceResult = await promiseRace({ diff --git a/packages/zero-protocol/src/ast.ts b/packages/zero-protocol/src/ast.ts index 66f5e73086..7d4a61619b 100644 --- a/packages/zero-protocol/src/ast.ts +++ b/packages/zero-protocol/src/ast.ts @@ -146,7 +146,10 @@ const disjunctionSchema: v.Type = v.readonlyObject({ export type CompoundKey = readonly [string, ...string[]]; function mustCompoundKey(field: readonly string[]): CompoundKey { - assert(Array.isArray(field) && field.length >= 1); + assert( + Array.isArray(field) && field.length >= 1, + 'Expected non-empty array for compound key', + ); return field as unknown as CompoundKey; } @@ -530,10 +533,10 @@ function compareValuePosition(a: ValuePosition, b: ValuePosition): number { } switch (a.type) { case 'literal': - assert(b.type === 'literal'); + assert(b.type === 'literal', 'Expected literal type for comparison'); return compareUTF8(String(a.value), String(b.value)); case 'column': - assert(b.type === 'column'); + assert(b.type === 'column', 'Expected column type for comparison'); return compareUTF8(a.name, b.name); case 'static': throw new Error( diff --git a/packages/zero-protocol/src/protocol-version.ts b/packages/zero-protocol/src/protocol-version.ts index 36a0779184..0febeb0d55 100644 --- a/packages/zero-protocol/src/protocol-version.ts +++ b/packages/zero-protocol/src/protocol-version.ts @@ -69,4 +69,7 @@ export const PROTOCOL_VERSION = 49; */ export const MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 30; -assert(MIN_SERVER_SUPPORTED_SYNC_PROTOCOL < PROTOCOL_VERSION); +assert( + MIN_SERVER_SUPPORTED_SYNC_PROTOCOL < PROTOCOL_VERSION, + 'MIN_SERVER_SUPPORTED_SYNC_PROTOCOL must be less than PROTOCOL_VERSION', +); diff --git a/packages/zql/src/builder/builder.ts b/packages/zql/src/builder/builder.ts index e21f4a2bfb..e655c7b853 100644 --- a/packages/zql/src/builder/builder.ts +++ b/packages/zql/src/builder/builder.ts @@ -647,7 +647,10 @@ function applyCorrelatedSubqueryCondition( delegate: BuilderDelegate, name: string, ): FilterInput { - assert(condition.op === 'EXISTS' || condition.op === 'NOT EXISTS'); + assert( + condition.op === 'EXISTS' || condition.op === 'NOT EXISTS', + 'Expected EXISTS or NOT EXISTS operator', + ); if (condition.related.subquery.limit === 0) { if (condition.op === 'EXISTS') { const filter = new Filter(input, () => false); diff --git a/packages/zql/src/query/query-impl.ts b/packages/zql/src/query/query-impl.ts index 7eaa2eb567..0b8d917122 100644 --- a/packages/zql/src/query/query-impl.ts +++ b/packages/zql/src/query/query-impl.ts @@ -577,7 +577,7 @@ export function asQueryImpl< TSchema extends Schema, TReturn, >(q: Query): QueryImpl { - assert(q instanceof QueryImpl); + assert(q instanceof QueryImpl, 'Expected QueryImpl instance'); return q; } diff --git a/packages/zql/src/query/query-internals.ts b/packages/zql/src/query/query-internals.ts index e87e2e6fed..6f580608bf 100644 --- a/packages/zql/src/query/query-internals.ts +++ b/packages/zql/src/query/query-internals.ts @@ -103,7 +103,7 @@ export function asQuery< >( queryInternals: QueryInternals, ): Query { - assert(queryInternalsTag in queryInternals); + assert(queryInternalsTag in queryInternals, 'Expected query internals tag'); return queryInternals as unknown as Query; } From 3f3e94674476e79d1fc367fb03f454bfaf12e780 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 27 Feb 2026 09:41:17 -0800 Subject: [PATCH 113/495] chore(zero-cache): detect publication differences during initial sync (#5629) Detect a difference in custom publications during initial sync. The [detection performed for already-synced replicas](https://github.com/rocicorp/mono/blob/7e7c41a2bc74839b8b1ab2eea847d440e3e97e0f/packages/zero-cache/src/services/change-source/pg/change-source.ts#L179) generally suffices, but in the pathological case where initial-sync never succeeds, the publication change needs to be detected earlier. https://rocicorp.slack.com/archives/C013XFG80JC/p1772166413590339?thread_ts=1772154353.500539&cid=C013XFG80JC --- .../change-source/pg/initial-sync.pg.test.ts | 46 +++++++++++++++++++ .../services/change-source/pg/initial-sync.ts | 16 +++++++ 2 files changed, 62 insertions(+) diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts index 5415766e3b..50d1a212e6 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts @@ -2790,6 +2790,52 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { }); }); + test('different requested publications', async () => { + const lc = createSilentLogContext(); + const sql = upstream; + await sql` + CREATE TABLE foo(id int4 PRIMARY KEY); + INSERT INTO foo(id) VALUES (1); + + CREATE TABLE bar(id int4 PRIMARY KEY); + INSERT INTO bar(id) VALUES (1); + + CREATE PUBLICATION pub_1 for TABLE foo; + CREATE PUBLICATION pub_2 for TABLE bar; + `.simple(); + + const replica = new Database(lc, ':memory:'); + + // Simulate a (partial) previous sync with pub_1 only. + await ensureShardSchema(lc, upstream, { + appID: APP_ID, + shardNum: SHARD_NUM, + publications: ['pub_1'], + }); + + // initial-sync with pub_1 and pub_2 + await initialSync( + lc, + { + appID: APP_ID, + shardNum: SHARD_NUM, + publications: ['pub_1', 'pub_2'], + }, + replica, + getConnectionURI(upstream), + { + tableCopyWorkers: 1, + }, + TEST_CONTEXT, + ); + + expectMatchingObjectsInTables(replica, { + [`${APP_ID}_${SHARD_NUM}.clients`]: [], + foo: [{id: 1}], + bar: [{id: 1}], + }); + }); + test.each([ 'UPPERCASE', 'dashes-not-allowed', diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index 8971bfafa9..8bf67206c6 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -9,6 +9,7 @@ import {pipeline} from 'node:stream/promises'; import postgres from 'postgres'; import type {JSONObject} from '../../../../../shared/src/bigint-json.ts'; import {must} from '../../../../../shared/src/must.ts'; +import {equals} from '../../../../../shared/src/set-utils.ts'; import type {Database} from '../../../../../zqlite/src/db.ts'; import { createLiteIndexStatement, @@ -289,6 +290,10 @@ async function ensurePublishedTables( const {publications} = await getInternalShardConfig(sql, shard); if (validate) { + let valid = false; + const nonInternalPublications = publications.filter( + p => !p.startsWith('_'), + ); const exists = await sql` SELECT pubname FROM pg_publication WHERE pubname IN ${sql(publications)} `.values(); @@ -297,6 +302,17 @@ async function ensurePublishedTables( `some configured publications [${publications}] are missing: ` + `[${exists.flat()}]. resyncing`, ); + } else if ( + !equals(new Set(shard.publications), new Set(nonInternalPublications)) + ) { + lc.warn?.( + `requested publications [${shard.publications}] differ from previous` + + `publications [${nonInternalPublications}]. resyncing`, + ); + } else { + valid = true; + } + if (!valid) { await sql.unsafe(dropShard(shard.appID, shard.shardNum)); return ensurePublishedTables(lc, sql, shard, false); } From b713db1ddfbed7f98809386b157b7497166caecf Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Fri, 27 Feb 2026 12:43:48 -1000 Subject: [PATCH 114/495] fix(zero-cache): prevent concurrent schema migrations from racing (#5626) During rolling deployments, multiple pods can start simultaneously and race to run schema migrations. This caused errors like "duplicate key value violates unique constraint pg_namespace_nspname_index" when both pods tried to CREATE SCHEMA at the same time. - Add pg_advisory_xact_lock around runSchemaMigrations to serialize concurrent migration attempts - Use transaction-scoped lock (xact) instead of session-scoped to avoid issues with postgres.js connection pooling - Add test verifying concurrent migrations are properly serialized See https://rocicorp.slack.com/archives/C0ABMK92H47/p1772174043105789?thread_ts=1772170939.961879&cid=C0ABMK92H47 --- .../zero-cache/src/db/migration.pg.test.ts | 117 +++++++++++++++++- packages/zero-cache/src/db/migration.ts | 95 +++++++------- 2 files changed, 155 insertions(+), 57 deletions(-) diff --git a/packages/zero-cache/src/db/migration.pg.test.ts b/packages/zero-cache/src/db/migration.pg.test.ts index 29e5741608..9bc87aec3e 100644 --- a/packages/zero-cache/src/db/migration.pg.test.ts +++ b/packages/zero-cache/src/db/migration.pg.test.ts @@ -1,9 +1,10 @@ import type {LogContext} from '@rocicorp/logger'; -import type postgres from 'postgres'; +import {resolver} from '@rocicorp/resolver'; +import postgres from 'postgres'; import {beforeEach, describe, expect} from 'vitest'; import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; import {type PgTest, test} from '../test/db.ts'; -import type {PostgresDB} from '../types/pg.ts'; +import {postgresTypeConfig, type PostgresDB} from '../types/pg.ts'; import { type IncrementalMigrationMap, type Migration, @@ -183,7 +184,7 @@ describe('db/migration', () => { }, }, { - name: 'only updates version for successful migrations', + name: 'failed migration rolls back entire transaction', preSchema: { dataVersion: 12, schemaVersion: 12, @@ -193,12 +194,13 @@ describe('db/migration', () => { 13: {migrateData: logMigrationHistory('successful')}, 14: {migrateData: () => Promise.reject('fails to get to 14')}, }, + // With single transaction, failed migration rolls back everything postSchema: { - dataVersion: 13, - schemaVersion: 13, + dataVersion: 12, + schemaVersion: 12, minSafeVersion: 6, }, - expectedMigrationHistory: [{event: 'successful-at(12)'}], + expectedMigrationHistory: [], expectedErr: 'fails to get to 14', }, ]; @@ -247,4 +249,107 @@ describe('db/migration', () => { ); }); } + + test('concurrent migrations are serialized by advisory lock', async ({ + testDBs, + }) => { + // This test verifies that concurrent calls to runSchemaMigrations + // are serialized using pg_advisory_lock, preventing race conditions + // during rolling deployments. + // + // We need two separate database connections because advisory locks + // are session-based and reentrant within the same connection. + + const db1 = await testDBs.create('migration_concurrent_test'); + await db1`CREATE TABLE "MigrationHistory" (event TEXT)`; + + // Create a second connection to the same database + const {host, port, user: username, pass, database} = db1.options; + const db2: PostgresDB = postgres({ + host: host[0], + port: port[0], + username, + password: pass ?? undefined, + database, + ...postgresTypeConfig(), + }); + + try { + const migration1AcquiredLock = resolver(); + const migration1CanProceed = resolver(); + + const events: string[] = []; + + // Migration 1: signals when it starts its schema migration, + // then waits for permission to proceed + const migration1 = runSchemaMigrations( + createSilentLogContext(), + 'migration-1', + schemaName, + db1, + { + migrateSchema: async () => { + events.push('migration1-schema'); + migration1AcquiredLock.resolve(); + await migration1CanProceed.promise; + }, + }, + {1: {}}, + ); + + // Wait for migration 1 to acquire the lock and start its migration + await migration1AcquiredLock.promise; + + // Migration 2: will block on advisory lock, then see schema is already + // at version 1 and skip the setup (this is correct behavior) + const migration2Promise = runSchemaMigrations( + createSilentLogContext(), + 'migration-2', + schemaName, + db2, + { + migrateSchema: () => { + // This should NOT be called because migration 1 already migrated + events.push('migration2-schema'); + return Promise.resolve(); + }, + }, + {1: {}}, + ); + + // Give migration 2 a chance to try to acquire the lock + await new Promise(r => setTimeout(r, 50)); + + // Migration 2 should be blocked on the advisory lock, so only + // migration 1's schema event should have fired + expect(events).toEqual(['migration1-schema']); + + // Let migration 1 complete and release the lock + migration1CanProceed.resolve(); + await migration1; + events.push('migration1-done'); + + // Now migration 2 can proceed (it will skip migrateSchema since + // the schema is already at version 1) + await migration2Promise; + events.push('migration2-done'); + + // Verify the migrations completed in order + expect(events).toEqual([ + 'migration1-schema', + 'migration1-done', + 'migration2-done', + ]); + + // Verify final state is correct + expect(await getVersionHistory(db1, schemaName)).toEqual({ + dataVersion: 1, + schemaVersion: 1, + minSafeVersion: 0, + }); + } finally { + await db2.end(); + await testDBs.drop(db1); + } + }); }); diff --git a/packages/zero-cache/src/db/migration.ts b/packages/zero-cache/src/db/migration.ts index ec150c1ca5..8c48f769ca 100644 --- a/packages/zero-cache/src/db/migration.ts +++ b/packages/zero-cache/src/db/migration.ts @@ -66,23 +66,32 @@ export async function runSchemaMigrations( incrementalMigrationMap: IncrementalMigrationMap, ): Promise { log = log.withContext('initSchema', schemaName); + + const versionMigrations = sorted(incrementalMigrationMap); + assert( + versionMigrations.length, + `Must specify at least one version migration`, + ); + assert( + versionMigrations[0][0] > 0, + `Versions must be non-zero positive numbers`, + ); + const codeVersion = versionMigrations[versionMigrations.length - 1][0]; + + log.info?.( + `Checking schema for compatibility with ${debugName} at schema v${codeVersion}`, + ); + try { - const versionMigrations = sorted(incrementalMigrationMap); - assert( - versionMigrations.length, - `Must specify at least one version migration`, - ); - assert( - versionMigrations[0][0] > 0, - `Versions must be non-zero positive numbers`, - ); - const codeVersion = versionMigrations[versionMigrations.length - 1][0]; - log.info?.( - `Checking schema for compatibility with ${debugName} at schema v${codeVersion}`, - ); + await runTx(db, async tx => { + // Acquire advisory lock to prevent concurrent migrations from racing. + // This can happen during rolling deployments when multiple pods start + // up simultaneously. The lock auto-releases when the transaction ends. + const lockName = `migrate-schema:${schemaName}`; + await tx`SELECT pg_advisory_xact_lock(hashtext(${lockName}))`; + + let versions = await ensureVersionHistory(tx, schemaName); - let versions = await runTx(db, async tx => { - const versions = await ensureVersionHistory(tx, schemaName); if (codeVersion < versions.minSafeVersion) { throw new Error( `Cannot run ${debugName} at schema v${codeVersion} because rollback limit is v${versions.minSafeVersion}`, @@ -93,15 +102,17 @@ export async function runSchemaMigrations( log.info?.( `Data is at v${versions.dataVersion}. Resetting to v${codeVersion}`, ); - return updateVersionHistory(log, tx, schemaName, versions, codeVersion); + await updateVersionHistory(log, tx, schemaName, versions, codeVersion); + return; + } + + if (versions.dataVersion === codeVersion) { + return; } - return versions; - }); - if (versions.dataVersion < codeVersion) { const migrations = versions.dataVersion === 0 - ? // For the empty database v0, only run the setup migration. + ? // For an empty database (v0), only run the setup migration. ([[codeVersion, setupMigration]] as const) : versionMigrations; @@ -110,43 +121,25 @@ export async function runSchemaMigrations( log.info?.( `Migrating schema from v${versions.dataVersion} to v${dest}`, ); - void log.flush(); // Flush logs before each migration to help debug crash-y migrations. - - versions = await runTx(db, async tx => { - // Fetch meta from within the transaction to make the migration atomic. - let versions = await ensureVersionHistory(tx, schemaName); - if (versions.dataVersion < dest) { - versions = await runMigration( - log, - schemaName, - tx, - versions, - dest, - migration, - ); - assert( - versions.dataVersion === dest, - () => - `Migration did not reach target version: expected ${dest}, got ${versions.dataVersion}`, - ); - } - return versions; - }); + void log.flush(); + versions = await runMigration( + log, + schemaName, + tx, + versions, + dest, + migration, + ); } } - } + }); - assert( - versions.dataVersion === codeVersion, - () => - `Final dataVersion (${versions.dataVersion}) does not match codeVersion (${codeVersion})`, - ); log.info?.(`Running ${debugName} at schema v${codeVersion}`); } catch (e) { log.error?.('Error in ensureSchemaMigrated', e); throw e; } finally { - void log.flush(); // Flush the logs but do not block server progress on it. + void log.flush(); } } @@ -223,7 +216,7 @@ export async function getVersionHistory( create = false, ): Promise { const exists = await sql` - SELECT nspname, relname FROM pg_class + SELECT nspname, relname FROM pg_class JOIN pg_namespace ON relnamespace = pg_namespace.oid WHERE nspname = ${schemaName} AND relname = ${'versionHistory'}`; @@ -235,7 +228,7 @@ export async function getVersionHistory( } } const rows = await sql` - SELECT "dataVersion", "schemaVersion", "minSafeVersion" + SELECT "dataVersion", "schemaVersion", "minSafeVersion" FROM ${sql(schemaName)}."versionHistory"`; if (rows.length === 0) { From c5e774c639c8c135ff2d0b9abf148af63796fcb6 Mon Sep 17 00:00:00 2001 From: Alp Karavil Date: Sat, 28 Feb 2026 01:55:25 -0500 Subject: [PATCH 115/495] fix(zero-react): clear stale destroy timers on ViewWrapper resubscribe (#5623) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fixes a data disappearance bug when rapidly navigating with `key={location.pathname}` on a Suspense boundary. The bug caused query data to vanish permanently after fast navigation because stale destroy timers accumulated and fired during gaps between unsubscribe and resubscribe. ### The bug `ViewWrapper.subscribeReactInternals` scheduled a **new** `setTimeout(destroy, 10)` on every unsubscribe but never cancelled stale timers when a new subscriber was added. With rapid navigation (unsub every 2-3ms), accumulated timers eventually fired during a gap between unsubscribe and resubscribe: ``` t=0: unsub → timer T0 (fires at t=10) t=3: resub → unsub → timer T1 (fires at t=13) t=6: resub → unsub → timer T2 (fires at t=16) t=9: resub → unsub → timer T3 (fires at t=19) t=10: T0 fires, listeners=0 → DESTROYS VIEW (stale!) ``` T0 was scheduled at t=0 but fired at t=10 during a gap where `#reactInternals.size === 0`. The view was destroyed even though it had been actively subscribed/unsubscribed 3 times since T0 was scheduled. Once destroyed, `maxRecentQueries=0` (default) immediately evicted the query from the QueryManager, sending a `del` to the server. The subsequent re-materialization sent a `put`, but the server's acknowledgment of the `del` (removing `g/` from IDB) could race with the new `put`, leaving the view stuck at `resultType='unknown'` with empty data forever. ### The fix Track the pending destroy timer in `ViewWrapper` and `clearTimeout()` when a new subscriber is added: ```ts subscribeReactInternals = (internals) => { this.#reactInternals.add(internals); if (this.#destroyTimer !== undefined) { clearTimeout(this.#destroyTimer); this.#destroyTimer = undefined; } // ... return () => { // ... this.#destroyTimer = setTimeout(() => { /* destroy */ }, 10); }; }; ``` ### Test results All 8 new tests pass. All 37 existing `use-query.test.tsx` tests pass. Full `zero-react` test suite passes. | Test | What it verifies | |---|---| | resubscribe within 10ms window preserves data (no flash) | Single unsub+resub within 10ms reuses ViewWrapper | | resubscribe after 10ms creates new view, starts empty, then recovers | After 10ms, view destroyed, new one materializes correctly | | rapid navigation spam: data preserved across 5 unsub/resub cycles | **Regression test**: 3ms gaps, stale timer no longer destroys view | | rapid navigation spam at 2ms intervals: data preserved | **Regression test**: 2ms gaps, same fix verification | | unmount + long pause past deadline = view destroyed | Intentional >10ms absence destroys as expected | | full navigation lifecycle: away + back fast, then away + back slow | Full cycle: fast roundtrip preserves, slow roundtrip re-creates | | key change remount preserves data (simulated Suspense key swap) | React Suspense key change with useSyncExternalStore | | key change with relationship data: no permanent data loss | Singular query with nested relationship data survives key swap | ## Test plan - [x] All 8 new navigation tests pass - [x] All 37 existing `use-query.test.tsx` tests pass (no regressions) - [x] Full `zero-react` test suite passes (7/7 test files) --------- Co-authored-by: Alp Co-authored-by: Aaron Boodman --- .../zero-react/src/navigation-race.test.tsx | 581 ++++++++++++++++++ packages/zero-react/src/use-query.tsx | 13 +- 2 files changed, 593 insertions(+), 1 deletion(-) create mode 100644 packages/zero-react/src/navigation-race.test.tsx diff --git a/packages/zero-react/src/navigation-race.test.tsx b/packages/zero-react/src/navigation-race.test.tsx new file mode 100644 index 0000000000..be08b5c4a8 --- /dev/null +++ b/packages/zero-react/src/navigation-race.test.tsx @@ -0,0 +1,581 @@ +import React, {useSyncExternalStore} from 'react'; +import {createRoot, type Root} from 'react-dom/client'; +import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'; +import {queryInternalsTag, type QueryImpl} from './bindings.ts'; +import {getAllViewsSizeForTesting, ViewStore} from './use-query.tsx'; +import type {ErroredQuery, Query, ResultType, Schema, Zero} from './zero.ts'; + +// ────────────────────────────────────────────────────────────────────────────── +// Navigation race condition tests +// +// These test a data disappearance bug when rapidly navigating with +// key={location.pathname} on a Suspense boundary, fixed in this PR by +// clearing stale destroy timers in ViewWrapper.subscribeReactInternals. +// +// Before the fix, each unsubscribe scheduled an independent 10ms setTimeout. +// Rapid unsub/resub cycles accumulated stale timers that could fire during +// a gap between unsubscribe and resubscribe, destroying the view even though +// it was actively used since the timer was scheduled. This caused the +// QueryManager to send a `del` to the server (maxRecentQueries=0 evicts +// immediately), and if the server's acknowledgment raced with the subsequent +// `put`, the view could get stuck at resultType='unknown' with empty data. +// +// The fix: track the pending destroy timer in ViewWrapper and clearTimeout() +// when a new subscriber is added, ensuring stale timers from prior +// unsubscribe cycles cannot fire. +// ────────────────────────────────────────────────────────────────────────────── + +type Listener = ( + data: unknown, + resultType: ResultType, + error?: ErroredQuery, +) => void; + +type MockView = { + listeners: Set; + addListener(cb: Listener): () => void; + destroy(): void; + updateTTL(): void; +}; + +function newMockQuery(hash: string, singular = false): Query { + return { + [queryInternalsTag]: true, + hash: () => hash, + format: {singular}, + } as unknown as QueryImpl; +} + +function newMockZero(clientID: string): Zero { + return { + clientID, + materialize: vi.fn().mockImplementation( + () => + ({ + listeners: new Set(), + addListener(cb: Listener) { + this.listeners.add(cb); + return () => { + this.listeners.delete(cb); + }; + }, + destroy() { + this.listeners.clear(); + }, + updateTTL() {}, + }) satisfies MockView, + ), + } as unknown as Zero; +} + +function emit( + zero: Zero, + data: unknown, + resultType: ResultType = 'unknown', +) { + const mock = vi.mocked(zero.materialize).mock.results[0]?.value as + | MockView + | undefined; + if (!mock) throw new Error('materialize not called'); + mock.listeners.forEach(cb => cb(data, resultType)); +} + +/** Emit on the Nth materialized view (0-indexed). Useful after destroy + re-materialize. */ +function emitNth( + zero: Zero, + n: number, + data: unknown, + resultType: ResultType = 'unknown', +) { + const mock = vi.mocked(zero.materialize).mock.results[n]?.value as + | MockView + | undefined; + if (!mock) throw new Error(`materialize call #${n} not found`); + mock.listeners.forEach(cb => cb(data, resultType)); +} + +function snapData(view: {getSnapshot: () => readonly [unknown, ...unknown[]]}) { + return view.getSnapshot()[0]; +} + +function snapLength(view: { + getSnapshot: () => readonly [unknown, ...unknown[]]; +}) { + return (snapData(view) as unknown[]).length; +} + +describe('Navigation: ViewStore destroy + re-create lifecycle', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + afterEach(() => { + vi.useRealTimers(); + }); + + // emit(data) --> snap has data + // unsubscribe --> 10ms timer starts + // 5ms elapsed --> view still alive + // resubscribe --> timer fires later, bails (listeners > 0) + // snap still has data + test('resubscribe within 10ms window preserves data (no flash)', () => { + const viewStore = new ViewStore(); + const query = newMockQuery('nav-preserve'); + const zero = newMockZero('c-nav'); + const view = viewStore.getView(zero, query, true, 'forever'); + const cleanup = view.subscribeReactInternals(() => {}); + + emit(zero, [{id: '1', name: 'Alice'}]); + expect(snapLength(view)).toBe(1); + + // Simulate unmount (navigation away) + cleanup(); + + // Advance only 5ms (within the 10ms window) + vi.advanceTimersByTime(5); + + // Simulate remount (navigation back) — same ViewWrapper reused + const view2 = viewStore.getView(zero, query, true, 'forever'); + expect(view2).toBe(view); + const cleanup2 = view2.subscribeReactInternals(() => {}); + + // Data is still there (no flash) + expect(snapLength(view2)).toBe(1); + expect((snapData(view2) as Array<{id: string}>)[0].id).toBe('1'); + + // Timer fires but bails because listeners > 0 + vi.advanceTimersByTime(20); + expect(snapLength(view2)).toBe(1); + expect(getAllViewsSizeForTesting(viewStore)).toBe(1); + + // View was NOT re-materialized + expect(zero.materialize).toHaveBeenCalledTimes(1); + + cleanup2(); + }); + + // emit(data) --> snap has data + // unsubscribe --> 10ms timer starts + // 15ms elapsed --> view destroyed, removed from ViewStore + // resubscribe --> NEW ViewWrapper created, re-materializes + // getSnapshot() --> empty (default snapshot) + // emit(data) on new view --> snap has data again + test('resubscribe after 10ms creates new view, starts empty, then recovers', () => { + const viewStore = new ViewStore(); + const query = newMockQuery('nav-destroy'); + const zero = newMockZero('c-nav2'); + const view = viewStore.getView(zero, query, true, 'forever'); + const cleanup = view.subscribeReactInternals(() => {}); + + emit(zero, [{id: '1', name: 'Alice'}], 'complete'); + expect(snapLength(view)).toBe(1); + + // Simulate unmount + cleanup(); + + // Let the 10ms timer fire — view is destroyed + vi.advanceTimersByTime(15); + expect(getAllViewsSizeForTesting(viewStore)).toBe(0); + + // Simulate remount — creates a NEW ViewWrapper + const view2 = viewStore.getView(zero, query, true, 'forever'); + expect(view2).not.toBe(view); + const cleanup2 = view2.subscribeReactInternals(() => {}); + + // New view starts with empty/default snapshot + expect(snapLength(view2)).toBe(0); + + // A second materialize call happened + expect(zero.materialize).toHaveBeenCalledTimes(2); + + // Server eventually sends data to the new view + emitNth(zero, 1, [{id: '1', name: 'Alice'}], 'complete'); + expect(snapLength(view2)).toBe(1); + + cleanup2(); + }); + + // Regression test for stale destroy timer race condition. + // + // Before fix, this timeline caused data loss: + // t=0: unsub() → timer T0 fires at t=10 + // t=3: resub → unsub → timer T1 fires at t=13 + // t=6: resub → unsub → timer T2 fires at t=16 + // t=9: resub → unsub → timer T3 fires at t=19 + // t=12: T0 fires, listeners=0 → DESTROYED VIEW (stale timer!) + // + // T0 was scheduled at t=0 but fired at t=10 during a gap where no + // listener was active. The timer's `#reactInternals.size > 0` check + // saw size=0 (correct at that instant) but didn't know subscribers + // had come and gone 3 times since T0 was scheduled. + // + // Fixed by clearing pending destroy timer on subscribe. See use-query.tsx. + test('rapid navigation spam: data preserved across 5 unsub/resub cycles', () => { + const viewStore = new ViewStore(); + const query = newMockQuery('nav-spam'); + const zero = newMockZero('c-spam'); + + let view = viewStore.getView(zero, query, true, 'forever'); + let unsub = view.subscribeReactInternals(() => {}); + emit(zero, [{id: '1'}]); + expect(snapLength(view)).toBe(1); + + for (let i = 0; i < 5; i++) { + unsub(); + vi.advanceTimersByTime(3); + view = viewStore.getView(zero, query, true, 'forever'); + unsub = view.subscribeReactInternals(() => {}); + // Data should be preserved — each cycle is within 10ms + expect(snapLength(view)).toBe(1); + } + + // View should never have been re-materialized + expect(zero.materialize).toHaveBeenCalledTimes(1); + expect(getAllViewsSizeForTesting(viewStore)).toBe(1); + + unsub(); + }); + + // Same regression test with 2ms gaps (faster navigation). + // Before fix, the 5th cycle crossed the 10ms boundary of the first + // timer, destroying the view. Fixed by clearing timer on subscribe. + test('rapid navigation spam at 2ms intervals: data preserved', () => { + const viewStore = new ViewStore(); + const query = newMockQuery('nav-spam-fast'); + const zero = newMockZero('c-spam-fast'); + + let view = viewStore.getView(zero, query, true, 'forever'); + let unsub = view.subscribeReactInternals(() => {}); + emit(zero, [{id: '1'}]); + expect(snapLength(view)).toBe(1); + + for (let i = 0; i < 8; i++) { + unsub(); + vi.advanceTimersByTime(2); + view = viewStore.getView(zero, query, true, 'forever'); + unsub = view.subscribeReactInternals(() => {}); + expect(snapLength(view)).toBe(1); + } + + expect(zero.materialize).toHaveBeenCalledTimes(1); + + unsub(); + }); + + // Simulate: mount → unmount → wait >10ms → mount + // The unmount's timer fires, view is destroyed, new view created on remount. + test('unmount + long pause past deadline = view destroyed', () => { + const viewStore = new ViewStore(); + const query = newMockQuery('nav-deadline'); + const zero = newMockZero('c-deadline'); + const view = viewStore.getView(zero, query, true, 'forever'); + const unsub = view.subscribeReactInternals(() => {}); + + emit(zero, [{id: '1'}], 'complete'); + expect(snapLength(view)).toBe(1); + + unsub(); + vi.advanceTimersByTime(15); + + // View is destroyed + expect(getAllViewsSizeForTesting(viewStore)).toBe(0); + + // Remount creates new wrapper with empty data + const view2 = viewStore.getView(zero, query, true, 'forever'); + expect(view2).not.toBe(view); + expect(snapLength(view2)).toBe(0); + expect(zero.materialize).toHaveBeenCalledTimes(2); + + view2.subscribeReactInternals(() => {}); + }); + + // The exact scenario from the bug report: + // 1. User on assignment page, data loaded + // 2. User clicks a link (navigates to sub-route) + // 3. key={location.pathname} unmounts Suspense children + // 4. New route renders (different component, different queries) + // 5. User clicks back within 10ms + // 6. Original queries re-subscribe, data should be preserved + // + // Then the longer version: + // 7. User navigates away again + // 8. Stays on new page > 10ms + // 9. User navigates back + // 10. NEW ViewWrapper created, must re-materialize + // 11. Server sends data to new view + // 12. Data must appear + test('full navigation lifecycle: away + back fast, then away + back slow', () => { + const viewStore = new ViewStore(); + const queryA = newMockQuery('assignment-trackers'); + const queryB = newMockQuery('student-detail'); + const zero = newMockZero('c-full'); + + // Phase 1: User on assignment page, data loaded + const viewA = viewStore.getView(zero, queryA, true, 'forever'); + const unsubA = viewA.subscribeReactInternals(() => {}); + emit(zero, [ + {id: 't1', score: 85}, + {id: 't2', score: 92}, + ]); + expect(snapLength(viewA)).toBe(2); + + // Phase 2: Navigate to student detail (within 10ms) + unsubA(); + vi.advanceTimersByTime(2); + + // Student detail page mounts its own queries + const viewB = viewStore.getView(zero, queryB, true, 'forever'); + const unsubB = viewB.subscribeReactInternals(() => {}); + + // Phase 3: Quick back to assignment page (within 10ms) + unsubB(); + vi.advanceTimersByTime(2); + + const viewA2 = viewStore.getView(zero, queryA, true, 'forever'); + const unsubA2 = viewA2.subscribeReactInternals(() => {}); + + // Data preserved (same ViewWrapper, same snapshot) + expect(viewA2).toBe(viewA); + expect(snapLength(viewA2)).toBe(2); + const data = snapData(viewA2) as Array<{id: string; score: number}>; + expect(data[0].score).toBe(85); + + // Phase 4: Navigate away for longer than 10ms + unsubA2(); + vi.advanceTimersByTime(15); + + // Both ViewWrappers are destroyed + expect(getAllViewsSizeForTesting(viewStore)).toBe(0); + + // Phase 5: Navigate back to assignment page + const viewA3 = viewStore.getView(zero, queryA, true, 'forever'); + expect(viewA3).not.toBe(viewA); // new wrapper + const unsubA3 = viewA3.subscribeReactInternals(() => {}); + + // Initially empty (new wrapper, no data yet) + expect(snapLength(viewA3)).toBe(0); + + // A new materialize call was made + const materializeCalls = vi.mocked(zero.materialize).mock.calls.length; + expect(materializeCalls).toBeGreaterThanOrEqual(3); + + // Server eventually sends data to the new view + const lastIdx = vi.mocked(zero.materialize).mock.results.length - 1; + emitNth( + zero, + lastIdx, + [ + {id: 't1', score: 85}, + {id: 't2', score: 92}, + ], + 'complete', + ); + expect(snapLength(viewA3)).toBe(2); + + unsubA3(); + }); +}); + +describe('Navigation: React key-based remount', () => { + let root: Root; + let element: HTMLDivElement; + + beforeEach(() => { + vi.useRealTimers(); + element = document.createElement('div'); + document.body.appendChild(element); + root = createRoot(element); + }); + + afterEach(() => { + root.unmount(); + document.body.removeChild(element); + }); + + // + // -- subscribes to ViewStore, renders data + // + // + // key changes to "page-b": + // old tree unmounts (unsubscribe) + // new tree mounts (subscribe) + // ViewStore finds existing ViewWrapper (< 10ms) + // Data is preserved + test('key change remount preserves data (simulated Suspense key swap)', async () => { + const viewStore = new ViewStore(); + const query = newMockQuery('key-swap'); + const zero = newMockZero('c-key'); + + type Row = {id: string; name: string}; + const renderCounts = {current: 0}; + + function DataComponent() { + const view = viewStore.getView(zero, query, true, 'forever'); + const [data] = useSyncExternalStore( + view.subscribeReactInternals, + view.getSnapshot, + view.getSnapshot, + ); + renderCounts.current++; + const rows = (data ?? []) as Row[]; + return ( +
+ {rows.map(r => ( +
+ {r.name} +
+ ))} +
+ ); + } + + // Mount with key="page-a" + root.render( + Loading...}> + + , + ); + + await expect.poll(() => renderCounts.current).toBeGreaterThanOrEqual(1); + + // Emit data + emit(zero, [ + {id: '1', name: 'Alice'}, + {id: '2', name: 'Bob'}, + ]); + await expect + .poll(() => element.querySelector('[data-testid="row-1"]')?.textContent) + .toBe('Alice'); + + // Change key — this unmounts and remounts the entire Suspense subtree + root.render( + Loading...}> + + , + ); + + // Data should still be visible after remount (ViewWrapper reused within 10ms) + await expect + .poll(() => element.querySelector('[data-testid="row-1"]')?.textContent) + .toBe('Alice'); + await expect + .poll(() => element.querySelector('[data-testid="row-2"]')?.textContent) + .toBe('Bob'); + + // Only one materialize call (ViewWrapper was reused) + expect(zero.materialize).toHaveBeenCalledTimes(1); + }); + + // Reproduces the exact bug from the WebSocket trace: + // 1. Data component renders with relationship data (parent + children) + // 2. Key changes (navigation) + // 3. Old Suspense unmounts, new Suspense mounts + // 4. Data should be preserved through the transition + // 5. If data goes empty, it must recover when server sends data + test('key change with relationship data: no permanent data loss', async () => { + const viewStore = new ViewStore(); + const query = newMockQuery('key-rel', true); // singular (.one()) + const zero = newMockZero('c-key-rel'); + + type Assignment = { + id: string; + problem_trackers: Array<{ + id: string; + mastery_assessment: {mastery_score: number} | undefined; + }>; + }; + const renderCounts = {current: 0}; + const snapshots: Array = []; + + function AssignmentPage() { + const view = viewStore.getView(zero, query, true, 'forever'); + const [data] = useSyncExternalStore( + view.subscribeReactInternals, + view.getSnapshot, + view.getSnapshot, + ); + renderCounts.current++; + const assignment = data as unknown as Assignment | undefined; + snapshots.push(assignment); + const trackers = assignment?.problem_trackers ?? []; + return ( +
+ {trackers.map(t => ( +
+ {t.mastery_assessment?.mastery_score ?? 'none'} +
+ ))} +
+ ); + } + + // Mount + root.render( + Loading...}> + + , + ); + await expect.poll(() => renderCounts.current).toBeGreaterThanOrEqual(1); + + // Emit assignment with problem trackers + mastery assessments + const assignmentData: Assignment = { + id: 'a1', + problem_trackers: [ + {id: 'pt1', mastery_assessment: {mastery_score: 85}}, + {id: 'pt2', mastery_assessment: {mastery_score: 92}}, + {id: 'pt3', mastery_assessment: undefined}, + ], + }; + emit(zero, assignmentData, 'complete'); + await expect + .poll( + () => element.querySelector('[data-testid="tracker-pt1"]')?.textContent, + ) + .toBe('85'); + + // Navigate away (key change simulating route change) + root.render( + Loading...} + > + + , + ); + + // Navigate back (key change again) + root.render( + Loading...}> + + , + ); + + // Data should be preserved (ViewWrapper reused within 10ms) + await expect + .poll( + () => element.querySelector('[data-testid="tracker-pt1"]')?.textContent, + ) + .toBe('85'); + await expect + .poll( + () => element.querySelector('[data-testid="tracker-pt2"]')?.textContent, + ) + .toBe('92'); + await expect + .poll( + () => element.querySelector('[data-testid="tracker-pt3"]')?.textContent, + ) + .toBe('none'); + + // Only one materialize (ViewWrapper was never destroyed) + expect(zero.materialize).toHaveBeenCalledTimes(1); + + // Verify data was never empty between renders + const dataRenders = snapshots.filter(s => s !== undefined); + for (const snap of dataRenders) { + if (snap!.problem_trackers.length > 0) { + // Once we had data, we should never lose it + expect(snap!.problem_trackers).toHaveLength(3); + } + } + }); +}); diff --git a/packages/zero-react/src/use-query.tsx b/packages/zero-react/src/use-query.tsx index 95f8a85719..d49efe6869 100644 --- a/packages/zero-react/src/use-query.tsx +++ b/packages/zero-react/src/use-query.tsx @@ -515,6 +515,7 @@ class ViewWrapper< #nonEmptyResolver = resolver(); readonly #zero: Pick, 'materialize'>; readonly #singular: boolean; + #destroyTimer: ReturnType | undefined; constructor( query: Query, @@ -595,13 +596,23 @@ class ViewWrapper< subscribeReactInternals = (internals: () => void): (() => void) => { this.#reactInternals.add(internals); + // Cancel any pending destroy timer from a previous unsubscribe. + // Without this, rapid unsub/resub cycles accumulate stale timers + // that can fire during a gap between unsubscribe and resubscribe, + // destroying the view even though it was actively used. + if (this.#destroyTimer !== undefined) { + clearTimeout(this.#destroyTimer); + this.#destroyTimer = undefined; + } this.#materializeIfNeeded(); return () => { this.#reactInternals.delete(internals); // only schedule a cleanup task if we have no listeners left if (this.#reactInternals.size === 0) { - setTimeout(() => { + this.#destroyTimer = setTimeout(() => { + this.#destroyTimer = undefined; + // We already destroyed the view if (this.#view === undefined) { return; From 4d172315260b79a399f2164235e3bf1456288947 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Sat, 28 Feb 2026 08:21:38 +0100 Subject: [PATCH 116/495] chore(zbugs/zero-react): Use zero-virtual for list virtualization (#5628) This removes useZeroVirtualizer etc from zero-react and instead uses the `@rocicorp/zero-virtual/react` package. This allows us to remove a lot of code from zero-react. --- apps/zbugs/package.json | 3 +- .../src/hooks/use-wouter-permalink-state.ts | 2 +- apps/zbugs/src/pages/list/list-page.tsx | 3 +- apps/zbugs/vite.config.ts | 26 + package-lock.json | 80 +- packages/zero-react/package.json | 2 - packages/zero-react/src/mod.ts | 11 - .../zero-react/src/paging-reducer.test.ts | 602 ------- packages/zero-react/src/paging-reducer.ts | 140 -- packages/zero-react/src/use-rows.test.tsx | 457 ----- packages/zero-react/src/use-rows.ts | 219 --- .../src/use-zero-virtualizer.test.tsx | 1474 ----------------- .../zero-react/src/use-zero-virtualizer.ts | 597 ------- 13 files changed, 70 insertions(+), 3546 deletions(-) delete mode 100644 packages/zero-react/src/paging-reducer.test.ts delete mode 100644 packages/zero-react/src/paging-reducer.ts delete mode 100644 packages/zero-react/src/use-rows.test.tsx delete mode 100644 packages/zero-react/src/use-rows.ts delete mode 100644 packages/zero-react/src/use-zero-virtualizer.test.tsx delete mode 100644 packages/zero-react/src/use-zero-virtualizer.ts diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index d3cd6efbf0..11a76ceb58 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -45,8 +45,9 @@ "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", "@rocicorp/zero": "0.26.0", + "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", - "@tanstack/react-virtual": "^3.10.9", + "@tanstack/react-virtual": "^3.13.19", "classnames": "^2.5.1", "emoji-picker-element": "^1.22.8", "emoji-picker-element-data": "^1.6.1", diff --git a/apps/zbugs/src/hooks/use-wouter-permalink-state.ts b/apps/zbugs/src/hooks/use-wouter-permalink-state.ts index a136f90f2c..d4ab144664 100644 --- a/apps/zbugs/src/hooks/use-wouter-permalink-state.ts +++ b/apps/zbugs/src/hooks/use-wouter-permalink-state.ts @@ -1,4 +1,4 @@ -import type {PermalinkHistoryState} from '@rocicorp/zero/react'; +import type {PermalinkHistoryState} from '@rocicorp/zero-virtual/react'; import {useHistoryState} from 'wouter/use-browser-location'; /** diff --git a/apps/zbugs/src/pages/list/list-page.tsx b/apps/zbugs/src/pages/list/list-page.tsx index 9c91980473..14f2a62816 100644 --- a/apps/zbugs/src/pages/list/list-page.tsx +++ b/apps/zbugs/src/pages/list/list-page.tsx @@ -1,4 +1,5 @@ -import {useQuery, useZero, useZeroVirtualizer} from '@rocicorp/zero/react'; +import {useZeroVirtualizer} from '@rocicorp/zero-virtual/react'; +import {useQuery, useZero} from '@rocicorp/zero/react'; import classNames from 'classnames'; import Cookies from 'js-cookie'; import React, { diff --git a/apps/zbugs/vite.config.ts b/apps/zbugs/vite.config.ts index bc784e25bf..a39aaf7ec4 100644 --- a/apps/zbugs/vite.config.ts +++ b/apps/zbugs/vite.config.ts @@ -1,10 +1,18 @@ import react from '@vitejs/plugin-react'; +import {fileURLToPath, URL} from 'node:url'; import {defineConfig, type PluginOption, type ViteDevServer} from 'vite'; import svgr from 'vite-plugin-svgr'; import tsconfigPaths from 'vite-tsconfig-paths'; import {makeDefine} from '../../packages/shared/src/build.ts'; import {fastify} from './api/index.ts'; +const zeroReactPath = fileURLToPath( + new URL('../../packages/zero/src/react.ts', import.meta.url), +); +const zeroPath = fileURLToPath( + new URL('../../packages/zero/src/zero.ts', import.meta.url), +); + async function configureServer(server: ViteDevServer) { await fastify.ready(); server.middlewares.use((req, res, next) => { @@ -16,6 +24,24 @@ async function configureServer(server: ViteDevServer) { } export default defineConfig({ + // Keep a single runtime identity for `@rocicorp/zero` and `@rocicorp/zero/react`. + // Without this + `optimizeDeps.exclude` below, Vite can prebundle + // `@rocicorp/zero-virtual` against a different module instance, which breaks + // Zero context/query internals checks in dev. + resolve: { + dedupe: ['@rocicorp/zero', '@rocicorp/zero/react'], + alias: [ + {find: '@rocicorp/zero/react', replacement: zeroReactPath}, + {find: '@rocicorp/zero', replacement: zeroPath}, + ], + }, + optimizeDeps: { + exclude: [ + '@rocicorp/zero', + '@rocicorp/zero/react', + '@rocicorp/zero-virtual', + ], + }, plugins: [ tsconfigPaths(), svgr() as unknown as PluginOption, diff --git a/package-lock.json b/package-lock.json index ffd5fe1f6a..3801307a3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,8 +72,9 @@ "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", "@rocicorp/zero": "0.26.0", + "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", - "@tanstack/react-virtual": "^3.10.9", + "@tanstack/react-virtual": "^3.13.19", "classnames": "^2.5.1", "emoji-picker-element": "^1.22.8", "emoji-picker-element-data": "^1.6.1", @@ -124,6 +125,19 @@ "vitest": "4.0.15" } }, + "apps/zbugs/node_modules/@rocicorp/zero-virtual": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rocicorp/zero-virtual/-/zero-virtual-0.1.1.tgz", + "integrity": "sha512-vT6CoSqmgaalsLhyWRo4I9FsRPqF8LR7Yb8LfTkvYL0z0/E4sz8wxqEKQd95UyoIVpsdbcb55ZlkAbaL2Fdp/Q==", + "license": "Apache-2.0", + "peerDependencies": { + "@rocicorp/zero": ">=0.25", + "@tanstack/react-virtual": "^3.13.0", + "@tanstack/virtual-core": "^3.13.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, "apps/zbugs/node_modules/@types/pg": { "version": "8.15.5", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", @@ -15271,26 +15285,26 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.10.9", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", - "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", + "version": "3.13.19", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", + "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.10.9" + "@tanstack/virtual-core": "3.13.19" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@tanstack/virtual-core": { - "version": "3.10.9", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz", - "integrity": "sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw==", + "version": "3.13.19", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", + "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", "license": "MIT", "funding": { "type": "github", @@ -26166,7 +26180,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26188,7 +26201,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26210,7 +26222,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26232,7 +26243,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26254,7 +26264,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26276,7 +26285,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26298,7 +26306,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26320,7 +26327,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26342,7 +26348,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26364,7 +26369,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26386,7 +26390,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -41472,7 +41475,6 @@ "zql": "0.0.0" }, "peerDependencies": { - "@tanstack/react-virtual": "^3.10.9", "react": "^18.3.1", "react-dom": "^18.3.1" } @@ -53056,17 +53058,17 @@ } }, "@tanstack/react-virtual": { - "version": "3.10.9", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz", - "integrity": "sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==", + "version": "3.13.19", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", + "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", "requires": { - "@tanstack/virtual-core": "3.10.9" + "@tanstack/virtual-core": "3.13.19" } }, "@tanstack/virtual-core": { - "version": "3.10.9", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz", - "integrity": "sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw==" + "version": "3.13.19", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", + "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==" }, "@tantaman/api-extractor": { "version": "7.52.13", @@ -60552,7 +60554,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "dev": true, "optional": true, "peer": true }, @@ -60560,7 +60561,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "dev": true, "optional": true, "peer": true }, @@ -60568,7 +60568,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "dev": true, "optional": true, "peer": true }, @@ -60576,7 +60575,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "dev": true, "optional": true, "peer": true }, @@ -60584,7 +60582,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "dev": true, "optional": true, "peer": true }, @@ -60592,7 +60589,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "dev": true, "optional": true, "peer": true }, @@ -60600,7 +60596,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "dev": true, "optional": true, "peer": true }, @@ -60608,7 +60603,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "dev": true, "optional": true, "peer": true }, @@ -60616,7 +60610,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "dev": true, "optional": true, "peer": true }, @@ -60624,7 +60617,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "dev": true, "optional": true, "peer": true }, @@ -60632,7 +60624,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "dev": true, "optional": true, "peer": true }, @@ -70139,9 +70130,10 @@ "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", "@rocicorp/zero": "0.26.0", + "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tailwindcss/forms": "^0.5.0", - "@tanstack/react-virtual": "^3.10.9", + "@tanstack/react-virtual": "^3.13.19", "@types/js-cookie": "^3.0.6", "@types/k6": "^0.53.2", "@types/node": "^22.10.5", @@ -70189,6 +70181,12 @@ "zod": "^4.1.11" }, "dependencies": { + "@rocicorp/zero-virtual": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rocicorp/zero-virtual/-/zero-virtual-0.1.1.tgz", + "integrity": "sha512-vT6CoSqmgaalsLhyWRo4I9FsRPqF8LR7Yb8LfTkvYL0z0/E4sz8wxqEKQd95UyoIVpsdbcb55ZlkAbaL2Fdp/Q==", + "requires": {} + }, "@types/pg": { "version": "8.15.5", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", diff --git a/packages/zero-react/package.json b/packages/zero-react/package.json index 164c3e6e1e..317c5c4816 100644 --- a/packages/zero-react/package.json +++ b/packages/zero-react/package.json @@ -14,7 +14,6 @@ "lint": "oxlint --type-aware src/" }, "peerDependencies": { - "@tanstack/react-virtual": "^3.10.9", "react": "^18.3.1", "react-dom": "^18.3.1" }, @@ -25,7 +24,6 @@ "shared": "0.0.0", "zero-client": "0.0.0", "zero-schema": "0.0.0", - "zero-types": "0.0.0", "zql": "0.0.0" } } diff --git a/packages/zero-react/src/mod.ts b/packages/zero-react/src/mod.ts index 00277a829e..cda7c58808 100644 --- a/packages/zero-react/src/mod.ts +++ b/packages/zero-react/src/mod.ts @@ -6,18 +6,7 @@ export { type QueryResult, type UseQueryOptions, } from './use-query.tsx'; -export type { - GetPageQuery, - GetQueryReturnType, - GetSingleQuery, -} from './use-rows.ts'; export {useZeroOnline} from './use-zero-online.tsx'; -export { - useZeroVirtualizer, - type PermalinkHistoryState, - type UseZeroVirtualizerOptions, - type ZeroVirtualizerResult, -} from './use-zero-virtualizer.ts'; export { createUseZero, useZero, diff --git a/packages/zero-react/src/paging-reducer.test.ts b/packages/zero-react/src/paging-reducer.test.ts deleted file mode 100644 index 2f51558103..0000000000 --- a/packages/zero-react/src/paging-reducer.test.ts +++ /dev/null @@ -1,602 +0,0 @@ -import {describe, expect, test} from 'vitest'; -import { - pagingReducer, - type PagingAction, - type PagingState, -} from './paging-reducer.ts'; -import type {Anchor} from './use-rows.ts'; - -type TestListContextParams = {filter: string}; -type TestStartRow = {id: string; createdAt: number}; - -function createInitialState( - overrides?: Partial>, -): PagingState { - return { - estimatedTotal: 100, - hasReachedStart: false, - hasReachedEnd: false, - queryAnchor: { - anchor: { - index: 0, - kind: 'forward', - startRow: undefined, - }, - listContextParams: {filter: 'default'}, - }, - pagingPhase: 'idle', - pendingScrollAdjustment: 0, - ...overrides, - }; -} - -describe('pagingReducer', () => { - describe('UPDATE_ESTIMATED_TOTAL', () => { - test('updates estimatedTotal when newTotal is greater', () => { - const state = createInitialState({estimatedTotal: 100}); - const action: PagingAction = { - type: 'UPDATE_ESTIMATED_TOTAL', - newTotal: 150, - }; - - const result = pagingReducer(state, action); - - expect(result.estimatedTotal).toBe(150); - expect(result).not.toBe(state); // immutability - }); - - test('keeps estimatedTotal when newTotal is smaller', () => { - const state = createInitialState({estimatedTotal: 100}); - const action: PagingAction = { - type: 'UPDATE_ESTIMATED_TOTAL', - newTotal: 50, - }; - - const result = pagingReducer(state, action); - - expect(result.estimatedTotal).toBe(100); - expect(result).toBe(state); // Same object when no change - }); - - test('keeps estimatedTotal when newTotal is equal', () => { - const state = createInitialState({estimatedTotal: 100}); - const action: PagingAction = { - type: 'UPDATE_ESTIMATED_TOTAL', - newTotal: 100, - }; - - const result = pagingReducer(state, action); - - expect(result.estimatedTotal).toBe(100); - expect(result).toBe(state); // Same object when no change - }); - }); - - describe('REACHED_START', () => { - test('sets hasReachedStart to true', () => { - const state = createInitialState({hasReachedStart: false}); - const action: PagingAction = { - type: 'REACHED_START', - }; - - const result = pagingReducer(state, action); - - expect(result.hasReachedStart).toBe(true); - expect(result).not.toBe(state); - }); - - test('keeps hasReachedStart true if already true', () => { - const state = createInitialState({hasReachedStart: true}); - const action: PagingAction = { - type: 'REACHED_START', - }; - - const result = pagingReducer(state, action); - - expect(result.hasReachedStart).toBe(true); - }); - }); - - describe('REACHED_END', () => { - test('sets hasReachedEnd to true', () => { - const state = createInitialState({hasReachedEnd: false}); - const action: PagingAction = { - type: 'REACHED_END', - }; - - const result = pagingReducer(state, action); - - expect(result.hasReachedEnd).toBe(true); - expect(result).not.toBe(state); - }); - - test('keeps hasReachedEnd true if already true', () => { - const state = createInitialState({hasReachedEnd: true}); - const action: PagingAction = { - type: 'REACHED_END', - }; - - const result = pagingReducer(state, action); - - expect(result.hasReachedEnd).toBe(true); - }); - }); - - describe('UPDATE_ANCHOR', () => { - test('updates the anchor within queryAnchor', () => { - const state = createInitialState(); - const newAnchor: Anchor = { - index: 50, - kind: 'forward', - startRow: {id: 'row-50', createdAt: 1000}, - }; - const action: PagingAction = { - type: 'UPDATE_ANCHOR', - anchor: newAnchor, - }; - - const result = pagingReducer(state, action); - - expect(result.queryAnchor.anchor).toBe(newAnchor); - expect(result.queryAnchor.listContextParams).toBe( - state.queryAnchor.listContextParams, - ); - expect(result).not.toBe(state); - }); - - test('updates anchor to backward direction', () => { - const state = createInitialState(); - const newAnchor: Anchor = { - index: 75, - kind: 'backward', - startRow: {id: 'row-75', createdAt: 2000}, - }; - const action: PagingAction = { - type: 'UPDATE_ANCHOR', - anchor: newAnchor, - }; - - const result = pagingReducer(state, action); - - expect(result.queryAnchor.anchor).toEqual(newAnchor); - expect(result.queryAnchor.anchor.kind).toBe('backward'); - }); - - test('updates anchor to permalink', () => { - const state = createInitialState(); - const newAnchor = { - id: 'permalink-123', - index: 10, - kind: 'permalink', - } as const; - const action: PagingAction = { - type: 'UPDATE_ANCHOR', - anchor: newAnchor, - }; - - const result = pagingReducer(state, action); - - expect(result.queryAnchor.anchor).toEqual(newAnchor); - expect(result.queryAnchor.anchor.kind).toBe('permalink'); - }); - }); - - describe('SHIFT_ANCHOR_DOWN', () => { - test('updates anchor, sets pendingScrollAdjustment, and sets phase to adjusting', () => { - const state = createInitialState({ - pagingPhase: 'idle', - pendingScrollAdjustment: 0, - }); - const newAnchor: Anchor = { - index: 60, - kind: 'forward', - startRow: {id: 'row-60', createdAt: 3000}, - }; - const action: PagingAction = { - type: 'SHIFT_ANCHOR_DOWN', - offset: 10, - newAnchor, - }; - - const result = pagingReducer(state, action); - - expect(result.queryAnchor.anchor).toBe(newAnchor); - expect(result.pendingScrollAdjustment).toBe(10); - expect(result.pagingPhase).toBe('adjusting'); - expect(result).not.toBe(state); - }); - - test('handles negative offset', () => { - const state = createInitialState(); - const newAnchor: Anchor = { - index: 40, - kind: 'forward', - startRow: {id: 'row-40', createdAt: 4000}, - }; - const action: PagingAction = { - type: 'SHIFT_ANCHOR_DOWN', - offset: -5, - newAnchor, - }; - - const result = pagingReducer(state, action); - - expect(result.pendingScrollAdjustment).toBe(-5); - expect(result.pagingPhase).toBe('adjusting'); - }); - }); - - describe('RESET_TO_TOP', () => { - test('resets anchor to index 0 forward, sets scroll adjustment, and phase to adjusting', () => { - const state = createInitialState({ - queryAnchor: { - anchor: { - index: 50, - kind: 'backward', - startRow: {id: 'row-50', createdAt: 5000}, - }, - listContextParams: {filter: 'test'}, - }, - pagingPhase: 'idle', - }); - const action: PagingAction = { - type: 'RESET_TO_TOP', - offset: -50, - }; - - const result = pagingReducer(state, action); - - expect(result.queryAnchor.anchor).toEqual({ - index: 0, - kind: 'forward', - startRow: undefined, - }); - expect(result.pendingScrollAdjustment).toBe(-50); - expect(result.pagingPhase).toBe('adjusting'); - expect(result.queryAnchor.listContextParams).toBe( - state.queryAnchor.listContextParams, - ); - expect(result).not.toBe(state); - }); - - test('handles positive offset', () => { - const state = createInitialState(); - const action: PagingAction = { - type: 'RESET_TO_TOP', - offset: 20, - }; - - const result = pagingReducer(state, action); - - expect(result.queryAnchor.anchor.index).toBe(0); - expect(result.queryAnchor.anchor.kind).toBe('forward'); - if (result.queryAnchor.anchor.kind === 'forward') { - expect(result.queryAnchor.anchor.startRow).toBeUndefined(); - } - expect(result.pendingScrollAdjustment).toBe(20); - }); - }); - - describe('SCROLL_ADJUSTED', () => { - test('updates estimatedTotal by adding pendingScrollAdjustment, clears adjustment, sets phase to skipping', () => { - const state = createInitialState({ - estimatedTotal: 100, - pendingScrollAdjustment: 10, - pagingPhase: 'adjusting', - }); - const action: PagingAction = { - type: 'SCROLL_ADJUSTED', - }; - - const result = pagingReducer(state, action); - - expect(result.estimatedTotal).toBe(110); - expect(result.pendingScrollAdjustment).toBe(0); - expect(result.pagingPhase).toBe('skipping'); - expect(result).not.toBe(state); - }); - - test('handles negative pendingScrollAdjustment', () => { - const state = createInitialState({ - estimatedTotal: 100, - pendingScrollAdjustment: -15, - pagingPhase: 'adjusting', - }); - const action: PagingAction = { - type: 'SCROLL_ADJUSTED', - }; - - const result = pagingReducer(state, action); - - expect(result.estimatedTotal).toBe(85); - expect(result.pendingScrollAdjustment).toBe(0); - expect(result.pagingPhase).toBe('skipping'); - }); - - test('handles zero pendingScrollAdjustment', () => { - const state = createInitialState({ - estimatedTotal: 100, - pendingScrollAdjustment: 0, - pagingPhase: 'adjusting', - }); - const action: PagingAction = { - type: 'SCROLL_ADJUSTED', - }; - - const result = pagingReducer(state, action); - - expect(result.estimatedTotal).toBe(100); - expect(result.pendingScrollAdjustment).toBe(0); - expect(result.pagingPhase).toBe('skipping'); - }); - }); - - describe('PAGING_COMPLETE', () => { - test('sets pagingPhase to idle', () => { - const state = createInitialState({pagingPhase: 'skipping'}); - const action: PagingAction = { - type: 'PAGING_COMPLETE', - }; - - const result = pagingReducer(state, action); - - expect(result.pagingPhase).toBe('idle'); - expect(result).not.toBe(state); - }); - - test('keeps pagingPhase idle if already idle', () => { - const state = createInitialState({pagingPhase: 'idle'}); - const action: PagingAction = { - type: 'PAGING_COMPLETE', - }; - - const result = pagingReducer(state, action); - - expect(result.pagingPhase).toBe('idle'); - }); - }); - - describe('RESET_STATE', () => { - test('resets all state fields atomically', () => { - const state = createInitialState({ - estimatedTotal: 200, - hasReachedStart: true, - hasReachedEnd: true, - queryAnchor: { - anchor: { - index: 50, - kind: 'backward', - startRow: {id: 'old-row', createdAt: 1000}, - }, - listContextParams: {filter: 'old'}, - }, - pagingPhase: 'idle', - }); - - const newAnchor: Anchor = { - index: 10, - kind: 'forward', - startRow: {id: 'new-row', createdAt: 2000}, - }; - const newListContextParams = {filter: 'new'}; - - const action: PagingAction = { - type: 'RESET_STATE', - estimatedTotal: 150, - hasReachedStart: false, - hasReachedEnd: false, - anchor: newAnchor, - listContextParams: newListContextParams, - }; - - const result = pagingReducer(state, action); - - expect(result.estimatedTotal).toBe(150); - expect(result.hasReachedStart).toBe(false); - expect(result.hasReachedEnd).toBe(false); - expect(result.queryAnchor.anchor).toBe(newAnchor); - expect(result.queryAnchor.listContextParams).toBe(newListContextParams); - expect(result.pagingPhase).toBe('skipping'); - expect(result).not.toBe(state); - }); - - test('resets to top anchor with permalink context', () => { - const state = createInitialState(); - const permalinkAnchor = { - id: 'item-123', - index: 1, - kind: 'permalink', - } as const; - const newListContextParams = {filter: 'permalink'}; - - const action: PagingAction = { - type: 'RESET_STATE', - estimatedTotal: 1, - hasReachedStart: false, - hasReachedEnd: false, - anchor: permalinkAnchor, - listContextParams: newListContextParams, - }; - - const result = pagingReducer(state, action); - - expect(result.queryAnchor.anchor).toEqual(permalinkAnchor); - expect(result.estimatedTotal).toBe(1); - }); - }); - - describe('state machine transitions', () => { - test('SHIFT_ANCHOR_DOWN -> SCROLL_ADJUSTED -> PAGING_COMPLETE', () => { - let state: PagingState = - createInitialState({ - estimatedTotal: 100, - pagingPhase: 'idle', - pendingScrollAdjustment: 0, - }); - - const newAnchor: Anchor = { - index: 60, - kind: 'forward', - startRow: {id: 'row-60', createdAt: 3000}, - }; - - // Step 1: SHIFT_ANCHOR_DOWN - state = pagingReducer(state, { - type: 'SHIFT_ANCHOR_DOWN', - offset: 10, - newAnchor, - }); - - expect(state.pagingPhase).toBe('adjusting'); - expect(state.pendingScrollAdjustment).toBe(10); - expect(state.estimatedTotal).toBe(100); - - // Step 2: SCROLL_ADJUSTED - state = pagingReducer(state, { - type: 'SCROLL_ADJUSTED', - }); - - expect(state.pagingPhase).toBe('skipping'); - expect(state.pendingScrollAdjustment).toBe(0); - expect(state.estimatedTotal).toBe(110); - - // Step 3: PAGING_COMPLETE - state = pagingReducer(state, { - type: 'PAGING_COMPLETE', - }); - - expect(state.pagingPhase).toBe('idle'); - expect(state.estimatedTotal).toBe(110); - }); - - test('RESET_TO_TOP -> SCROLL_ADJUSTED -> PAGING_COMPLETE', () => { - let state = createInitialState({ - estimatedTotal: 100, - pagingPhase: 'idle', - pendingScrollAdjustment: 0, - }); - - // Step 1: RESET_TO_TOP - state = pagingReducer(state, { - type: 'RESET_TO_TOP', - offset: -50, - }); - - expect(state.pagingPhase).toBe('adjusting'); - expect(state.pendingScrollAdjustment).toBe(-50); - expect(state.queryAnchor.anchor.index).toBe(0); - - // Step 2: SCROLL_ADJUSTED - state = pagingReducer(state, { - type: 'SCROLL_ADJUSTED', - }); - - expect(state.pagingPhase).toBe('skipping'); - expect(state.pendingScrollAdjustment).toBe(0); - expect(state.estimatedTotal).toBe(50); - - // Step 3: PAGING_COMPLETE - state = pagingReducer(state, { - type: 'PAGING_COMPLETE', - }); - - expect(state.pagingPhase).toBe('idle'); - }); - - test('UPDATE_ESTIMATED_TOTAL can happen during any phase', () => { - const phases: Array<'idle' | 'adjusting' | 'skipping'> = [ - 'idle', - 'adjusting', - 'skipping', - ]; - - phases.forEach(phase => { - const state = createInitialState({ - estimatedTotal: 100, - pagingPhase: phase, - }); - - const result = pagingReducer(state, { - type: 'UPDATE_ESTIMATED_TOTAL', - newTotal: 150, - }); - - expect(result.estimatedTotal).toBe(150); - expect(result.pagingPhase).toBe(phase); - }); - }); - }); - - describe('immutability', () => { - test('does not mutate original state for UPDATE_ESTIMATED_TOTAL', () => { - const state = createInitialState({estimatedTotal: 100}); - const originalEstimatedTotal = state.estimatedTotal; - - pagingReducer(state, { - type: 'UPDATE_ESTIMATED_TOTAL', - newTotal: 200, - }); - - expect(state.estimatedTotal).toBe(originalEstimatedTotal); - }); - - test('does not mutate original queryAnchor for UPDATE_ANCHOR', () => { - const state = createInitialState(); - const originalAnchor = state.queryAnchor.anchor; - - pagingReducer(state, { - type: 'UPDATE_ANCHOR', - anchor: { - index: 99, - kind: 'forward', - startRow: {id: 'new', createdAt: 9999}, - }, - }); - - expect(state.queryAnchor.anchor).toBe(originalAnchor); - }); - - test('returns new state object for all actions', () => { - const state = createInitialState(); - - const actions: Array> = - [ - {type: 'REACHED_START'}, - {type: 'REACHED_END'}, - { - type: 'UPDATE_ANCHOR', - anchor: { - index: 5, - kind: 'forward', - startRow: {id: 'test', createdAt: 1000}, - }, - }, - { - type: 'SHIFT_ANCHOR_DOWN', - offset: 10, - newAnchor: { - index: 10, - kind: 'forward', - startRow: {id: 'test', createdAt: 1000}, - }, - }, - {type: 'RESET_TO_TOP', offset: -5}, - {type: 'SCROLL_ADJUSTED'}, - {type: 'PAGING_COMPLETE'}, - { - type: 'RESET_STATE', - estimatedTotal: 50, - hasReachedStart: true, - hasReachedEnd: true, - anchor: {index: 0, kind: 'forward', startRow: undefined}, - listContextParams: {filter: 'new'}, - }, - ]; - - actions.forEach(action => { - const result = pagingReducer(state, action); - expect(result).not.toBe(state); - }); - }); - }); -}); diff --git a/packages/zero-react/src/paging-reducer.ts b/packages/zero-react/src/paging-reducer.ts deleted file mode 100644 index ab37076c60..0000000000 --- a/packages/zero-react/src/paging-reducer.ts +++ /dev/null @@ -1,140 +0,0 @@ -import type {Anchor} from './use-rows.ts'; - -type QueryAnchor = { - readonly anchor: Anchor; - /** - * Associates an anchor with list query params to coordinate state during - * navigation. When list context params change (e.g., filter/sort changes or - * browser back/forward navigation), the anchor and scroll position must be - * updated atomically with the new query results. - * - * When `listContextParams !== queryAnchor.listContextParams`: - * - Use history state to restore previous scroll position and anchor if - * navigating back - * - Use permalink anchor if loading a specific item - * - Otherwise reset to top - * - * During the transition (while `!isListContextCurrent`), skip paging logic - * and count updates to avoid querying with mismatched anchor/params or - * calculating counts from inconsistent state. - */ - readonly listContextParams: TListContextParams; -}; - -export type PagingState = { - estimatedTotal: number; - hasReachedStart: boolean; - hasReachedEnd: boolean; - queryAnchor: QueryAnchor; - pagingPhase: 'idle' | 'adjusting' | 'skipping'; - pendingScrollAdjustment: number; -}; - -export function pagingReducer( - state: PagingState, - action: PagingAction, -): PagingState { - switch (action.type) { - case 'UPDATE_ESTIMATED_TOTAL': { - const newTotal = Math.max(state.estimatedTotal, action.newTotal); - if (newTotal === state.estimatedTotal) { - return state; - } - return { - ...state, - estimatedTotal: newTotal, - }; - } - - case 'REACHED_START': - return {...state, hasReachedStart: true}; - - case 'REACHED_END': - return {...state, hasReachedEnd: true}; - - case 'UPDATE_ANCHOR': - return { - ...state, - queryAnchor: { - ...state.queryAnchor, - anchor: action.anchor, - }, - }; - - case 'SHIFT_ANCHOR_DOWN': - return { - ...state, - queryAnchor: { - ...state.queryAnchor, - anchor: action.newAnchor, - }, - pendingScrollAdjustment: action.offset, - pagingPhase: 'adjusting', - }; - - case 'RESET_TO_TOP': - return { - ...state, - queryAnchor: { - ...state.queryAnchor, - anchor: {index: 0, kind: 'forward', startRow: undefined}, - }, - pendingScrollAdjustment: action.offset, - pagingPhase: 'adjusting', - }; - - case 'SCROLL_ADJUSTED': - return { - ...state, - estimatedTotal: state.estimatedTotal + state.pendingScrollAdjustment, - pendingScrollAdjustment: 0, - pagingPhase: 'skipping', - }; - - case 'PAGING_COMPLETE': - return { - ...state, - pagingPhase: 'idle', - }; - - case 'RESET_STATE': - return { - ...state, - estimatedTotal: action.estimatedTotal, - hasReachedStart: action.hasReachedStart, - hasReachedEnd: action.hasReachedEnd, - queryAnchor: { - listContextParams: action.listContextParams, - anchor: action.anchor, - }, - pagingPhase: 'skipping', - }; - - default: { - action satisfies never; - return state; - } - } -} - -export type PagingAction = - | {type: 'UPDATE_ESTIMATED_TOTAL'; newTotal: number} - | {type: 'REACHED_START'} - | {type: 'REACHED_END'} - | {type: 'UPDATE_ANCHOR'; anchor: Anchor} - | { - type: 'SHIFT_ANCHOR_DOWN'; - offset: number; - newAnchor: Anchor; - } - | {type: 'RESET_TO_TOP'; offset: number} - | {type: 'SCROLL_ADJUSTED'} - | {type: 'PAGING_COMPLETE'} - | { - type: 'RESET_STATE'; - estimatedTotal: number; - hasReachedStart: boolean; - hasReachedEnd: boolean; - anchor: Anchor; - listContextParams: TListContextParams; - }; diff --git a/packages/zero-react/src/use-rows.test.tsx b/packages/zero-react/src/use-rows.test.tsx deleted file mode 100644 index 789923c7ec..0000000000 --- a/packages/zero-react/src/use-rows.test.tsx +++ /dev/null @@ -1,457 +0,0 @@ -import {renderHook, waitFor} from '@testing-library/react'; -import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'; -import { - MockSocket, - zeroForTest, -} from '../../zero-client/src/client/test-utils.ts'; -import { - getPageQuery, - getSingleQuery, - type Item, - mutators, - schema, - type StartRow, - toStartRow, -} from './test-helpers.ts'; -import {useRows} from './use-rows.ts'; -import {ZeroProvider} from './zero-provider.tsx'; - -describe('useRows', () => { - const createTestZero = () => - zeroForTest({ - kvStore: 'mem', - schema, - mutators, - }); - let z: ReturnType; - - // Helper function to render useRows with common configuration - const renderUseRows = ( - pageSize: number, - anchor: Parameters>[0]['anchor'], - zero = z, - ) => - renderHook( - () => - useRows({ - pageSize, - anchor, - getPageQuery, - getSingleQuery, - toStartRow, - }), - { - wrapper: ({children}) => ( - {children} - ), - }, - ); - - beforeEach(async () => { - vi.stubGlobal('WebSocket', MockSocket as unknown as typeof WebSocket); - - z = createTestZero(); - - // Establish mock connection - void z.triggerConnected(); - - // Populate 1000 rows for pagination testing - await z.mutate(mutators.populateItems({count: 1000})).client; - }); - - afterEach(async () => { - await z.close(); - vi.restoreAllMocks(); - }); - - test('forward pagination from start', async () => { - const {result} = renderUseRows(100, {kind: 'forward', index: 0}); - - // Wait for data to load - await waitFor(() => { - expect(result.current?.rowsLength).toBe(100); - }); - - // Small delay to ensure queries are fully registered - await new Promise(resolve => setTimeout(resolve, 50)); - - // Mark queries as complete - await z.markAllQueriesAsGot(); - - // Wait for complete status - await waitFor(() => { - expect(result.current?.complete).toBe(true); - }); - - // Check initial state - expect(result.current?.rowsEmpty).toBe(false); - expect(result.current?.atStart).toBe(true); - expect(result.current?.atEnd).toBe(false); - expect(result.current?.firstRowIndex).toBe(0); - - // Verify rows - expect(result.current?.rowAt(0)?.id).toBe('1'); - expect(result.current?.rowAt(99)?.id).toBe('100'); - expect(result.current?.rowAt(100)).toBeUndefined(); - }); - - test('forward pagination - second page', async () => { - const {result} = renderUseRows(100, { - kind: 'forward', - index: 100, - startRow: {name: 'Item 0100'}, - }); - - await waitFor(() => { - expect(result.current?.rowsLength).toBe(100); - }); - - // Mark queries as complete - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current?.complete).toBe(true); - }); - - expect(result.current?.atStart).toBe(false); - expect(result.current?.atEnd).toBe(false); - expect(result.current?.firstRowIndex).toBe(100); - - expect(result.current?.rowAt(100)?.id).toBe('101'); - expect(result.current?.rowAt(199)?.id).toBe('200'); - }); - - test('forward pagination - last page', async () => { - const {result} = renderUseRows(100, { - kind: 'forward', - index: 900, - startRow: {name: 'Item 0900'}, - }); - - await waitFor(() => { - expect(result.current?.rowsLength).toBe(100); - }); - - // Mark queries as complete - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current?.complete).toBe(true); - }); - - expect(result.current?.atStart).toBe(false); - expect(result.current?.firstRowIndex).toBe(900); - expect(result.current?.rowAt(900)?.id).toBe('901'); - expect(result.current?.rowAt(999)?.id).toBe('1000'); - }); - - test('backward pagination', async () => { - const {result} = renderUseRows(100, { - kind: 'backward', - index: 500, - startRow: {name: 'Item 0500'}, - }); - - await waitFor(() => { - expect(result.current?.rowsLength).toBeGreaterThan(0); - }); - - // Mark queries as complete - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current?.complete).toBe(true); - }); - - expect(result.current?.atStart).toBe(false); - expect(result.current?.atEnd).toBe(false); - - // With backward anchor, we load backward from index 500 - expect(result.current?.firstRowIndex).toBeLessThanOrEqual(500); - }); - - test('empty result set', async () => { - const z2 = zeroForTest({ - kvStore: 'mem', - schema, - mutators, - }); - - void z2.triggerConnected(); - - const {result} = renderUseRows(100, {kind: 'forward', index: 0}, z2); - - await waitFor(() => { - expect(result.current).not.toBeNull(); - }); - - // Mark queries as complete - await z2.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current?.complete).toBe(true); - }); - - expect(result.current?.rowsLength).toBe(0); - expect(result.current?.rowsEmpty).toBe(true); - expect(result.current?.atStart).toBe(true); - - await z2.close(); - }); - - test('permalink anchor - item in middle', async () => { - const {result} = renderUseRows( - 10, // Must be even for permalink - {kind: 'permalink', index: 500, id: '500'}, - ); - - // Wait for data to load - await waitFor(() => expect(result.current.rowsLength).toBeGreaterThan(0)); - - await z.markAllQueriesAsGot(); - - await waitFor(() => expect(result.current.complete).toBe(true)); - - // Permalink should center around the anchor item - // With pageSize=10, we get 5 items before and 4 items after the anchor - expect(result.current.rowsLength).toBe(10); - expect(result.current.firstRowIndex).toBe(495); // 500 - 5 - expect(result.current.permalinkNotFound).toBe(false); - - // Check the anchor item (ID 500 = "Item 0500") - expect(result.current.rowAt(500)).toEqual({ - id: '500', - name: 'Item 0500', - }); - - // Check items before - expect(result.current.rowAt(495)).toEqual({ - id: '495', - name: 'Item 0495', - }); - expect(result.current.rowAt(499)).toEqual({ - id: '499', - name: 'Item 0499', - }); - - // Check items after - expect(result.current.rowAt(501)).toEqual({ - id: '501', - name: 'Item 0501', - }); - expect(result.current.rowAt(504)).toEqual({ - id: '504', - name: 'Item 0504', - }); - - // Out of range should be undefined - expect(result.current.rowAt(494)).toBeUndefined(); - expect(result.current.rowAt(505)).toBeUndefined(); - - expect(result.current.atStart).toBe(false); - expect(result.current.atEnd).toBe(false); - }); - - test('permalink anchor - item near start', async () => { - const {result} = renderUseRows(10, {kind: 'permalink', index: 2, id: '3'}); - - await waitFor(() => expect(result.current.rowsLength).toBeGreaterThan(0)); - - await new Promise(resolve => setTimeout(resolve, 50)); - await z.markAllQueriesAsGot(); - - await waitFor(() => expect(result.current.complete).toBe(true)); - - // Near start, we have 2 items before (IDs 1, 2) and anchor at ID 3 (index 2) - expect(result.current.rowsLength).toBe(7); // 2 before + anchor + 4 after - expect(result.current.firstRowIndex).toBe(0); - expect(result.current.atStart).toBe(true); - expect(result.current.atEnd).toBe(false); - - expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); - expect(result.current.rowAt(1)).toEqual({id: '2', name: 'Item 0002'}); - expect(result.current.rowAt(2)).toEqual({id: '3', name: 'Item 0003'}); - expect(result.current.rowAt(6)).toEqual({id: '7', name: 'Item 0007'}); - }); - - test('permalink anchor - item near end', async () => { - const {result} = renderUseRows(10, { - kind: 'permalink', - index: 997, - id: '998', - }); - - await waitFor(() => expect(result.current.rowsLength).toBeGreaterThan(0)); - - await z.markAllQueriesAsGot(); - - await waitFor(() => expect(result.current.complete).toBe(true)); - - // Near end, we have 5 items before and anchor (ID 998 at index 997), but only 2 items after (IDs 999, 1000) - expect(result.current.rowsLength).toBe(8); // 5 before + anchor + 2 after - expect(result.current.firstRowIndex).toBe(992); // 997 - 5 - expect(result.current.atStart).toBe(false); - expect(result.current.atEnd).toBe(true); - - expect(result.current.rowAt(992)).toEqual({ - id: '993', - name: 'Item 0993', - }); - expect(result.current.rowAt(997)).toEqual({ - id: '998', - name: 'Item 0998', - }); - expect(result.current.rowAt(999)).toEqual({ - id: '1000', - name: 'Item 1000', - }); - }); - - test('permalink anchor - item not found', async () => { - const {result} = renderUseRows(10, { - kind: 'permalink', - index: 500, - id: '9999', - }); - - // Initial state - expect(result.current.rowsLength).toBe(0); - expect(result.current.complete).toBe(false); - - await z.markAllQueriesAsGot(); - - // Wait for the item query to complete (which returns undefined) - await waitFor(() => expect(result.current.complete).toBe(true)); - - expect(result.current.permalinkNotFound).toBe(true); - expect(result.current.rowsLength).toBe(0); - expect(result.current.rowAt(500)).toBeUndefined(); - }); - - test('reactive updates - adding new items', async () => { - const {result} = renderUseRows(10, {kind: 'forward', index: 0}); - - // Wait for initial data (10 items) - await waitFor(() => expect(result.current?.rowsLength).toBe(10)); - - await z.markAllQueriesAsGot(); - - await waitFor(() => expect(result.current?.complete).toBe(true)); - - // Verify initial items - expect(result.current.rowAt(0)?.id).toBe('1'); - expect(result.current.rowAt(9)?.id).toBe('10'); - - // Add new items that should appear at the start of the query results - // Use names that sort before "Item 0001" - await z.mutate(mutators.addItem({id: '1001', name: 'Item 0000'})).client; - await z.mutate(mutators.addItem({id: '1002', name: 'Item 00005'})).client; - - // Wait for the hook to react to the new data - // The new items should appear at the start since they sort before existing items - await waitFor(() => { - const firstItem = result.current.rowAt(0); - return firstItem?.id === '1001'; - }); - - // Verify the new items are included and properly sorted - expect(result.current.rowsLength).toBe(10); - expect(result.current.rowAt(0)).toEqual({ - id: '1001', - name: 'Item 0000', - }); - expect(result.current.rowAt(1)).toEqual({ - id: '1002', - name: 'Item 00005', - }); - expect(result.current.rowAt(2)).toEqual({id: '1', name: 'Item 0001'}); - - // Original items shifted down - item 10 and 9 should be pushed out - expect(result.current.rowAt(9)).toEqual({id: '8', name: 'Item 0008'}); - expect(result.current.rowAt(10)).toBeUndefined(); - }); - - test('reactive updates - backward pagination', async () => { - const {result} = renderUseRows(10, { - kind: 'backward', - index: 500, - startRow: {name: 'Item 0500'}, - }); - - // Wait for initial data - await waitFor(() => expect(result.current?.rowsLength).toBeGreaterThan(0)); - - await z.markAllQueriesAsGot(); - - await waitFor(() => expect(result.current?.complete).toBe(true)); - - const initialFirstIndex = result.current.firstRowIndex; - const initialLength = result.current.rowsLength; - - // Add items that should appear in the backward pagination range - // These items sort in the range we're viewing (around index 500, going backward) - await z.mutate(mutators.addItem({id: '1001', name: 'Item 04965'})).client; - await z.mutate(mutators.addItem({id: '1002', name: 'Item 04975'})).client; - - // Wait for reactive update - await waitFor(() => { - const itemIds = Array.from({length: result.current.rowsLength}, (_, i) => - result.current.rowAt(initialFirstIndex + i), - ).map(item => item?.id); - return itemIds.includes('1001'); - }); - - // The new items should be included in the backward pagination - expect(result.current.rowsLength).toBe(initialLength); - // Verify the new items appear in the range - const itemIds = Array.from({length: result.current.rowsLength}, (_, i) => - result.current.rowAt(initialFirstIndex + i), - ).map(item => item?.id); - expect(itemIds).toContain('1001'); - expect(itemIds).toContain('1002'); - }); - - test('reactive updates - permalink anchor', async () => { - const {result} = renderUseRows(10, { - kind: 'permalink', - index: 500, - id: '501', - }); - - // Wait for data to load - await waitFor(() => expect(result.current.rowsLength).toBeGreaterThan(0)); - - await z.markAllQueriesAsGot(); - - await waitFor(() => expect(result.current.complete).toBe(true)); - - // Verify the permalink item is centered - expect(result.current.permalinkNotFound).toBe(false); - expect(result.current.rowAt(500)).toEqual({id: '501', name: 'Item 0501'}); - - const initialFirstIndex = result.current.firstRowIndex; - - // Add items that sort near the permalink item (around Item 0501) - await z.mutate(mutators.addItem({id: '1001', name: 'Item 04985'})).client; - await z.mutate(mutators.addItem({id: '1002', name: 'Item 04995'})).client; - - // Wait for reactive update - await waitFor(() => { - // New items should appear in the visible range - const itemIds = Array.from({length: result.current.rowsLength}, (_, i) => - result.current.rowAt(initialFirstIndex + i), - ).map(item => item?.id); - return itemIds.includes('1001'); - }); - - // Verify the new items are included and the permalink item is still visible - expect(result.current.permalinkNotFound).toBe(false); - // The permalink item should still be accessible (though its index may have changed) - const itemIds = Array.from({length: result.current.rowsLength}, (_, i) => - result.current.rowAt(initialFirstIndex + i), - ).map(item => item?.id); - expect(itemIds).toContain('501'); - expect(itemIds).toContain('1001'); - expect(itemIds).toContain('1002'); - }); -}); diff --git a/packages/zero-react/src/use-rows.ts b/packages/zero-react/src/use-rows.ts deleted file mode 100644 index 18c74077fa..0000000000 --- a/packages/zero-react/src/use-rows.ts +++ /dev/null @@ -1,219 +0,0 @@ -import {assert} from 'shared/src/asserts.ts'; -import type { - DefaultContext, - DefaultSchema, -} from '../../zero-types/src/default-types.ts'; -import type {QueryOrQueryRequest} from '../../zql/src/query/query-registry.ts'; -import {useQuery, type UseQueryOptions} from './use-query.tsx'; - -export type Anchor = - | Readonly<{ - index: number; - kind: 'forward'; - startRow?: TStartRow | undefined; - }> - | Readonly<{ - index: number; - kind: 'backward'; - startRow: TStartRow; - }> - | Readonly<{ - index: number; - kind: 'permalink'; - id: string; - }>; - -export type GetPageQuery = ( - limit: number, - start: TStartRow | null, - dir: 'forward' | 'backward', -) => GetQueryReturnType; - -export type GetSingleQuery = ( - id: string, -) => GetQueryReturnType; - -export type GetQueryReturnType = QueryOrQueryRequest< - keyof DefaultSchema['tables'] & string, - // oxlint-disable-next-line no-explicit-any - any, // input - // oxlint-disable-next-line no-explicit-any - any, // output - DefaultSchema, - TReturn, - DefaultContext ->; - -export function useRows({ - pageSize, - anchor, - options, - getPageQuery, - getSingleQuery, - toStartRow, -}: { - pageSize: number; - anchor: Anchor; - options?: UseQueryOptions | undefined; - - getPageQuery: GetPageQuery; - getSingleQuery: GetSingleQuery; - toStartRow: (row: TRow) => TStartRow; -}): { - rowAt: (index: number) => TRow | undefined; - rowsLength: number; - complete: boolean; - rowsEmpty: boolean; - atStart: boolean; - atEnd: boolean; - firstRowIndex: number; - permalinkNotFound: boolean; -} { - const {kind, index: anchorIndex} = anchor; - let permalinkNotFound = false; - - if (kind === 'permalink') { - const {id} = anchor; - assert(id); - assert(pageSize % 2 === 0); - - const halfPageSize = pageSize / 2; - - const qItem = getSingleQuery(id); - - const [row, resultRow] = useQuery(qItem, options); - const completeRow = resultRow.type === 'complete'; - - const typedRow = row as TRow | undefined; - - // Early return if permalink not found to skip unnecessary queries - if (completeRow && typedRow === undefined) { - // Call dummy useQuery to maintain hooks call order - void useQuery(null, options); - void useQuery(null, options); - - return { - rowAt: () => undefined, - rowsLength: 0, - complete: true, - rowsEmpty: true, - atStart: true, - atEnd: true, - firstRowIndex: anchorIndex, - permalinkNotFound: true, - }; - } - - const start = typedRow && toStartRow(typedRow); - - const qBefore = start && getPageQuery(halfPageSize + 1, start, 'backward'); - const qAfter = start && getPageQuery(halfPageSize, start, 'forward'); - - const [rowsBefore, resultBefore] = useQuery(qBefore, options); - const [rowsAfter, resultAfter] = useQuery(qAfter, options); - const completeBefore = resultBefore.type === 'complete'; - const completeAfter = resultAfter.type === 'complete'; - - const typedRowsBefore = rowsBefore as unknown as TRow[] | undefined; - const typedRowsAfter = rowsAfter as unknown as TRow[] | undefined; - const rowsBeforeLength = typedRowsBefore?.length ?? 0; - const rowsAfterLength = typedRowsAfter?.length ?? 0; - const rowsBeforeSize = Math.min(rowsBeforeLength, halfPageSize); - const rowsAfterSize = Math.min(rowsAfterLength, halfPageSize - 1); - - const firstRowIndex = anchorIndex - rowsBeforeSize; - - return { - rowAt: (index: number) => { - if (index === anchorIndex) { - return typedRow; - } - if (index > anchorIndex) { - if (typedRowsAfter === undefined) { - return undefined; - } - const i = index - anchorIndex - 1; - if (i >= rowsAfterSize) { - return undefined; - } - return typedRowsAfter[i]; - } - assert(index < anchorIndex); - if (typedRowsBefore === undefined) { - return undefined; - } - const i = anchorIndex - index - 1; - if (i >= rowsBeforeSize) { - return undefined; - } - return typedRowsBefore[i]; - }, - rowsLength: rowsBeforeSize + rowsAfterSize + (typedRow ? 1 : 0), - complete: - completeRow && - (typedRow === undefined || (completeBefore && completeAfter)), - rowsEmpty: - typedRow === undefined || (rowsBeforeSize === 0 && rowsAfterSize === 0), - atStart: completeBefore && rowsBeforeLength <= halfPageSize, - atEnd: completeAfter && rowsAfterLength <= halfPageSize - 1, - firstRowIndex: firstRowIndex, - permalinkNotFound, - }; - } - - kind satisfies 'forward' | 'backward'; - - const {startRow: start = null} = anchor; - - const q = getPageQuery(pageSize + 1, start, kind); - - const [rows, result] = useQuery(q, options); - // not used but needed to follow rules of hooks - void useQuery(null, options); - void useQuery(null, options); - - const typedRows = rows as unknown as TRow[]; - const complete = result.type === 'complete'; - const hasMoreRows = typedRows.length > pageSize; - const rowsLength = hasMoreRows ? pageSize : typedRows.length; - const rowsEmpty = typedRows.length === 0; - - if (kind === 'forward') { - return { - rowAt: (index: number) => - index - anchorIndex < rowsLength - ? typedRows[index - anchorIndex] - : undefined, - rowsLength: rowsLength, - complete, - rowsEmpty: rowsEmpty, - atStart: start === null || anchorIndex === 0, - atEnd: complete && !hasMoreRows, - firstRowIndex: anchorIndex, - permalinkNotFound, - }; - } - - kind satisfies 'backward'; - assert(start !== null); - - return { - rowAt: (index: number) => { - if (index >= anchorIndex) { - return undefined; - } - const i = anchorIndex - index - 1; - if (i < 0 || i >= rowsLength) { - return undefined; - } - return typedRows[i]; - }, - rowsLength: rowsLength, - complete, - rowsEmpty: rowsEmpty, - atStart: complete && !hasMoreRows, - atEnd: false, - firstRowIndex: anchorIndex - rowsLength, - permalinkNotFound, - }; -} diff --git a/packages/zero-react/src/use-zero-virtualizer.test.tsx b/packages/zero-react/src/use-zero-virtualizer.test.tsx deleted file mode 100644 index d6b51cf996..0000000000 --- a/packages/zero-react/src/use-zero-virtualizer.test.tsx +++ /dev/null @@ -1,1474 +0,0 @@ -import type {Virtualizer} from '@tanstack/react-virtual'; -import {act, renderHook, waitFor} from '@testing-library/react'; -import type {ReactNode} from 'react'; -import type {Root} from 'react-dom/client'; -import {createRoot} from 'react-dom/client'; -import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'; -import { - MockSocket, - zeroForTest, -} from '../../zero-client/src/client/test-utils.ts'; -import { - getPageQuery, - getSingleQuery, - mutators, - schema, - toStartRow, - type Item, -} from './test-helpers.ts'; -import type {UseZeroVirtualizerOptions} from './use-zero-virtualizer.ts'; -import {useZeroVirtualizer} from './use-zero-virtualizer.ts'; -import {ZeroProvider} from './zero-provider.tsx'; - -// Mock wouter's useHistoryState since it needs browser history API -vi.mock('wouter/use-browser-location', () => ({ - useHistoryState: () => null, -})); - -// Helper components and utilities -function VirtualScrollContainer({ - result, - virtualItems, -}: { - result: { - virtualizer: Virtualizer; - rowAt: (index: number) => Item | undefined; - total: number | undefined; - estimatedTotal: number; - }; - virtualItems: ReturnType< - Virtualizer['getVirtualItems'] - >; -}) { - return ( - <> -
-
- {virtualItems.map(item => ( -
- {result.rowAt(item.index)?.name ?? 'Loading...'} -
- ))} -
-
- -
{result.total}
-
{result.estimatedTotal}
- - ); -} - -function createTestContainer() { - const container = document.createElement('div'); - document.body.appendChild(container); - return container; -} - -function cleanupTestContainer(root: Root, container: HTMLElement) { - root.unmount(); - document.body.removeChild(container); -} - -describe('useZeroVirtualizer', () => { - // Increase timeout for browser tests - they can be slow especially on CI - vi.setConfig({testTimeout: 60_000}); - - const createTestZero = () => - zeroForTest({ - kvStore: 'mem', - schema, - mutators, - logLevel: 'debug', - }); - let z: ReturnType; - - function createWrapper(zero: ReturnType) { - return ({children}: {children: ReactNode}) => ( - {children} - ); - } - - // Mock scroll element - let mockScrollElement: HTMLDivElement; - - function createBaseHookOptions( - overrides: Partial< - UseZeroVirtualizerOptions< - HTMLElement, - Element, - string, - Item, - typeof toStartRow extends (row: Item) => infer R ? R : never - > - > = {}, - ) { - return { - estimateSize: () => 50, - getScrollElement: () => mockScrollElement, - listContextParams: 'default', - getPageQuery, - getSingleQuery, - toStartRow, - ...overrides, - }; - } - - beforeEach(async () => { - vi.stubGlobal('WebSocket', MockSocket as unknown as typeof WebSocket); - - // Create a mock scroll element - mockScrollElement = document.createElement('div'); - Object.defineProperty(mockScrollElement, 'scrollTop', { - writable: true, - value: 0, - }); - Object.defineProperty(mockScrollElement, 'clientHeight', { - value: 800, - }); - document.body.appendChild(mockScrollElement); - - z = createTestZero(); - void z.triggerConnected(); - - // Populate data for testing - await z.mutate(mutators.populateItems({count: 1000})).client; - }); - - afterEach(async () => { - document.body.removeChild(mockScrollElement); - await z.close(); - vi.restoreAllMocks(); - }); - - test('basic initialization', async () => { - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions()), - {wrapper: createWrapper(z)}, - ); - - // Wait for initial data to load - await waitFor(() => { - expect(result.current.complete).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - // Verify basic state - expect(result.current.rowsEmpty).toBe(false); - expect(result.current.permalinkNotFound).toBe(false); - expect(result.current.virtualizer).toBeDefined(); - expect(result.current.estimatedTotal).toBeGreaterThan(0); - - // Verify we can access rows - expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); - }); - - test('permalink loading', async () => { - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions({permalinkID: '500'})), - {wrapper: createWrapper(z)}, - ); - - // Wait for data to load - await waitFor(() => { - expect(result.current.complete).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - // Verify permalink item is accessible - expect(result.current.permalinkNotFound).toBe(false); - - // Find all loaded items - the permalink may be at any position after index adjustments - const loadedItems: Item[] = []; - for (let i = 0; i < result.current.virtualizer.getTotalSize(); i++) { - const row = result.current.rowAt(i); - if (row) { - loadedItems.push(row); - } - } - - // The permalink item should be among the loaded items - expect(loadedItems.some(item => item.id === '500')).toBe(true); - }); - - test('permalink not found', async () => { - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions({permalinkID: '9999'})), - {wrapper: createWrapper(z)}, - ); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - expect(result.current.permalinkNotFound).toBe(true); - expect(result.current.rowsEmpty).toBe(true); - }); - - test('empty result set', async () => { - const z2 = zeroForTest({ - kvStore: 'mem', - schema, - mutators, - }); - - void z2.triggerConnected(); - - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions()), - {wrapper: createWrapper(z2)}, - ); - - await z2.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - expect(result.current.rowsEmpty).toBe(true); - // Estimated total stays at 1 (loading skeleton) since empty results don't update it - expect(result.current.estimatedTotal).toBe(1); - // Total is 1 since both ends are reached (atStart and atEnd are true for empty results) - expect(result.current.total).toBe(1); - - await z2.close(); - }); - - test('list context change resets state', async () => { - const {result, rerender} = renderHook( - ({listContextParams}: {listContextParams: string}) => - useZeroVirtualizer(createBaseHookOptions({listContextParams})), - { - initialProps: {listContextParams: 'filter1'}, - wrapper: createWrapper(z), - }, - ); - - // Wait for initial load - await waitFor(() => { - expect(result.current.complete).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - const initialEstimatedTotal = result.current.estimatedTotal; - expect(initialEstimatedTotal).toBeGreaterThan(0); - - // Change list context (e.g., applying a filter) - rerender({listContextParams: 'filter2'}); - - // Wait for state to potentially update - await new Promise(resolve => setTimeout(resolve, 100)); - - await z.markAllQueriesAsGot(); - - await waitFor( - () => { - expect(result.current.complete).toBe(true); - }, - {timeout: 2000}, - ); - - // Should still have data (mock doesn't actually filter) - expect(result.current.rowsEmpty).toBe(false); - }); - - test('virtualizer count includes loading skeleton', async () => { - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions()), - {wrapper: createWrapper(z)}, - ); - - await waitFor(() => { - expect(result.current.complete).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - // Wait for estimatedTotal to update after data loads - await waitFor(() => { - expect(result.current.estimatedTotal).toBeGreaterThan(1); - }); - - // Virtualizer count should include skeleton row at end if not at end - const virtualizerCount = result.current.virtualizer.options.count; - const estimatedTotal = result.current.estimatedTotal; - - // Since we haven't reached the end, count should be estimatedTotal + 1 (skeleton) - expect(virtualizerCount).toBe(estimatedTotal + 1); - }); - - test('total is undefined until both ends reached', async () => { - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions()), - {wrapper: createWrapper(z)}, - ); - - await waitFor(() => { - expect(result.current.complete).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - // Initially at start but not at end - expect(result.current.total).toBeUndefined(); - }); - - test('estimated total increases as data loads', async () => { - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions()), - {wrapper: createWrapper(z)}, - ); - - await waitFor(() => { - expect(result.current.complete).toBe(false); - }); - - // Capture estimated total before marking queries - const initialEstimatedTotal = result.current.estimatedTotal; - expect(initialEstimatedTotal).toBeLessThanOrEqual(1); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - // Estimated total should increase after data loads - await waitFor(() => { - expect(result.current.estimatedTotal).toBeGreaterThan( - initialEstimatedTotal, - ); - }); - }); - - test('rowAt returns correct items', async () => { - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions()), - {wrapper: createWrapper(z)}, - ); - - await waitFor(() => { - expect(result.current.complete).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - // Test rowAt function - expect(result.current.rowAt(0)).toEqual({id: '1', name: 'Item 0001'}); - expect(result.current.rowAt(1)).toEqual({id: '2', name: 'Item 0002'}); - expect(result.current.rowAt(99)).toEqual({id: '100', name: 'Item 0100'}); - - // Out of range should be undefined - expect(result.current.rowAt(10000)).toBeUndefined(); - }); - - test('TanStack Virtual options are forwarded', async () => { - let observeElementOffsetCalled = false; - let observeElementRectCalled = false; - - const {result} = renderHook( - () => - useZeroVirtualizer( - createBaseHookOptions({ - observeElementOffset: (_instance, cb) => { - observeElementOffsetCalled = true; - cb(0, false); - return () => undefined; - }, - observeElementRect: (_instance, cb) => { - observeElementRectCalled = true; - cb({height: 800, width: 400}); - return () => undefined; - }, - }), - ), - {wrapper: createWrapper(z)}, - ); - - // Wait for hook to initialize - await waitFor(() => { - expect(result.current.virtualizer).toBeDefined(); - }); - - // Verify custom callbacks were called - expect(observeElementOffsetCalled).toBe(true); - expect(observeElementRectCalled).toBe(true); - }); - - test('scrolling down updates visible items correctly', async () => { - const estimateSize = 25; - const toItemName = (index: number) => - `Item ${String(index + 1).padStart(4, '0')}`; - - const scrollElement = { - scrollTop: 0, - clientHeight: 800, - scrollHeight: 800, - } as unknown as Element; - - let offsetCallback: - | ((offset: number, isScrolling: boolean) => void) - | null = null; - - const getPageQuerySpy = vi.fn(getPageQuery); - - const {result} = renderHook( - () => - useZeroVirtualizer({ - estimateSize: () => estimateSize, - getScrollElement: () => scrollElement, - listContextParams: 'default', - getPageQuery: getPageQuerySpy, - getSingleQuery, - toStartRow, - overscan: 0, - initialRect: {height: 800, width: 400}, - observeElementRect: (_instance, cb) => { - cb({height: 800, width: 400}); - return () => undefined; - }, - observeElementOffset: (_instance, cb) => { - offsetCallback = cb; - cb(scrollElement.scrollTop, false); - return () => { - offsetCallback = null; - }; - }, - scrollToFn: (offset, _options, _instance) => { - scrollElement.scrollTop = offset; - offsetCallback?.(offset, true); - offsetCallback?.(offset, false); - }, - }), - { - wrapper: ({children}: {children: ReactNode}) => ( - {children} - ), - }, - ); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - expect(getPageQuerySpy).toHaveBeenCalledWith(101, null, 'forward'); - - const updateScrollHeight = () => { - const totalSize = result.current.virtualizer.getTotalSize(); - (scrollElement as {scrollHeight: number}).scrollHeight = Math.max( - scrollElement.clientHeight, - totalSize, - ); - }; - - await waitFor(() => { - result.current.virtualizer.measure(); - updateScrollHeight(); - expect( - result.current.virtualizer.getVirtualItems().length, - ).toBeGreaterThan(0); - }); - - // Incrementally scroll down to trigger paging and test that visible items match scroll position - const scrollStep = 700; - const maxScrollAttempts = 100; - - // Test Y position in viewport (e.g., 100px from top of viewport) - const testYPosition = 100; - - for (let attempt = 0; attempt < maxScrollAttempts; attempt++) { - updateScrollHeight(); - const currentScrollTop = scrollElement.scrollTop; - const currentScrollHeight = scrollElement.scrollHeight; - const maxScrollTop = Math.max( - 0, - currentScrollHeight - scrollElement.clientHeight, - ); - const newScrollTop = Math.min( - currentScrollTop + scrollStep, - maxScrollTop, - ); - - act(() => { - result.current.virtualizer.scrollToOffset(newScrollTop); - result.current.virtualizer.measure(); - }); - - // Force virtualizer to compute range with new scroll position - result.current.virtualizer.getVirtualItems(); - - // Mark all queries repeatedly until complete - await z.markAllQueriesAsGot(); - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - // Verify that item at Y position matches expected row - // Expected row index = floor((scrollTop + Y) / estimateSize) - const expectedRowIndex = Math.floor( - (newScrollTop + testYPosition) / estimateSize, - ); - const expectedItem = result.current.rowAt(expectedRowIndex); - - // Verify the item exists and has the expected name - expect(expectedItem?.name).toBe(toItemName(expectedRowIndex)); - - // If we can't scroll further, we're done - if (newScrollTop >= maxScrollTop && newScrollTop === currentScrollTop) { - break; - } - } - - expect(result.current.total).toBe(1000); - - await waitFor(() => { - expect(result.current.complete).toBe(true); - }); - - // Verify all page queries are using the correct parameters - const calls = getPageQuerySpy.mock.calls; - expect(calls.length).toBeGreaterThan(0); - - // First query should have null start (initial load from top) - expect(calls[0][0]).toBe(101); // limit - expect(calls[0][1]).toBeNull(); // start - expect(calls[0][2]).toBe('forward'); // direction - - // Check all queries have correct limit and direction - for (const [limit, start, dir] of calls) { - expect(limit).toBe(101); - expect(dir).toBe('forward'); - - // If start is provided, verify it has correct format - if (start) { - expect(start.name).toMatch(/^Item \d{4}$/); - } - } - - // Verify start rows are in increasing order (forward pagination) - const startIndices: number[] = []; - for (const [, start] of calls) { - if (start) { - const index = Number(start.name.slice('Item '.length)) - 1; - startIndices.push(index); - } - } - - // Each start should be greater than or equal to the previous (forward paging) - for (let i = 1; i < startIndices.length; i++) { - expect(startIndices[i]).toBeGreaterThanOrEqual(startIndices[i - 1]); - } - }); - - test('ReactDOM rendering and scrolling to do paging', async () => { - const estimateSize = 50; - const MIN_PAGE_SIZE = 100; // From use-zero-virtualizer.ts - - const getPageQuerySpy = vi.fn(getPageQuery); - - let offsetCallback: - | ((offset: number, isScrolling: boolean) => void) - | null = null; - - function VirtualList() { - const {virtualizer, rowAt} = useZeroVirtualizer({ - estimateSize: () => estimateSize, - getScrollElement: () => document.getElementById('scroll-container'), - listContextParams: 'default', - getPageQuery: getPageQuerySpy, - getSingleQuery, - toStartRow, - overscan: 0, - initialRect: {height: 800, width: 400}, - observeElementRect: (_instance, cb) => { - cb({height: 800, width: 400}); - return () => undefined; - }, - observeElementOffset: (_instance, cb) => { - offsetCallback = cb; - const scrollContainer = document.getElementById('scroll-container'); - if (scrollContainer) { - cb(scrollContainer.scrollTop, false); - } - return () => { - offsetCallback = null; - }; - }, - scrollToFn: (offset, _options, _instance) => { - const scrollContainer = document.getElementById('scroll-container'); - if (scrollContainer) { - scrollContainer.scrollTop = offset; - offsetCallback?.(offset, true); - offsetCallback?.(offset, false); - } - }, - }); - - const virtualItems = virtualizer.getVirtualItems(); - - return ( -
-
- {virtualItems.map(item => ( -
- {rowAt(item.index)?.name ?? 'Loading...'} -
- ))} -
-
- ); - } - - // Create a real DOM container and render with ReactDOM directly - const container = document.createElement('div'); - document.body.appendChild(container); - const root = createRoot(container); - - try { - root.render( - - - , - ); - - await z.markAllQueriesAsGot(); - - // Wait for initial items to render - await waitFor(() => { - const items = container.querySelectorAll('[data-index]'); - expect(items.length).toBeGreaterThan(0); - }); - - // Verify first item rendered correctly - const firstItem = container.querySelector('[data-index="0"]'); - expect(firstItem).toBeTruthy(); - expect(firstItem?.textContent).toBe('Item 0001'); - - // Verify scroll container exists - const scrollContainer = document.getElementById('scroll-container'); - expect(scrollContainer).toBeTruthy(); - expect(scrollContainer?.style.height).toBe('800px'); - - // Verify initial page query was called - expect(getPageQuerySpy).toHaveBeenCalled(); - - // Test scrolling behavior - need to access the virtualizer instance - // We'll render a component that exposes it - let virtualizerInstance!: Virtualizer; - - function VirtualListWithRef() { - const result = useZeroVirtualizer( - createBaseHookOptions({ - getScrollElement: () => document.getElementById('scroll-container'), - getPageQuery: getPageQuerySpy, - overscan: 0, - }), - ); - - virtualizerInstance = result.virtualizer; - const virtualItems = result.virtualizer.getVirtualItems(); - - return ( - - ); - } - - // Re-render with the ref version - root.render( - - - , - ); - - await waitFor(() => { - expect(virtualizerInstance).toBeTruthy(); - }); - - // if (scrollContainer && virtualizerInstance) { - // Scroll down in increments to trigger paging - // Scroll all the way past the end to ensure we load everything - const scrollStep = 1000; - const maxScrollAttempts = 55; // Scroll 55,000px to go past the end (50,000px total height) - - // Formula for expected estimatedTotal based on paging behavior: - // Initial page loads MIN_PAGE_SIZE items (100 when MIN_PAGE_SIZE=100) - // The page size is calculated as: max(MIN_PAGE_SIZE, makeEven(ceil(scrollHeight / estimateSize) * 3)) - // With scrollHeight=800, estimateSize=50: max(100, makeEven(ceil(800/50) * 3)) = max(100, 48) = 100 - // - // However, the actual paging load behavior results in chunks of ~60 items after the initial load. - // This is because estimatedTotal is computed as firstRowIndex + rowsLength, where rowsLength - // is based on the actual loaded data range, which depends on the visible range + overscan. - // The virtualizer loads data in a pattern that results in ~60 item increments. - const scrollHeight = 800; // From initialRect - const itemsPerViewport = Math.ceil(scrollHeight / estimateSize); - const viewportMultiplier = 3; // From use-zero-virtualizer.ts page size calculation - const calculatedPageSize = Math.max( - MIN_PAGE_SIZE, - itemsPerViewport * viewportMultiplier, - ); - // Observed: after initial MIN_PAGE_SIZE, additional chunks are ~60% of calculated page size - const SUBSEQUENT_PAGE_SIZE = Math.ceil(calculatedPageSize * 0.6); - // First additional page has 1 extra item (observed behavior) - const FIRST_ADDITIONAL_PAGE_SIZE = SUBSEQUENT_PAGE_SIZE + 1; - - const computeExpectedEstimatedTotal = (index: number): number => { - if (index < MIN_PAGE_SIZE) { - return MIN_PAGE_SIZE; - } - const pageNumber = - Math.floor((index - MIN_PAGE_SIZE) / SUBSEQUENT_PAGE_SIZE) + 1; - return ( - MIN_PAGE_SIZE + - FIRST_ADDITIONAL_PAGE_SIZE + - (pageNumber - 1) * SUBSEQUENT_PAGE_SIZE - ); - }; - - for (let attempt = 0; attempt < maxScrollAttempts; attempt++) { - const scrollOffset = (attempt + 1) * scrollStep; - - act(() => { - virtualizerInstance.scrollToOffset(scrollOffset); - virtualizerInstance.measure(); - }); - - await z.markAllQueriesAsGot(); - - // Wait for React to update with new data - await waitFor(() => { - const visibleItems = container.querySelectorAll('[data-index]'); - expect(visibleItems.length).toBeGreaterThan(0); - }); - - const visibleItems = container.querySelectorAll('[data-index]'); - expect(visibleItems.length).toBeGreaterThan(0); - - // Verify exact items based on scroll position - // Expected first visible index = floor(scrollOffset / estimateSize) - const expectedFirstVisibleIndex = Math.floor( - scrollOffset / estimateSize, - ); - - // Only verify items if we're within the data range - if (expectedFirstVisibleIndex < 1000) { - await waitFor(() => { - const expectedItem = container.querySelector( - `[data-index="${expectedFirstVisibleIndex}"]`, - ); - - const expectedName = `Item ${String(expectedFirstVisibleIndex + 1).padStart(4, '0')}`; - expect(expectedItem?.textContent).toBe(expectedName); - }); - } - - // Check total and estimatedTotal - wait for them to update - await waitFor(() => { - const totalEl = document.getElementById('zero-virtualizer-total'); - const estimatedTotalEl = document.getElementById( - 'zero-virtualizer-estimated-total', - ); - - const estimatedTotal = Number(estimatedTotalEl?.textContent); - - // total should be undefined initially, then become exactly 1000 once we reach the end - const totalText = totalEl?.textContent; - if (totalText) { - const total = Number(totalText); - expect(total).toBe(1000); - // Once we know the total, estimatedTotal should exactly match it - expect(estimatedTotal).toBe(1000); - } else { - // Verify exact estimatedTotal using formula - const expectedEstimatedTotal = Math.min( - computeExpectedEstimatedTotal(expectedFirstVisibleIndex), - 1000, - ); - expect(estimatedTotal).toBe(expectedEstimatedTotal); - } - }); - } - - // After scrolling 40,000px (to item ~800), we should have reached the end - const finalTotalEl = document.getElementById('zero-virtualizer-total'); - const finalTotalText = finalTotalEl?.textContent; - const finalTotal = Number(finalTotalText); - expect(finalTotal).toBe(1000); - - const finalEstimatedTotalEl = document.getElementById( - 'zero-virtualizer-estimated-total', - ); - const finalEstimatedTotal = Number(finalEstimatedTotalEl?.textContent); - expect(finalEstimatedTotal).toBe(1000); - } finally { - cleanupTestContainer(root, container); - } - }); - - test('ReactDOM rendering with bidirectional scrolling', async () => { - const getPageQuerySpy = vi.fn(getPageQuery); - - // Create a real DOM container and render with ReactDOM directly - const container = createTestContainer(); - const root = createRoot(container); - - let virtualizerInstance!: Virtualizer; - - function VirtualListWithRef() { - const result = useZeroVirtualizer( - createBaseHookOptions({ - getScrollElement: () => document.getElementById('scroll-container'), - getPageQuery: getPageQuerySpy, - overscan: 0, - }), - ); - - virtualizerInstance = result.virtualizer; - const virtualItems = result.virtualizer.getVirtualItems(); - - return ( - - ); - } - - try { - root.render( - - - , - ); - - await waitFor(() => { - expect(virtualizerInstance).toBeTruthy(); - }); - - await z.markAllQueriesAsGot(); - - // Wait for initial items to render - await waitFor(() => { - const items = container.querySelectorAll('[data-index]'); - expect(items.length).toBeGreaterThan(0); - }); - - // Verify first item rendered correctly at the start - await waitFor(() => { - const firstItem = container.querySelector('[data-index="0"]'); - expect(firstItem?.textContent).toBe('Item 0001'); - }); - - // Scroll down to bottom - need to scroll all the way to load all data - const scrollStepDown = 1000; - const maxScrollDown = 55; // Scroll 55,000px to past the bottom (50,000px total height) - - for (let attempt = 0; attempt < maxScrollDown; attempt++) { - const scrollOffset = (attempt + 1) * scrollStepDown; - - act(() => { - virtualizerInstance.scrollToOffset(scrollOffset); - virtualizerInstance.measure(); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - const visibleItems = container.querySelectorAll('[data-index]'); - expect(visibleItems.length).toBeGreaterThan(0); - }); - } - - // Verify we reached the end - wait for total to be set - await waitFor(() => { - const totalElAfterDown = document.getElementById( - 'zero-virtualizer-total', - ); - expect(totalElAfterDown?.textContent).toBe('1000'); - }); - - const estimatedTotalElAfterDown = document.getElementById( - 'zero-virtualizer-estimated-total', - ); - expect(estimatedTotalElAfterDown?.textContent).toBe('1000'); - - // Now scroll back to the top gradually to exercise backward anchors - const scrollStepUp = 1000; - const startScrollOffset = 55000; - - for (let attempt = 0; attempt < 55; attempt++) { - const scrollOffset = Math.max( - 0, - startScrollOffset - (attempt + 1) * scrollStepUp, - ); - - act(() => { - virtualizerInstance.scrollToOffset(scrollOffset); - virtualizerInstance.measure(); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - const visibleItems = container.querySelectorAll('[data-index]'); - expect(visibleItems.length).toBeGreaterThan(0); - }); - - // If we've reached offset 0, verify the first item - if (scrollOffset === 0) { - await waitFor(() => { - const firstItem = container.querySelector('[data-index="0"]'); - expect(firstItem?.textContent).toBe('Item 0001'); - }); - break; - } - } - - // After scrolling back to top, total should still be 1000 - const totalElAfterUp = document.getElementById('zero-virtualizer-total'); - expect(totalElAfterUp?.textContent).toBe('1000'); - - const estimatedTotalElAfterUp = document.getElementById( - 'zero-virtualizer-estimated-total', - ); - expect(estimatedTotalElAfterUp?.textContent).toBe('1000'); - } finally { - cleanupTestContainer(root, container); - } - }); - - test('ReactDOM rendering with permalink in middle, scroll to bottom, then back to top', async () => { - const getPageQuerySpy = vi.fn(getPageQuery); - const getSingleQuerySpy = vi.fn(getSingleQuery); - - // Create a real DOM container and render with ReactDOM directly - const container = createTestContainer(); - const root = createRoot(container); - - let virtualizerInstance!: Virtualizer; - - // Start at item 500 (middle of 1000 items) - const permalinkID = '500'; - - function VirtualListWithRef() { - const result = useZeroVirtualizer( - createBaseHookOptions({ - permalinkID, - getScrollElement: () => document.getElementById('scroll-container'), - getPageQuery: getPageQuerySpy, - getSingleQuery: getSingleQuerySpy, - overscan: 0, - }), - ); - - virtualizerInstance = result.virtualizer; - const virtualItems = result.virtualizer.getVirtualItems(); - - return ( - - ); - } - - try { - root.render( - - - , - ); - - await waitFor(() => { - expect(virtualizerInstance).toBeTruthy(); - }); - - await z.markAllQueriesAsGot(); - - // Wait for permalink item to load - // The permalink is for item with ID '500', which corresponds to "Item 0500" (0-based index 499) - // But the virtualizer may render it at a different virtual index depending on the anchor - await waitFor(() => { - // Find the item by text content instead of index - const items = container.querySelectorAll('[data-index]'); - let found = false; - for (const item of items) { - if (item.textContent === 'Item 0500') { - found = true; - break; - } - } - expect(found).toBe(true); - }); - - // Verify getSingleQuery was called for the permalink - expect(getSingleQuerySpy).toHaveBeenCalledWith('500'); - - // Get the current scroll offset (should be positioned at the permalink) - const initialScrollOffset = virtualizerInstance.scrollOffset ?? 0; - expect(initialScrollOffset).toBeGreaterThan(0); - - // Scroll down to bottom incrementally from the permalink position - const scrollStepDown = 1000; - // Need to scroll to well past the end to ensure we load all data - // Total height will be ~50,000px for 1000 items - const maxScrollAttempts = 60; - - for (let attempt = 0; attempt < maxScrollAttempts; attempt++) { - const scrollOffset = - initialScrollOffset + (attempt + 1) * scrollStepDown; - - act(() => { - virtualizerInstance.scrollToOffset(scrollOffset); - virtualizerInstance.measure(); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - const visibleItems = container.querySelectorAll('[data-index]'); - expect(visibleItems.length).toBeGreaterThan(0); - }); - - // Check if we reached the bottom (both total and estimatedTotal = 1000) - const totalEl = document.getElementById('zero-virtualizer-total'); - const estimatedTotalEl = document.getElementById( - 'zero-virtualizer-estimated-total', - ); - if ( - totalEl?.textContent === '1000' && - estimatedTotalEl?.textContent === '1000' - ) { - break; - } - } - - // Verify we reached near the end (may not have total=1000 without atStart=true from permalink) - await waitFor(() => { - const estimatedTotalElAtBottom = document.getElementById( - 'zero-virtualizer-estimated-total', - ); - // Should be close to or at 1000 - const estimatedTotal = Number(estimatedTotalElAtBottom?.textContent); - expect(estimatedTotal).toBeGreaterThan(500); - }); - - // Check if we have items near the end visible (e.g., Item 0990+) - await waitFor(() => { - const items = container.querySelectorAll('[data-index]'); - let foundEndItem = false; - for (const item of items) { - // Check for items in the 990-1000 range - const match = item.textContent?.match(/Item (\d+)/); - if (match) { - const itemNum = Number(match[1]); - if (itemNum >= 990) { - foundEndItem = true; - break; - } - } - } - expect(foundEndItem).toBe(true); - }); - - // Now scroll back up gradually to test backward navigation - const currentScrollOffset = virtualizerInstance.scrollOffset ?? 0; - const scrollStepUp = 1000; - // Scroll back up partway (10 steps) to test backward paging - const stepsToScrollUp = 10; - - for (let attempt = 0; attempt < stepsToScrollUp; attempt++) { - const scrollOffset = Math.max( - 0, - currentScrollOffset - (attempt + 1) * scrollStepUp, - ); - - act(() => { - virtualizerInstance.scrollToOffset(scrollOffset); - virtualizerInstance.measure(); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - const visibleItems = container.querySelectorAll('[data-index]'); - expect(visibleItems.length).toBeGreaterThan(0); - }); - } - - // Verify we scrolled back and have data rendered (not just all "Loading...") - await waitFor(() => { - const items = container.querySelectorAll('[data-index]'); - expect(items.length).toBeGreaterThan(0); - // Just verify we have some content (not "Loading...") - let hasContent = false; - for (const item of items) { - if (item.textContent && item.textContent !== 'Loading...') { - hasContent = true; - break; - } - } - expect(hasContent).toBe(true); - }); - - // Estimated total should still be reasonable (close to or at the full count) - const estimatedTotalElAfterUp = document.getElementById( - 'zero-virtualizer-estimated-total', - ); - const estimatedTotal = Number(estimatedTotalElAfterUp?.textContent); - expect(estimatedTotal).toBeGreaterThan(500); - } finally { - cleanupTestContainer(root, container); - } - }); - - describe('getRowKey', () => { - test('uses getRowKey to generate stable keys for loaded rows', async () => { - const getRowKey = vi.fn((row: Item) => row.id); - - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions({getRowKey})), - {wrapper: createWrapper(z)}, - ); - - // Wait for initial data to load - await waitFor(() => { - expect(result.current.rowsEmpty).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - // Verify getRowKey was called for loaded rows - await waitFor(() => { - expect(getRowKey).toHaveBeenCalled(); - }); - - // Verify getRowKey receives the correct row data (first row) - expect(getRowKey.mock.calls[0][0]).toEqual({ - id: '1', - name: 'Item 0001', - }); - }); - - test('falls back to index for unloaded rows when using getRowKey', async () => { - const getRowKey = vi.fn((row: Item) => row.id); - - const {result} = renderHook( - () => - useZeroVirtualizer( - createBaseHookOptions({ - getRowKey, - }), - ), - {wrapper: createWrapper(z)}, - ); - - // Wait for data to load - await waitFor(() => { - expect(result.current.rowsEmpty).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - // Verify getRowKey was called (meaning it's working) - await waitFor(() => { - expect(getRowKey).toHaveBeenCalled(); - }); - - const container = createTestContainer(); - const root = createRoot(container); - - try { - let hookResult!: ReturnType< - typeof useZeroVirtualizer< - HTMLElement, - Element, - string, - Item, - ReturnType - > - >; - - function TestComponent() { - hookResult = useZeroVirtualizer( - createBaseHookOptions({ - getRowKey, - getScrollElement: () => - container.querySelector('#scroll-container'), - }), - ); - - const virtualItems = hookResult.virtualizer.getVirtualItems(); - - return ( - - ); - } - - act(() => { - root.render( - - - , - ); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(hookResult.rowsEmpty).toBe(false); - }); - - // Record initial keys for rows 0-10 - const initialKeys = new Map(); - const virtualItems = hookResult.virtualizer.getVirtualItems(); - for (const item of virtualItems.slice( - 0, - Math.min(10, virtualItems.length), - )) { - initialKeys.set(item.index, item.key); - } - - // Scroll down significantly - const scrollContainer = container.querySelector( - '#scroll-container', - ) as HTMLElement; - act(() => { - scrollContainer.scrollTop = 5000; - hookResult.virtualizer.measure(); - }); - - await z.markAllQueriesAsGot(); - - // Wait for new items to render (scroll to at least index 100) - await waitFor(() => { - const items = container.querySelectorAll('[data-index]'); - const maxIndex = Math.max( - ...Array.from(items).map( - el => Number(el.getAttribute('data-index')) || 0, - ), - ); - expect(maxIndex).toBeGreaterThan(100); - }); - - // Scroll back up to the beginning - act(() => { - scrollContainer.scrollTop = 0; - hookResult.virtualizer.measure(); - }); - - await z.markAllQueriesAsGot(); - - // Wait for original items to be visible again - await waitFor(() => { - const items = container.querySelectorAll('[data-index]'); - const minIndex = Math.min( - ...Array.from(items).map( - el => Number(el.getAttribute('data-index')) || 0, - ), - ); - expect(minIndex).toBeLessThanOrEqual(10); - }); - - // Wait for data to reload and keys to stabilize - await waitFor(() => { - const finalVirtualItems = hookResult.virtualizer.getVirtualItems(); - const firstTenItems = finalVirtualItems.slice(0, 10); - - // Ensure we have items to check - expect(firstTenItems.length).toBeGreaterThan(0); - - // Verify keys remained stable for the same rows - for (const item of firstTenItems) { - const expectedKey = initialKeys.get(item.index); - if (expectedKey !== undefined) { - expect(item.key).toBe(expectedKey); - } - } - }); - - // Verify getRowKey was called consistently - expect(getRowKey).toHaveBeenCalled(); - } finally { - cleanupTestContainer(root, container); - } - }); - - test('works without getRowKey (uses default index-based keys)', async () => { - const {result} = renderHook( - () => - useZeroVirtualizer( - createBaseHookOptions({ - // No getRowKey provided - }), - ), - {wrapper: createWrapper(z)}, - ); - - await waitFor(() => { - expect(result.current.rowsEmpty).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - // Without getRowKey, the implementation uses the default getItemKey - // which is passed through from TanStack Virtual's default behavior - // This test verifies the hook can work without getRowKey - expect(result.current.virtualizer).toBeDefined(); - expect(result.current.rowAt(0)).toBeDefined(); - }); - - test('getRowKey receives correct row data', async () => { - const getRowKey = vi.fn((row: Item) => { - // Verify row structure - expect(row).toHaveProperty('id'); - expect(row).toHaveProperty('name'); - expect(typeof row.id).toBe('string'); - expect(typeof row.name).toBe('string'); - return row.id; - }); - - const {result} = renderHook( - () => useZeroVirtualizer(createBaseHookOptions({getRowKey})), - {wrapper: createWrapper(z)}, - ); - - await waitFor(() => { - expect(result.current.rowsEmpty).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - // Verify getRowKey was called with valid Item objects - await waitFor(() => { - expect(getRowKey).toHaveBeenCalled(); - }); - - // Get the first call and verify it received a proper Item - const firstCall = getRowKey.mock.calls[0]; - expect(firstCall).toBeDefined(); - expect(firstCall[0]).toEqual({ - id: '1', - name: 'Item 0001', - }); - }); - - test('getRowKey can return different key types (string, number)', async () => { - // Test with string keys - const stringKeyFn = vi.fn((row: Item) => row.id); // Returns string - - const {result: stringResult} = renderHook( - () => - useZeroVirtualizer(createBaseHookOptions({getRowKey: stringKeyFn})), - {wrapper: createWrapper(z)}, - ); - - await waitFor(() => { - expect(stringResult.current.rowsEmpty).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(stringKeyFn).toHaveBeenCalled(); - }); - - // Verify string keys are returned - expect(typeof stringKeyFn.mock.results[0].value).toBe('string'); - - // Test with numeric keys - const numericKeyFn = vi.fn((row: Item) => parseInt(row.id, 10)); - - const {result: numericResult} = renderHook( - () => - useZeroVirtualizer(createBaseHookOptions({getRowKey: numericKeyFn})), - {wrapper: createWrapper(z)}, - ); - - await waitFor(() => { - expect(numericResult.current.rowsEmpty).toBe(false); - }); - - await z.markAllQueriesAsGot(); - - await waitFor(() => { - expect(numericKeyFn).toHaveBeenCalled(); - }); - - // Verify numeric keys are returned - expect(typeof numericKeyFn.mock.results[0].value).toBe('number'); - }); - }); -}); diff --git a/packages/zero-react/src/use-zero-virtualizer.ts b/packages/zero-react/src/use-zero-virtualizer.ts deleted file mode 100644 index a688f5b2f1..0000000000 --- a/packages/zero-react/src/use-zero-virtualizer.ts +++ /dev/null @@ -1,597 +0,0 @@ -import { - defaultKeyExtractor, - useVirtualizer, - type Virtualizer, -} from '@tanstack/react-virtual'; -import { - useEffect, - useLayoutEffect, - useMemo, - useReducer, - useState, - type Key, -} from 'react'; -import {assert} from '../../shared/src/asserts.ts'; -import {pagingReducer, type PagingState} from './paging-reducer.ts'; -import type {UseQueryOptions} from './use-query.tsx'; -import { - useRows, - type Anchor, - type GetPageQuery, - type GetSingleQuery, -} from './use-rows.ts'; - -// Make sure this is even since we half it for permalink loading -const MIN_PAGE_SIZE = 100; - -const NUM_ROWS_FOR_LOADING_SKELETON = 1; - -/** - * State object that captures the virtualizer's scroll position and pagination state. - * Used for persisting and restoring the virtualizer state across navigation or page reloads. - * - * @typeParam TStartRow - The type of the start row data used for pagination anchoring - */ -export type PermalinkHistoryState = Readonly<{ - /** The anchor point for pagination (includes position, direction, and start row data) */ - anchor: Anchor; - /** The scroll position in pixels from the top of the scrollable container */ - scrollTop: number; - /** The estimated total number of rows in the list */ - estimatedTotal: number; - /** Whether the virtualizer has reached the start of the list */ - hasReachedStart: boolean; - /** Whether the virtualizer has reached the end of the list */ - hasReachedEnd: boolean; -}>; - -const TOP_ANCHOR = Object.freeze({ - index: 0, - kind: 'forward', - startRow: undefined, -}) satisfies Anchor; - -type TanstackUseVirtualizerOptions< - TScrollElement extends Element, - TItemElement extends Element, -> = Parameters>[0]; - -/** - * Options for configuring the Zero virtualizer. - * Extends Tanstack Virtual's options with Zero-specific pagination and state management. - * - * @typeParam TScrollElement - The type of the scrollable container element - * @typeParam TItemElement - The type of the individual item elements - * @typeParam TListContextParams - The type of parameters that define the list's query context - * @typeParam TRow - The type of row data returned from queries - * @typeParam TStartRow - The type of data needed to anchor pagination (typically a subset of TRow) - */ -export type UseZeroVirtualizerOptions< - TScrollElement extends Element, - TItemElement extends Element, - TListContextParams, - TRow, - TStartRow, -> = Omit< - TanstackUseVirtualizerOptions, - // count is managed by useZeroVirtualizer - | 'count' - // initialOffset is managed by useZeroVirtualizer - | 'initialOffset' - // Only support vertical lists for now - | 'horizontal' -> & { - /** Parameters that define the list's query context (filters, sort order, etc.) */ - listContextParams: TListContextParams; - - /** Optional ID to highlight/scroll to a specific row (permalink functionality) */ - permalinkID?: string | null | undefined; - - /** Function that returns a query for fetching a page of rows */ - getPageQuery: GetPageQuery; - /** Function that returns a query for fetching a single row by ID */ - getSingleQuery: GetSingleQuery; - /** Optional query options */ - options?: UseQueryOptions | undefined; - /** Function to extract the start row data from a full row (for pagination anchoring) */ - toStartRow: (row: TRow) => TStartRow; - - /** - * Function to extract a unique key from a row, used for stable item identification. - * If provided, this will override {@linkcode TanstackUseVirtualizerOptions.getItemKey} - */ - getRowKey?: ((row: TRow) => Key) | undefined; - - /** - * Optional current permalink state for restoring virtualizer position. - * If provided along with `onPermalinkStateChange`, enables state persistence. - * If not provided, virtualizer operates in uncontrolled mode. - */ - permalinkState?: PermalinkHistoryState | null | undefined; - /** - * Optional callback invoked when the virtualizer state changes. - * Use this to persist state (e.g., to browser history, local storage, etc.). - * Called with the new state approximately 100ms after scroll/pagination changes. - */ - onPermalinkStateChange?: (state: PermalinkHistoryState) => void; -}; - -const createPermalinkAnchor = (id: string) => - ({ - id, - index: NUM_ROWS_FOR_LOADING_SKELETON, - kind: 'permalink', - }) as const; - -/** - * Result object returned by the useZeroVirtualizer hook. - * - * @typeParam TScrollElement - The type of the scrollable container element - * @typeParam TItemElement - The type of the individual item elements - * @typeParam TRow - The type of row data returned from queries - */ -export type ZeroVirtualizerResult< - TScrollElement extends Element, - TItemElement extends Element, - TRow, -> = { - /** The Tanstack Virtual virtualizer instance for rendering virtual items */ - virtualizer: Virtualizer; - /** Function to get the row data at a specific index, or undefined if not loaded */ - rowAt: (index: number) => TRow | undefined; - /** Whether all initially requested data has finished loading */ - complete: boolean; - /** Whether the list is empty (no rows exist matching the query) */ - rowsEmpty: boolean; - /** Whether the specified permalinkID was not found in the query results */ - permalinkNotFound: boolean; - /** Estimated total number of rows (may be inexact until both ends are reached) */ - estimatedTotal: number; - /** Exact total number of rows, or undefined if not yet known (requires reaching both ends) */ - total: number | undefined; -}; - -/** - * Hook that creates a virtualized list with bidirectional pagination and state persistence. - * - * This hook combines Tanstack Virtual's efficient virtualization with Zero's reactive queries - * to create infinitely scrolling lists that load data on demand. It supports: - * - Bidirectional scrolling (load more items at top or bottom) - * - Permalink functionality (jump to and highlight specific items) - * - State persistence (restore scroll position across navigation) - * - Dynamic page sizing based on viewport - * - * @typeParam TScrollElement - The type of the scrollable container element - * @typeParam TItemElement - The type of the individual item elements - * @typeParam TListContextParams - The type of parameters that define the list's query context - * @typeParam TRow - The type of row data returned from queries - * @typeParam TStartRow - The type of data needed to anchor pagination - * - * @param options - Configuration options including query functions, sizing, and state management - * @returns An object containing the virtualizer instance, row accessor, and state flags - * - * @example - * ```tsx - * const {virtualizer, rowAt, complete} = useZeroVirtualizer({ - * estimateSize: () => 50, - * getScrollElement: () => scrollRef.current, - * listContextParams: {projectId: 'abc'}, - * getPageQuery: (limit, start, dir) => z.query.issues.where(...).limit(limit), - * getSingleQuery: (id) => z.query.issues.where('id', id), - * toStartRow: (row) => ({id: row.id, created: row.created}), - * }); - * ``` - */ -export function useZeroVirtualizer< - TScrollElement extends Element, - TItemElement extends Element, - TListContextParams, - TRow, - TStartRow, ->({ - // Tanstack Virtual params - estimateSize, - overscan = 5, // Virtualizer defaults to 1. - getScrollElement, - getItemKey = defaultKeyExtractor, - - // Zero specific params - listContextParams, - permalinkID, - getPageQuery, - getSingleQuery, - options, - toStartRow, - getRowKey, - - // Permalink state persistence - permalinkState, - onPermalinkStateChange, - - ...restVirtualizerOptions -}: UseZeroVirtualizerOptions< - TScrollElement, - TItemElement, - TListContextParams, - TRow, - TStartRow ->): ZeroVirtualizerResult { - // Initialize paging state from permalinkState directly to avoid Strict Mode double-mount rows - const [ - { - estimatedTotal, - hasReachedStart, - hasReachedEnd, - queryAnchor, - pagingPhase, - pendingScrollAdjustment, - }, - dispatch, - ] = useReducer( - pagingReducer, - undefined, - (): PagingState => { - const anchor = permalinkState - ? permalinkState.anchor - : permalinkID - ? createPermalinkAnchor(permalinkID) - : TOP_ANCHOR; - return { - estimatedTotal: - permalinkState?.estimatedTotal ?? NUM_ROWS_FOR_LOADING_SKELETON, - hasReachedStart: permalinkState?.hasReachedStart ?? false, - hasReachedEnd: permalinkState?.hasReachedEnd ?? false, - queryAnchor: { - anchor, - listContextParams, - }, - pagingPhase: 'idle', - pendingScrollAdjustment: 0, - }; - }, - ); - - const isListContextCurrent = - queryAnchor.listContextParams === listContextParams; - - const anchor = useMemo(() => { - if (isListContextCurrent) { - return queryAnchor.anchor; - } - return permalinkID ? createPermalinkAnchor(permalinkID) : TOP_ANCHOR; - }, [isListContextCurrent, queryAnchor.anchor, permalinkID]); - - const [pageSize, setPageSize] = useState(MIN_PAGE_SIZE); - - const { - rowAt, - rowsLength, - complete, - rowsEmpty, - atStart, - atEnd, - firstRowIndex, - permalinkNotFound, - } = useRows({ - pageSize, - anchor, - options, - getPageQuery, - getSingleQuery, - toStartRow, - }); - - const newEstimatedTotal = firstRowIndex + rowsLength; - - const virtualizer: Virtualizer = useVirtualizer( - { - ...restVirtualizerOptions, - count: - Math.max(estimatedTotal, newEstimatedTotal) + - (!atEnd ? NUM_ROWS_FOR_LOADING_SKELETON : 0), - estimateSize, - overscan, - getScrollElement, - getItemKey: getRowKey - ? (index: number) => { - const row = rowAt(index); - return row ? getRowKey(row) : getItemKey(index); - } - : getItemKey, - initialOffset: () => { - if (permalinkState?.scrollTop !== undefined) { - return permalinkState.scrollTop; - } - if (anchor.kind === 'permalink') { - // TODO: Support dynamic item sizes - return anchor.index * estimateSize(0); - } - return 0; - }, - horizontal: false, - }, - ); - - useEffect(() => { - // Make sure page size is enough to fill the scroll element at least - // 3 times. Don't shrink page size. - const newPageSize = virtualizer.scrollRect - ? Math.max( - MIN_PAGE_SIZE, - makeEven( - Math.ceil( - virtualizer.scrollRect?.height / - // TODO: Support dynamic item sizes - estimateSize(0), - ) * 3, - ), - ) - : MIN_PAGE_SIZE; - if (newPageSize > pageSize) { - setPageSize(newPageSize); - } - }, [pageSize, virtualizer.scrollRect]); - - useEffect(() => { - if (!isListContextCurrent || !onPermalinkStateChange) { - return; - } - const timeoutId = setTimeout(() => { - onPermalinkStateChange({ - anchor, - scrollTop: virtualizer.scrollOffset ?? 0, - estimatedTotal, - hasReachedStart, - hasReachedEnd, - }); - }, 100); - - return () => clearTimeout(timeoutId); - }, [ - anchor, - virtualizer.scrollOffset, - estimatedTotal, - hasReachedStart, - hasReachedEnd, - isListContextCurrent, - onPermalinkStateChange, - ]); - - useEffect(() => { - if (atStart) { - dispatch({type: 'REACHED_START'}); - } - }, [atStart]); - - useEffect(() => { - if (atEnd) { - dispatch({type: 'REACHED_END'}); - } - }, [atEnd]); - - useEffect(() => { - if (complete && newEstimatedTotal > estimatedTotal) { - dispatch({type: 'UPDATE_ESTIMATED_TOTAL', newTotal: newEstimatedTotal}); - } - }, [estimatedTotal, complete, newEstimatedTotal]); - - // Apply scroll adjustments synchronously with layout to prevent visual jumps - useLayoutEffect(() => { - if (pendingScrollAdjustment !== 0) { - virtualizer.scrollToOffset( - (virtualizer.scrollOffset ?? 0) + - pendingScrollAdjustment * - // TODO: Support dynamic item sizes - estimateSize(0), - ); - - dispatch({type: 'SCROLL_ADJUSTED'}); - } - }, [pendingScrollAdjustment, virtualizer]); - - useEffect(() => { - if (rowsEmpty || !isListContextCurrent) { - return; - } - - if (pagingPhase === 'skipping' && pendingScrollAdjustment === 0) { - dispatch({type: 'PAGING_COMPLETE'}); - return; - } - - // Skip if there's a pending scroll adjustment - let useLayoutEffect handle it - if (pendingScrollAdjustment !== 0) { - return; - } - - // First row is before start of list - need to shift down - if (firstRowIndex < 0) { - const placeholderRows = !atStart ? NUM_ROWS_FOR_LOADING_SKELETON : 0; - const offset = -firstRowIndex + placeholderRows; - const newAnchor = { - ...anchor, - index: anchor.index + offset, - }; - dispatch({type: 'SHIFT_ANCHOR_DOWN', offset, newAnchor}); - return; - } - - if (atStart && firstRowIndex > 0) { - dispatch({type: 'RESET_TO_TOP', offset: -firstRowIndex}); - return; - } - }, [ - firstRowIndex, - anchor, - atStart, - pendingScrollAdjustment, - pagingPhase, - rowsEmpty, - isListContextCurrent, - // virtualizer - omitted to avoid infinite render loops from scroll events - ]); - - // Use layoutEffect to restore scroll position synchronously to avoid visual jumps - useLayoutEffect(() => { - if (!isListContextCurrent) { - if (permalinkState) { - virtualizer.scrollToOffset(permalinkState.scrollTop); - dispatch({ - type: 'RESET_STATE', - estimatedTotal: permalinkState.estimatedTotal, - hasReachedStart: permalinkState.hasReachedStart, - hasReachedEnd: permalinkState.hasReachedEnd, - anchor: permalinkState.anchor, - listContextParams, - }); - } else if (permalinkID) { - virtualizer.scrollToOffset( - NUM_ROWS_FOR_LOADING_SKELETON * - // TODO: Support dynamic item sizes - estimateSize(0), - ); - dispatch({ - type: 'RESET_STATE', - estimatedTotal: NUM_ROWS_FOR_LOADING_SKELETON, - hasReachedStart: false, - hasReachedEnd: false, - anchor: createPermalinkAnchor(permalinkID), - listContextParams, - }); - } else { - virtualizer.scrollToOffset(0); - dispatch({ - type: 'RESET_STATE', - estimatedTotal: 0, - hasReachedStart: true, - hasReachedEnd: false, - anchor: TOP_ANCHOR, - listContextParams, - }); - } - } - }, [ - isListContextCurrent, - permalinkState, - permalinkID, - virtualizer, - listContextParams, - ]); - - const total = hasReachedStart && hasReachedEnd ? estimatedTotal : undefined; - - const virtualItems = virtualizer.getVirtualItems(); - - useEffect(() => { - if ( - !isListContextCurrent || - virtualItems.length === 0 || - !complete || - pagingPhase !== 'idle' || - pendingScrollAdjustment !== 0 - ) { - return; - } - - if (atStart) { - if (firstRowIndex !== 0) { - dispatch({type: 'UPDATE_ANCHOR', anchor: TOP_ANCHOR}); - return; - } - } - - const updateAnchorForEdge = ( - targetIndex: number, - type: 'forward' | 'backward', - indexOffset: number, - ) => { - const index = toBoundIndex(targetIndex, firstRowIndex, rowsLength); - const startRow = rowAt(index); - assert(startRow !== undefined || type === 'forward'); - dispatch({ - type: 'UPDATE_ANCHOR', - anchor: { - index: index + indexOffset, - kind: type, - startRow, - } as Anchor, - }); - }; - - const firstItem = virtualItems[0]; - const lastItem = virtualItems[virtualItems.length - 1]; - const nearPageEdgeThreshold = getNearPageEdgeThreshold(pageSize); - - const distanceFromStart = firstItem.index - firstRowIndex; - const distanceFromEnd = firstRowIndex + rowsLength - lastItem.index; - - if (!atStart && distanceFromStart <= nearPageEdgeThreshold) { - updateAnchorForEdge( - lastItem.index + 2 * nearPageEdgeThreshold, - 'backward', - 0, - ); - return; - } - - if (!atEnd && distanceFromEnd <= nearPageEdgeThreshold) { - updateAnchorForEdge( - firstItem.index - 2 * nearPageEdgeThreshold, - 'forward', - 1, - ); - return; - } - }, [ - isListContextCurrent, - virtualItems, - pagingPhase, - pendingScrollAdjustment, - complete, - pageSize, - firstRowIndex, - rowsLength, - atStart, - atEnd, - rowAt, - ]); - - return { - virtualizer, - rowAt, - complete, - rowsEmpty, - permalinkNotFound, - estimatedTotal, - total, - }; -} - -/** - * Clamps an index to be within the valid range of rows. - * @param targetIndex - The desired index to clamp - * @param firstRowIndex - The first valid row index - * @param rowsLength - The number of rows available - * @returns The clamped index within [firstRowIndex, firstRowIndex + rowsLength - 1] - */ -function toBoundIndex( - targetIndex: number, - firstRowIndex: number, - rowsLength: number, -): number { - if (rowsLength === 0) { - return firstRowIndex; - } - return Math.max( - firstRowIndex, - Math.min(firstRowIndex + rowsLength - 1, targetIndex), - ); -} - -function getNearPageEdgeThreshold(pageSize: number) { - return Math.ceil(pageSize / 10); -} - -function makeEven(n: number) { - return n % 2 === 0 ? n : n + 1; -} From 916f08e0eb91767ded73c20c67582ed862628ef8 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 28 Feb 2026 22:26:40 -0800 Subject: [PATCH 117/495] chore: fix flaky test (#5631) --- .../services/change-streamer/change-streamer-service.pg.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index 7e9ab2cee6..431e046aa9 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -965,6 +965,7 @@ describe('change-streamer/service', () => { test('retry on change stream error', async () => { const {promise: hasRetried, resolve: retried} = resolver(); + const changes = Subscription.create(); const source = { startStream: vi .fn() @@ -1001,6 +1002,7 @@ describe('change-streamer/service', () => { test('retry on unexpected storage error', async () => { const {promise: hasRetried, resolve: retried} = resolver(); + const changes = Subscription.create(); const source = { startStream: vi .fn() From 8ec378599ae1789ab97f5ed512a49072a195c36a Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 28 Feb 2026 22:55:02 -0800 Subject: [PATCH 118/495] chore(zero-cache): encode zero events with gzip+base64 (#5630) Change the transfer encoding of zero events to be a gzipped, base64 encoded plaintext payload. It is the responsibility of the consumer to recognize the "gzip" datacontentencoding and unpack the data accordingly. This is to address the current inability to send replication events with very large schemas: * https://discord.com/channels/830183651022471199/1476737608557264909/1477120857577885696 --- .../src/observability/events.test.ts | 30 ++++++++++------ .../zero-cache/src/observability/events.ts | 34 ++++++++++++++++--- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/packages/zero-cache/src/observability/events.test.ts b/packages/zero-cache/src/observability/events.test.ts index b3ad618dcb..59021f4373 100644 --- a/packages/zero-cache/src/observability/events.test.ts +++ b/packages/zero-cache/src/observability/events.test.ts @@ -1,10 +1,12 @@ import {LogContext} from '@rocicorp/logger'; import {getLocal, type Mockttp} from 'mockttp'; import {beforeEach, expect, test} from 'vitest'; +import {gunzipSync} from 'zlib'; import { createSilentLogContext, TestLogSink, } from '../../../shared/src/logging-test-utils.ts'; +import {must} from '../../../shared/src/must.ts'; import {initEventSink, publishCriticalEvent} from './events.ts'; let sink: Mockttp; @@ -50,13 +52,14 @@ test('publish with backoff', async () => { expect(r.headers).toMatchObject({ 'ce-baz': '123', 'ce-foo': 'bar', + 'ce-datacontentencoding': 'gzip', 'ce-id': expect.any(String), 'ce-source': 'my-task-id', 'ce-specversion': '1.0', 'ce-time': '2024-08-14T03:02:01.000Z', 'ce-type': 'my-type', 'connection': 'keep-alive', - 'content-type': 'application/json; charset=utf-8', + 'content-type': 'text/plain', 'host': 'localhost:8000', 'transfer-encoding': 'chunked', }); @@ -66,17 +69,25 @@ test('publish with backoff', async () => { expect(r.headers).toMatchObject({ 'ce-baz': '123', 'ce-foo': 'bar', + 'ce-datacontentencoding': 'gzip', 'ce-id': expect.any(String), 'ce-source': 'my-task-id', 'ce-specversion': '1.0', 'ce-time': '2024-08-14T03:02:01.000Z', 'ce-type': 'my-type', 'connection': 'keep-alive', - 'content-type': 'application/json; charset=utf-8', + 'content-type': 'text/plain', 'host': 'localhost:8000', 'transfer-encoding': 'chunked', }); + const body = must(await r.body.getText()); + expect( + gunzipSync(Buffer.from(body, 'base64')).toString(), + ).toMatchInlineSnapshot( + `"{"type":"my-type","time":"2024-08-14T03:02:01.000Z"}"`, + ); + expect(logSink.messages[0][2]).toMatchObject([ 'Publishing CloudEvent: my-type', ]); @@ -94,16 +105,15 @@ test('publish with backoff', async () => { expect(logSink.messages[3][2]).toMatchObject([ 'Published CloudEvent: my-type', { - type: 'my-type', - time: '2024-08-14T03:02:01.000Z', - source: 'my-task-id', - specversion: '1.0', - data: { - time: '2024-08-14T03:02:01.000Z', + event: { + datacontentencoding: 'gzip', type: 'my-type', + time: '2024-08-14T03:02:01.000Z', + source: 'my-task-id', + specversion: '1.0', + foo: 'bar', + baz: 123, }, - foo: 'bar', - baz: 123, }, ]); }); diff --git a/packages/zero-cache/src/observability/events.ts b/packages/zero-cache/src/observability/events.ts index 1ff8f4db2c..50aff932c6 100644 --- a/packages/zero-cache/src/observability/events.ts +++ b/packages/zero-cache/src/observability/events.ts @@ -1,6 +1,9 @@ import type {LogContext} from '@rocicorp/logger'; +import {resolver} from '@rocicorp/resolver'; import {CloudEvent, emitterFor, httpTransport} from 'cloudevents'; import {nanoid} from 'nanoid'; +import {gzip} from 'node:zlib'; +import {stringify} from '../../../shared/src/bigint-json.ts'; import {isJSONValue, type JSONObject} from '../../../shared/src/json.ts'; import {must} from '../../../shared/src/must.ts'; import {promiseVoid} from '../../../shared/src/resolved-promises.ts'; @@ -32,6 +35,12 @@ type PartialEvent = v.Infer; // https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding const extensionsObjectSchema = v.object({extensions: eventSchema}); +async function base64gzip(str: string): Promise { + const {promise: gzipped, resolve, reject} = resolver(); + gzip(Buffer.from(str), (err, buf) => (err ? reject(err) : resolve(buf))); + return (await gzipped).toString('base64'); +} + /** * Initializes a per-process event sink according to the cloud event * parameters in the ZeroConfig. This must be called at the beginning @@ -58,13 +67,22 @@ export function initEventSink( overrides = extensions; } - function createCloudEvent(data: ZeroEvent) { - const {type, time} = data; + async function createCloudEvent(event: ZeroEvent) { + const {type, time} = event; + const json = stringify(event); + const data = await base64gzip(json); + return new CloudEvent({ id: nanoid(), source: taskID, type, time, + // Pass `data` as text/plain to prevent intermediaries from + // base64-decoding it. It is the responsibility of the final processor + // to recognize that datacontentencoding === "gzip" and unpack the + // `data` accordingly before parsing it. + datacontenttype: 'text/plain', + datacontentencoding: 'gzip', data, ...overrides, }); @@ -75,7 +93,13 @@ export function initEventSink( lc.debug?.(`Publishing ZeroEvents to ${sinkURI}`); publishFn = async (lc, event) => { - const cloudEvent = createCloudEvent(event); + let cloudEvent: CloudEvent; + try { + cloudEvent = await createCloudEvent(event); + } catch (e) { + lc.error?.(`Error creating CloudEvent ${event.type}`, e); + return; + } lc.debug?.(`Publishing CloudEvent: ${cloudEvent.type}`); for (let i = 0; i < MAX_PUBLISH_ATTEMPTS; i++) { @@ -85,7 +109,9 @@ export function initEventSink( } try { await emit(cloudEvent); - lc.info?.(`Published CloudEvent: ${cloudEvent.type}`, cloudEvent); + // Avoid logging the (possibly large and) unreadable data field. + const {data: _, ...event} = cloudEvent; + lc.info?.(`Published CloudEvent: ${cloudEvent.type}`, {event}); return; } catch (e) { lc.warn?.(`Error publishing ${cloudEvent.type} (attempt ${i + 1})`, e); From 74c354ca954a452c9038321020794f07ea6a8979 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 2 Mar 2026 21:55:36 -0800 Subject: [PATCH 119/495] chore: publish download status for backfill and initial sync (#5632) Adds `DownloadStatus` information to ReplicationEvents during initial sync and backfill, including the table, columns, total rows, total bytes, and rows synced so far. This information can be surfaced by event consumers (such as Cloud Zero) to show the progress of initial sync and backfills. --- .../pg/backfill-stream.pg.test.ts | 4 + .../change-source/pg/backfill-stream.ts | 44 ++++++--- .../services/change-source/pg/initial-sync.ts | 93 +++++++++++++++---- .../change-source/protocol/current/data.ts | 16 ++++ .../change-source/protocol/version.test.ts | 4 +- .../services/replicator/change-processor.ts | 22 +++-- .../services/replicator/incremental-sync.ts | 48 +++++++++- .../replicator/replication-status.test.ts | 57 +++++++++++- .../services/replicator/replication-status.ts | 33 +++++-- packages/zero-events/src/status.ts | 10 ++ 10 files changed, 277 insertions(+), 54 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts index 83265afc38..8171305aa9 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.pg.test.ts @@ -134,6 +134,7 @@ describe('backfill-stream', () => { [9n, 10, [9, 10, '11', {e: 12}], '{"d" : 9}'], [10n, 11, [10, 11, '12', {e: 13}], '{"d" : 10}'], ], + status: {rows: 10, totalRows: 10, totalBytes: expect.any(Number)}, }, { tag: 'backfill-completed', @@ -143,6 +144,7 @@ describe('backfill-stream', () => { rowKey: {columns: ['id1', 'id2']}, }, columns: ['c', 'b'], + status: {rows: 10, totalRows: 10, totalBytes: expect.any(Number)}, }, ]); }); @@ -187,6 +189,7 @@ describe('backfill-stream', () => { '{"d" : 10}', ], ], + status: {rows: 10, totalRows: 10, totalBytes: expect.any(Number)}, }, { tag: 'backfill-completed', @@ -196,6 +199,7 @@ describe('backfill-stream', () => { rowKey: {columns: ['id2', 'id1']}, }, columns: ['a', 'c', 'b'], + status: {rows: 10, totalRows: 10, totalBytes: expect.any(Number)}, }, ]); }); diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts index 590d91ff65..0318b61d69 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts @@ -16,6 +16,7 @@ import {SchemaIncompatibilityError} from '../common/backfill-manager.ts'; import type { BackfillCompleted, BackfillRequest, + DownloadStatus, JSONValue, MessageBackfill, } from '../protocol/current.ts'; @@ -25,7 +26,8 @@ import { } from './backfill-metadata.ts'; import { createReplicationSlot, - makeSelectPublishedStmt, + makeDownloadStatements, + type DownloadStatements, } from './initial-sync.ts'; import {toStateVersionString} from './lsn.ts'; import {getPublicationInfo} from './schema/published.ts'; @@ -86,7 +88,7 @@ export async function* streamBackfill( lc, tx, backfill, - makeSelectPublishedStmt(tableSpec, cols), + makeDownloadStatements(tableSpec, cols), cols.map(col => types.getTypeParser(tableSpec.columns[col].typeOID)), flushThresholdBytes, ); @@ -120,18 +122,32 @@ async function* stream( lc: LogContext, tx: TransactionPool, backfill: BackfillParams, - selectStmt: string, + {select, getTotalRows, getTotalBytes}: DownloadStatements, colParsers: TypeParser[], flushThresholdBytes: number, ): AsyncGenerator { const start = performance.now(); - lc.info?.(`Starting backfill copy stream:`, selectStmt); + const [rows, bytes] = await tx.processReadTask(sql => + Promise.all([ + sql.unsafe<{totalRows: bigint}[]>(getTotalRows), + sql.unsafe<{totalBytes: bigint}[]>(getTotalBytes), + ]), + ); + const status: DownloadStatus = { + rows: 0, + totalRows: Number(rows[0].totalRows), + totalBytes: Number(bytes[0].totalBytes), + }; + + let elapsed = (performance.now() - start).toFixed(3); + lc.info?.(`Computed total rows and bytes for: ${select} (${elapsed} ms)`, { + status, + }); const copyStream = await tx.processReadTask(sql => - sql.unsafe(`COPY (${selectStmt}) TO STDOUT`).readable(), + sql.unsafe(`COPY (${select}) TO STDOUT`).readable(), ); const tsvParser = new TsvParser(); - let totalRows = 0; let totalBytes = 0; let totalMsgs = 0; let rowValues: JSONValue[][] = []; @@ -140,7 +156,7 @@ async function* stream( const logFlushed = () => { lc.debug?.( `Flushed ${rowValues.length} rows, ${bufferedBytes} bytes ` + - `(total: rows=${totalRows}, msgs=${totalMsgs}, bytes=${totalBytes})`, + `(total: rows=${status.rows}, msgs=${totalMsgs}, bytes=${totalBytes})`, ); }; @@ -155,7 +171,7 @@ async function* stream( if (++col === colParsers.length) { rowValues.push(row); - totalRows++; + status.rows++; row = Array.from({length: colParsers.length}); col = 0; } @@ -164,7 +180,7 @@ async function* stream( totalBytes += chunk.byteLength; if (bufferedBytes >= flushThresholdBytes) { - yield {tag: 'backfill', ...backfill, rowValues}; + yield {tag: 'backfill', ...backfill, rowValues, status}; totalMsgs++; logFlushed(); rowValues = []; @@ -174,16 +190,16 @@ async function* stream( // Flush the last batch of rows. if (rowValues.length > 0) { - yield {tag: 'backfill', ...backfill, rowValues}; + yield {tag: 'backfill', ...backfill, rowValues, status}; totalMsgs++; logFlushed(); } - yield {tag: 'backfill-completed', ...backfill}; - const elapsed = performance.now() - start; + yield {tag: 'backfill-completed', ...backfill, status}; + elapsed = (performance.now() - start).toFixed(3); lc.info?.( - `Finished streaming ${totalRows} rows, ${totalMsgs} msgs, ${totalBytes} bytes ` + - `(${elapsed.toFixed(3)} ms)`, + `Finished streaming ${status.rows} rows, ${totalMsgs} msgs, ${totalBytes} bytes ` + + `(${elapsed} ms)`, ); } diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index 8bf67206c6..39ed56ba8d 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -10,6 +10,7 @@ import postgres from 'postgres'; import type {JSONObject} from '../../../../../shared/src/bigint-json.ts'; import {must} from '../../../../../shared/src/must.ts'; import {equals} from '../../../../../shared/src/set-utils.ts'; +import type {DownloadStatus} from '../../../../../zero-events/src/status.ts'; import type {Database} from '../../../../../zqlite/src/db.ts'; import { createLiteIndexStatement, @@ -180,16 +181,24 @@ export async function initialSync( ); try { createLiteTables(tx, tables, initialVersion); + const downloads = await Promise.all( + tables.map(spec => + copiers.processReadTask((db, lc) => + getInitialDownloadState(lc, db, spec), + ), + ), + ); statusPublisher.publish( lc, 'Initializing', `Copying ${numTables} upstream tables at version ${initialVersion}`, 5000, + () => ({downloadStatus: downloads.map(({status}) => status)}), ); void copyProfiler?.start(); const rowCounts = await Promise.all( - tables.map(table => + downloads.map(table => copiers.processReadTask((db, lc) => copy(lc, table, copyPool, db, tx), ), @@ -410,31 +419,79 @@ const MB = 1024 * 1024; const MAX_BUFFERED_ROWS = 10_000; const BUFFERED_SIZE_THRESHOLD = 8 * MB; -export function makeSelectPublishedStmt( +export type DownloadStatements = { + select: string; + getTotalRows: string; + getTotalBytes: string; +}; + +export function makeDownloadStatements( table: PublishedTableSpec, - columns: string[], -) { + cols: string[], +): DownloadStatements { const filterConditions = Object.values(table.publications) .map(({rowFilter}) => rowFilter) .filter(f => !!f); // remove nulls - return ( - /*sql*/ ` - SELECT ${columns.map(id).join(',')} FROM ${id(table.schema)}.${id(table.name)}` + - (filterConditions.length === 0 + const where = + filterConditions.length === 0 ? '' - : /*sql*/ ` WHERE ${filterConditions.join(' OR ')}`) - ); + : /*sql*/ `WHERE ${filterConditions.join(' OR ')}`; + const fromTable = /*sql*/ `FROM ${id(table.schema)}.${id(table.name)} ${where}`; + const totalBytes = `(${cols.map(col => `SUM(COALESCE(pg_column_size(${id(col)}), 0))`).join(' + ')})`; + const stmts = { + select: /*sql*/ `SELECT ${cols.map(id).join(',')} ${fromTable}`, + getTotalRows: /*sql*/ `SELECT COUNT(*) AS "totalRows" ${fromTable}`, + getTotalBytes: /*sql*/ `SELECT ${totalBytes} AS "totalBytes" ${fromTable}`, + }; + return stmts; +} + +type DownloadState = { + spec: PublishedTableSpec; + status: DownloadStatus; +}; + +async function getInitialDownloadState( + lc: LogContext, + sql: PostgresDB, + spec: PublishedTableSpec, +): Promise { + const start = performance.now(); + const table = liteTableName(spec); + const columns = Object.keys(spec.columns); + const stmts = makeDownloadStatements(spec, columns); + const rowsResult = sql + .unsafe<{totalRows: bigint}[]>(stmts.getTotalRows) + .execute(); + const bytesResult = sql + .unsafe<{totalBytes: bigint}[]>(stmts.getTotalBytes) + .execute(); + + const state: DownloadState = { + spec, + status: { + table, + columns, + rows: 0, + totalRows: Number((await rowsResult)[0].totalRows), + totalBytes: Number((await bytesResult)[0].totalBytes), + }, + }; + const elapsed = (performance.now() - start).toFixed(3); + lc.info?.(`Computed initial download state for ${table} (${elapsed} ms)`, { + state: state.status, + }); + return state; } async function copy( lc: LogContext, - table: PublishedTableSpec, + {spec: table, status}: DownloadState, dbClient: PostgresDB, from: PostgresTransaction, to: Database, ) { const start = performance.now(); - let rows = 0; let flushTime = 0; const tableName = liteTableName(table); @@ -455,7 +512,7 @@ async function copy( insertSql + `,${valuesSql}`.repeat(INSERT_BATCH_SIZE - 1), ); - const selectStmt = makeSelectPublishedStmt(table, columnNames); + const {select} = makeDownloadStatements(table, columnNames); const valuesPerRow = columnSpecs.length; const valuesPerBatch = valuesPerRow * INSERT_BATCH_SIZE; @@ -485,7 +542,7 @@ async function copy( pendingValues[i] = undefined as unknown as LiteValueType; } pendingSize = 0; - rows += flushedRows; + status.rows += flushedRows; const elapsed = performance.now() - start; flushTime += elapsed; @@ -494,7 +551,7 @@ async function copy( ); } - lc.info?.(`Starting copy stream of ${tableName}:`, selectStmt); + lc.info?.(`Starting copy stream of ${tableName}:`, select); const pgParsers = await getTypeParsers(dbClient, {returnJsonAsString: true}); const parsers = columnSpecs.map(c => { const pgParse = pgParsers.getTypeParser(c.typeOID); @@ -510,7 +567,7 @@ async function copy( let col = 0; await pipeline( - await from.unsafe(`COPY (${selectStmt}) TO STDOUT`).readable(), + await from.unsafe(`COPY (${select}) TO STDOUT`).readable(), new Writable({ highWaterMark: BUFFERED_SIZE_THRESHOLD, @@ -554,8 +611,8 @@ async function copy( const elapsed = performance.now() - start; lc.info?.( - `Finished copying ${rows} rows into ${tableName} ` + + `Finished copying ${status.rows} rows into ${tableName} ` + `(flush: ${flushTime.toFixed(3)} ms) (total: ${elapsed.toFixed(3)} ms) `, ); - return {rows, flushTime}; + return {rows: status.rows, flushTime}; } diff --git a/packages/zero-cache/src/services/change-source/protocol/current/data.ts b/packages/zero-cache/src/services/change-source/protocol/current/data.ts index 29ba7fee02..0a7fc34008 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/data.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/data.ts @@ -245,6 +245,14 @@ export const dropIndexSchema = v.object({ id: identifierSchema, }); +export const downloadStatusSchema = v.object({ + rows: v.number(), + totalRows: v.number(), + totalBytes: v.number().optional(), +}); + +export type DownloadStatus = v.Infer; + // A batch of rows from a single table containing column values // to be backfilled. export const backfillSchema = v.object({ @@ -273,6 +281,10 @@ export const backfillSchema = v.object({ // ] // ``` rowValues: v.array(v.array(jsonValueSchema)), + + // Optionally includes the progress of the backfill operation, + // for display purposes. + status: downloadStatusSchema.optional(), }); // Indicates that the backfill for the specified columns have @@ -291,6 +303,10 @@ export const backfillCompletedSchema = v.object({ // stream, and in particular, the commit watermark of the backfill change's // enclosing transaction. watermark: v.string(), + + // Optionally includes the final status of the backfill operation, + // for display purposes. + status: downloadStatusSchema.optional(), }); export type MessageBegin = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index c4ad62787f..b4c76bad40 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '3hqhs0gie5y3q', '/changes/v0/stream'); + t(current, '3195mx7sjomf1', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '3hqhs0gie5y3q', '/changes/v0/stream'); + t(v0, '3195mx7sjomf1', '/changes/v0/stream'); }); diff --git a/packages/zero-cache/src/services/replicator/change-processor.ts b/packages/zero-cache/src/services/replicator/change-processor.ts index 60b84608be..35a9367de1 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.ts @@ -4,6 +4,7 @@ import {AbortError} from '../../../../shared/src/abort-error.ts'; import {assert, unreachable} from '../../../../shared/src/asserts.ts'; import {stringify} from '../../../../shared/src/bigint-json.ts'; import {must} from '../../../../shared/src/must.ts'; +import type {DownloadStatus} from '../../../../zero-events/src/status.ts'; import { createLiteIndexStatement, createLiteTableStatement, @@ -67,6 +68,7 @@ export type ChangeProcessorMode = ReplicatorMode | 'initial-sync'; export type CommitResult = { watermark: string; + completedBackfill: DownloadStatus | undefined; schemaUpdated: boolean; changeLogUpdated: boolean; }; @@ -224,11 +226,7 @@ export class ChangeProcessor { this.#currentTx = null; assert(watermark, 'watermark is required for commit messages'); - const {schemaUpdated, changeLogUpdated} = tx.processCommit( - msg, - watermark, - ); - return {watermark, schemaUpdated, changeLogUpdated}; + return tx.processCommit(msg, watermark); } if (msg.tag === 'rollback') { @@ -848,7 +846,9 @@ class TransactionProcessor { ); } - processBackfillCompleted({relation, columns}: BackfillCompleted) { + #completedBackfill: DownloadStatus | undefined; + + processBackfillCompleted({relation, columns, status}: BackfillCompleted) { const tableName = liteTableName(relation); const rowKeyCols = relation.rowKey.columns; const cols = [...rowKeyCols, ...columns]; @@ -860,6 +860,9 @@ class TransactionProcessor { // Given that new columns are being exposed for every row in the table, bump the // row version for all rows. this.#bumpVersions(tableName); + if (status) { + this.#completedBackfill = {table: tableName, columns: cols, ...status}; + } this.#lc.info?.(`finished backfilling ${tableName}`); // Note that there is no need to clear the backfillingColumnVersions values @@ -873,10 +876,7 @@ class TransactionProcessor { // no backfills are in progress). } - processCommit( - commit: MessageCommit, - watermark: string, - ): {schemaUpdated: boolean; changeLogUpdated: boolean} { + processCommit(commit: MessageCommit, watermark: string): CommitResult { if (watermark !== this.#version) { throw new Error( `'commit' version ${watermark} does not match 'begin' version ${ @@ -902,6 +902,8 @@ class TransactionProcessor { this.#lc.debug?.(`Committed tx@${this.#version} (${elapsedMs} ms)`); return { + watermark, + completedBackfill: this.#completedBackfill, schemaUpdated: this.#schemaChanged, changeLogUpdated: this.#numChangeLogEntries > 0, }; diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.ts b/packages/zero-cache/src/services/replicator/incremental-sync.ts index 995f2cbd23..ee0dc94e2a 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.ts @@ -3,6 +3,7 @@ import type {Database} from '../../../../zqlite/src/db.ts'; import {StatementRunner} from '../../db/statements.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import type {Source} from '../../types/streams.ts'; +import type {DownloadStatus} from '../change-source/protocol/current.ts'; import { PROTOCOL_VERSION, type ChangeStreamer, @@ -97,6 +98,8 @@ export class IncrementalSyncer { `Replicating from ${watermark}`, ); + let backfillStatus: DownloadStatus | undefined; + for await (const message of downstream) { this.#replicationEvents.add(1); switch (message[0]) { @@ -110,8 +113,50 @@ export class IncrementalSyncer { this.stop(lc, message[1]); break; default: { + const msg = message[1]; + if (msg.tag === 'backfill' && msg.status) { + const {status} = msg; + if (!backfillStatus) { + // Start publishing the status every 3 seconds. + backfillStatus = status; + statusPublisher?.publish( + lc, + 'Replicating', + `Backfilling ${msg.relation.name} table`, + 3000, + () => + backfillStatus + ? { + downloadStatus: [ + { + ...backfillStatus, + table: msg.relation.name, + columns: [ + ...msg.relation.rowKey.columns, + ...msg.columns, + ], + }, + ], + } + : {}, + ); + } + backfillStatus = status; // Update the current status + } + const result = processor.processMessage(lc, message); - if (result?.schemaUpdated) { + if (result?.completedBackfill) { + // Publish the final status + const status = result.completedBackfill; + statusPublisher?.publish( + lc, + 'Replicating', + `Backfilled ${status.table} table`, + 0, + () => ({downloadStatus: [status]}), + ); + backfillStatus = undefined; + } else if (result?.schemaUpdated) { statusPublisher?.publish(lc, 'Replicating', 'Schema updated'); } if (result?.watermark && result?.changeLogUpdated) { @@ -128,6 +173,7 @@ export class IncrementalSyncer { } finally { downstream?.cancel(); unregister(); + statusPublisher?.stop(); } await this.#state.backoff(lc, err); } diff --git a/packages/zero-cache/src/services/replicator/replication-status.test.ts b/packages/zero-cache/src/services/replicator/replication-status.test.ts index 7149157fcc..785d1c1f51 100644 --- a/packages/zero-cache/src/services/replicator/replication-status.test.ts +++ b/packages/zero-cache/src/services/replicator/replication-status.test.ts @@ -1,10 +1,11 @@ import type {LogContext} from '@rocicorp/logger'; -import {beforeEach, describe, expect, test} from 'vitest'; +import {beforeEach, describe, expect, test, vi} from 'vitest'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import {Database} from '../../../../zqlite/src/db.ts'; import { replicationStatusError, replicationStatusEvent, + ReplicationStatusPublisher, } from './replication-status.ts'; describe('replicator/replication-status', () => { @@ -286,4 +287,58 @@ describe('replicator/replication-status', () => { type: 'zero/events/status/replication/v1', }); }); + + test('publish with extra state callback', () => { + const publish = vi.fn(); + + const publisher = new ReplicationStatusPublisher(replica, publish); + + publisher.publish( + lc, + 'Initializing', + 'foo bar', + 0, + () => ({ + downloadStatus: [ + { + table: 'foo', + columns: ['a', 'b'], + rows: 0, + totalRows: 100, + totalBytes: 1000, + }, + ], + }), + new Date(Date.UTC(2026, 1, 2, 3, 4, 5)), + ); + + expect(publish).toHaveBeenCalledOnce(); + expect(publish.mock.calls[0][1]).toMatchInlineSnapshot(` + { + "component": "replication", + "description": "foo bar", + "stage": "Initializing", + "state": { + "downloadStatus": [ + { + "columns": [ + "a", + "b", + ], + "rows": 0, + "table": "foo", + "totalBytes": 1000, + "totalRows": 100, + }, + ], + "indexes": [], + "replicaSize": 0, + "tables": [], + }, + "status": "OK", + "time": "2026-02-02T03:04:05.000Z", + "type": "zero/events/status/replication/v1", + } + `); + }); }); diff --git a/packages/zero-cache/src/services/replicator/replication-status.ts b/packages/zero-cache/src/services/replicator/replication-status.ts index a5d503beba..b3758f6005 100644 --- a/packages/zero-cache/src/services/replicator/replication-status.ts +++ b/packages/zero-cache/src/services/replicator/replication-status.ts @@ -5,6 +5,7 @@ import type { ReplicatedIndex, ReplicatedTable, ReplicationStage, + ReplicationState, ReplicationStatusEvent, Status, } from '../../../../zero-events/src/status.ts'; @@ -14,7 +15,6 @@ import type {LiteTableSpec} from '../../db/specs.ts'; import { makeErrorDetails, publishCriticalEvent, - publishEvent, } from '../../observability/events.ts'; const byKeys = (a: [string, unknown], b: [string, unknown]) => @@ -22,10 +22,12 @@ const byKeys = (a: [string, unknown], b: [string, unknown]) => export class ReplicationStatusPublisher { readonly #db: Database; + readonly #publish: typeof publishCriticalEvent; #timer: NodeJS.Timeout | undefined; - constructor(db: Database) { + constructor(db: Database, publishFn = publishCriticalEvent) { this.#db = db; + this.#publish = publishFn; } publish( @@ -33,16 +35,29 @@ export class ReplicationStatusPublisher { stage: ReplicationStage, description?: string, interval = 0, + extraState?: () => Partial, + now = new Date(), ): this { this.stop(); - publishEvent( + const event = replicationStatusEvent( lc, - replicationStatusEvent(lc, this.#db, stage, 'OK', description), + this.#db, + stage, + 'OK', + description, + now, ); + if (event.state) { + event.state = { + ...event.state, + ...extraState?.(), + }; + } + void this.#publish(lc, event); if (interval) { this.#timer = setInterval( - () => this.publish(lc, stage, description, interval), + () => this.publish(lc, stage, description, interval, extraState), interval, ); } @@ -56,7 +71,7 @@ export class ReplicationStatusPublisher { ): Promise { this.stop(); const event = replicationStatusError(lc, stage, 'ERROR', this.#db); - await publishCriticalEvent(lc, event); + await this.#publish(lc, event); throw e; } @@ -106,6 +121,7 @@ export function replicationStatusEvent( description?: string, now = new Date(), ): ReplicationStatusEvent { + const start = performance.now(); try { return { type: 'zero/events/status/replication/v1', @@ -135,6 +151,9 @@ export function replicationStatusEvent( replicaSize: 0, }, }; + } finally { + const elapsed = (performance.now() - start).toFixed(3); + lc.debug?.(`computed schema for replication event (${elapsed} ms)`); } } @@ -143,8 +162,6 @@ function getReplicatedTables(db: Database): ReplicatedTable[] { const clientSchema = computeZqlSpecs( createSilentLogContext(), // avoid logging warnings about indexes db, - // TODO: Consider exposing backfilling columns with an indication - // of backfill status. {includeBackfillingColumns: false}, new Map(), fullTables, diff --git a/packages/zero-events/src/status.ts b/packages/zero-events/src/status.ts index a89fc74884..c86fb1c285 100644 --- a/packages/zero-events/src/status.ts +++ b/packages/zero-events/src/status.ts @@ -70,10 +70,20 @@ export type ReplicatedIndex = { unique: boolean; }; +export type DownloadStatus = { + table: string; + columns: string[]; + totalRows: number; + totalBytes?: number | undefined; + + rows: number; +}; + export type ReplicationState = { tables: ReplicatedTable[]; indexes: ReplicatedIndex[]; replicaSize?: number | undefined; + downloadStatus?: DownloadStatus[] | undefined; }; export type ReplicationStage = 'Initializing' | 'Indexing' | 'Replicating'; From a9592cd87e26919755e36997fa703ed1319dd0f8 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 2 Mar 2026 22:33:04 -0800 Subject: [PATCH 120/495] chore(zero-events): bump npm version (#5633) bump @rocicorp/zero-events version to publish API change in #5632 --- package-lock.json | 1488 ++++++++--------------------- packages/zero-cache/package.json | 2 +- packages/zero-events/package.json | 2 +- 3 files changed, 382 insertions(+), 1110 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3801307a3a..f26effe5f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -207,6 +207,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -234,6 +235,7 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -393,6 +395,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -495,7 +498,6 @@ "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -711,6 +713,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -1774,6 +1777,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2127,7 +2131,6 @@ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -2144,7 +2147,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2158,7 +2160,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2174,7 +2175,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2184,8 +2184,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -2193,7 +2192,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -2204,7 +2202,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -2215,7 +2212,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2323,7 +2319,6 @@ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2342,7 +2337,6 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2371,7 +2365,6 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2385,7 +2378,6 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2399,7 +2391,6 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2413,7 +2404,6 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2430,7 +2420,6 @@ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2459,7 +2448,6 @@ "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2476,7 +2464,6 @@ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2523,7 +2510,6 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2537,7 +2523,6 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2566,7 +2551,6 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2580,7 +2564,6 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2594,7 +2577,6 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2608,7 +2590,6 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2622,7 +2603,6 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2636,7 +2616,6 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2650,7 +2629,6 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2667,7 +2645,6 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2986,7 +2963,6 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -3914,7 +3890,6 @@ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -4141,6 +4116,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -4163,6 +4139,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -6679,6 +6656,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6894,6 +6872,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7406,6 +7385,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7507,7 +7487,8 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.6", @@ -8421,7 +8402,6 @@ "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -8433,7 +8413,6 @@ "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -8456,7 +8435,6 @@ "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -8480,7 +8458,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8499,7 +8476,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -8510,7 +8486,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8527,7 +8502,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8544,8 +8518,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/config/node_modules/@babel/code-frame": { "version": "7.10.4", @@ -8553,7 +8526,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8564,7 +8536,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8583,7 +8554,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -8594,7 +8564,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8611,7 +8580,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8629,7 +8597,6 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8641,7 +8608,6 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8652,7 +8618,6 @@ "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8667,7 +8632,6 @@ "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -8690,8 +8654,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/fingerprint/node_modules/brace-expansion": { "version": "2.0.2", @@ -8699,7 +8662,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8710,7 +8672,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8727,7 +8688,6 @@ "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8747,7 +8707,6 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8758,7 +8717,6 @@ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -8772,7 +8730,6 @@ "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -8784,7 +8741,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8795,7 +8751,6 @@ "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -8816,7 +8771,6 @@ "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -8838,7 +8792,6 @@ "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -8853,7 +8806,6 @@ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -8869,7 +8821,6 @@ "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -8881,16 +8832,14 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8898,7 +8847,6 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8911,16 +8859,14 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/xcpretty": { "version": "4.3.2", @@ -8928,7 +8874,6 @@ "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -8945,7 +8890,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8956,7 +8900,6 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8974,7 +8917,6 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8991,7 +8933,6 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9642,7 +9583,6 @@ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -9656,7 +9596,6 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -9667,7 +9606,6 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9685,7 +9623,6 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -9696,7 +9633,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9707,7 +9643,6 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9722,7 +9657,6 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9737,7 +9671,6 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9751,7 +9684,6 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9768,7 +9700,6 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9781,7 +9712,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -9792,7 +9722,6 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9806,7 +9735,6 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9823,7 +9751,6 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9854,7 +9781,6 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9882,7 +9808,6 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10211,6 +10136,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10333,6 +10259,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10566,6 +10493,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -10662,6 +10590,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12801,6 +12730,7 @@ "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.2.0" }, @@ -13188,7 +13118,6 @@ "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13199,7 +13128,6 @@ "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -13214,7 +13142,6 @@ "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -13275,7 +13202,6 @@ "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -13299,7 +13225,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13321,7 +13246,6 @@ "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -13353,7 +13277,6 @@ "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13364,7 +13287,6 @@ "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -13389,7 +13311,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13407,7 +13328,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13418,7 +13338,6 @@ "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13429,7 +13348,6 @@ "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -13444,7 +13362,6 @@ "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -13468,7 +13385,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13486,7 +13402,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13497,7 +13412,6 @@ "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13508,7 +13422,6 @@ "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13518,8 +13431,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-stately/utils": { "version": "3.10.4", @@ -13926,6 +13838,7 @@ "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -14148,7 +14061,6 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -14159,7 +14071,6 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -15156,6 +15067,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15289,6 +15201,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.19" }, @@ -15306,6 +15219,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -15407,6 +15321,7 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15806,7 +15721,6 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*" } @@ -15947,6 +15861,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15980,6 +15895,7 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -16037,6 +15953,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -16187,8 +16104,7 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -16260,7 +16176,6 @@ "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -16272,7 +16187,6 @@ "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -16552,6 +16466,7 @@ "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -16575,6 +16490,7 @@ "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -16930,7 +16846,6 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -17051,6 +16966,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -17136,6 +17052,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17197,6 +17114,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -17238,8 +17156,7 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", @@ -17532,8 +17449,7 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", @@ -17636,8 +17552,7 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/async-listen": { "version": "3.0.0", @@ -17779,7 +17694,6 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -17828,7 +17742,6 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -17847,7 +17760,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17869,7 +17781,6 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17885,7 +17796,6 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -17988,7 +17898,6 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -17998,8 +17907,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.29.1", @@ -18007,7 +17915,6 @@ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.29.1" } @@ -18018,7 +17925,6 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -18029,7 +17935,6 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -18057,7 +17962,6 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -18289,7 +18193,6 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -18303,7 +18206,6 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -18570,7 +18472,6 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -18581,7 +18482,6 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -18640,6 +18540,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -18660,7 +18561,6 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -18838,7 +18738,6 @@ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -18852,7 +18751,6 @@ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -18863,7 +18761,6 @@ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -19116,7 +19013,6 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19145,7 +19041,6 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19244,7 +19139,6 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -19257,7 +19151,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "peer": true, "engines": { "node": ">=6" }, @@ -19303,7 +19196,6 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -20564,6 +20456,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -20803,7 +20696,6 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -21227,7 +21119,6 @@ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "dotenv": "^16.4.5" }, @@ -21606,7 +21497,6 @@ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -21625,7 +21515,6 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -21704,6 +21593,7 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22403,8 +22293,7 @@ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/execa": { "version": "5.1.1", @@ -22453,7 +22342,6 @@ "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -22472,7 +22360,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -22483,7 +22370,6 @@ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=20.16.0" } @@ -22493,8 +22379,7 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/express": { "version": "4.22.1", @@ -22853,7 +22738,6 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", - "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -22867,7 +22751,6 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bser": "2.1.1" } @@ -23151,8 +23034,7 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -23179,8 +23061,7 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/for-each": { "version": "0.3.5", @@ -23277,7 +23158,6 @@ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -23496,7 +23376,6 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -23578,7 +23457,6 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -24214,16 +24092,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.29.1", @@ -24231,7 +24107,6 @@ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.29.1" } @@ -24271,6 +24146,7 @@ "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -24716,7 +24592,6 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -24962,7 +24837,6 @@ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -25337,7 +25211,6 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -25355,7 +25228,6 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -25431,7 +25303,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -25450,7 +25321,6 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25461,7 +25331,6 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -25488,7 +25357,6 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -25510,7 +25378,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25524,7 +25391,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25539,8 +25405,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-mock": { "version": "29.7.0", @@ -25548,7 +25413,6 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -25564,7 +25428,6 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25592,7 +25455,6 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -25611,7 +25473,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25625,7 +25486,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25640,8 +25500,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-worker": { "version": "29.7.0", @@ -25678,8 +25537,7 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jiti": { "version": "1.21.0", @@ -25758,8 +25616,7 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/jsdom": { "version": "26.1.0", @@ -25888,8 +25745,7 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -25993,7 +25849,6 @@ "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -26117,7 +25972,6 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -26129,7 +25983,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -26139,8 +25992,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lightningcss": { "version": "1.30.2", @@ -26180,12 +26032,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26201,12 +26053,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26222,12 +26074,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26243,12 +26095,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26264,12 +26116,12 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26285,12 +26137,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26306,12 +26158,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26327,12 +26179,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26348,12 +26200,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26369,12 +26221,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26390,12 +26242,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26498,8 +26350,7 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -26513,7 +26364,6 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -26527,7 +26377,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -26541,7 +26390,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26557,7 +26405,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -26567,8 +26414,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -26576,7 +26422,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -26587,7 +26432,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -26598,7 +26442,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -26735,6 +26578,7 @@ "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -26768,7 +26612,6 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -26829,8 +26672,7 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -27219,8 +27061,7 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge-anything": { "version": "5.1.7", @@ -27276,7 +27117,6 @@ "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -27332,7 +27172,6 @@ "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -27349,7 +27188,6 @@ "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -27366,7 +27204,6 @@ "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27380,7 +27217,6 @@ "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -27401,7 +27237,6 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -27412,7 +27247,6 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -27429,7 +27263,6 @@ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -27444,7 +27277,6 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -27459,7 +27291,6 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -27474,7 +27305,6 @@ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -27485,7 +27315,6 @@ "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27501,7 +27330,6 @@ "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27523,7 +27351,6 @@ "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27538,7 +27365,6 @@ "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27552,7 +27378,6 @@ "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27567,7 +27392,6 @@ "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27590,7 +27414,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27601,7 +27424,6 @@ "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27623,7 +27445,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27634,7 +27455,6 @@ "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27653,7 +27473,6 @@ "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27678,8 +27497,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", @@ -27687,7 +27505,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -27698,7 +27515,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -27712,7 +27528,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27723,7 +27538,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28740,6 +28554,7 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.x" } @@ -28797,7 +28612,8 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/mri": { "version": "1.2.0", @@ -28842,6 +28658,7 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -28955,8 +28772,7 @@ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", @@ -29087,8 +28903,7 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.27", @@ -29137,7 +28952,6 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -29154,7 +28968,6 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -29167,8 +28980,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -29256,8 +29068,7 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nwsapi": { "version": "2.2.22", @@ -29292,7 +29103,6 @@ "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29479,7 +29289,6 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -29498,7 +29307,6 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -29509,7 +29317,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -29523,7 +29330,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29539,7 +29345,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -29549,8 +29354,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -29558,7 +29362,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -29569,7 +29372,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -29580,7 +29382,6 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -29594,7 +29395,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -29700,6 +29500,7 @@ "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -29735,7 +29536,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -29860,7 +29660,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -30045,7 +29844,6 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -30117,7 +29915,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -30208,6 +30005,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -30438,6 +30236,7 @@ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "playwright-core": "1.53.2" }, @@ -30469,7 +30268,6 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -30485,7 +30283,6 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } @@ -30532,6 +30329,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31668,6 +31466,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31837,7 +31636,6 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -31927,6 +31725,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -31969,7 +31768,6 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -32017,7 +31815,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -32028,7 +31825,6 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -32262,7 +32058,6 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -32288,7 +32083,6 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -32438,6 +32232,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32451,7 +32246,6 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -32463,7 +32257,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -32485,6 +32278,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32559,6 +32353,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -32633,6 +32428,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -33349,7 +33145,6 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, - "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -33365,7 +33160,6 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-parse": "^1.0.5" } @@ -33417,7 +33211,6 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "global-dirs": "^0.1.1" }, @@ -33431,7 +33224,6 @@ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -33458,8 +33250,7 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/resolve.exports": { "version": "2.0.3", @@ -33467,7 +33258,6 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -33493,7 +33283,6 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -33508,7 +33297,6 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -33519,7 +33307,6 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -33598,6 +33385,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33806,6 +33594,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -34003,7 +33792,6 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -34022,6 +33810,7 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -34389,7 +34178,6 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -34479,7 +34267,6 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -34564,6 +34351,7 @@ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -34769,7 +34557,6 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -34783,7 +34570,6 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -34800,8 +34586,7 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -34809,7 +34594,6 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34823,7 +34607,6 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -34854,7 +34637,6 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -35026,8 +34808,7 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/style-to-js": { "version": "1.1.21", @@ -35113,7 +34894,6 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -35224,6 +35004,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35370,7 +35151,6 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -35381,7 +35161,6 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -35398,6 +35177,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -35604,8 +35384,7 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/throttleit": { "version": "2.1.0", @@ -35707,6 +35486,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -35768,8 +35548,7 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -35946,13 +35725,15 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -36583,7 +36364,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -36695,6 +36475,7 @@ "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 18" }, @@ -37399,7 +37180,6 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -37478,6 +37258,7 @@ "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -37723,8 +37504,7 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -37745,7 +37525,6 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -37778,7 +37557,6 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -37794,6 +37572,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -38212,8 +37991,7 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "4.0.0", @@ -38241,7 +38019,6 @@ "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -38257,7 +38034,6 @@ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=8" } @@ -38399,8 +38175,7 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/wordwrapjs": { "version": "5.1.0", @@ -38481,6 +38256,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -38541,7 +38317,6 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -38556,7 +38331,6 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -38601,7 +38375,6 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -38616,7 +38389,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" } @@ -38627,7 +38399,6 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -38716,7 +38487,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -38855,7 +38625,6 @@ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", - "peer": true, "peerDependencies": { "zod": "^3.24.1" } @@ -39182,6 +38951,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -39282,7 +39052,6 @@ "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -39371,7 +39140,6 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -39382,7 +39150,6 @@ "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -39405,7 +39172,6 @@ "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -39429,7 +39195,6 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -39453,7 +39218,6 @@ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -39492,7 +39256,6 @@ "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -39515,7 +39278,6 @@ "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -39542,7 +39304,6 @@ "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39553,7 +39314,6 @@ "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -39568,7 +39328,6 @@ "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -39629,7 +39388,6 @@ "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -39652,7 +39410,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -39665,7 +39422,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -39687,7 +39443,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39701,7 +39456,6 @@ "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -39733,7 +39487,6 @@ "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39744,7 +39497,6 @@ "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -39769,7 +39521,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39792,7 +39543,6 @@ "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39803,7 +39553,6 @@ "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -39818,7 +39567,6 @@ "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -39842,7 +39590,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -39853,7 +39600,6 @@ "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39864,7 +39610,6 @@ "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39874,8 +39619,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/@react-native/virtualized-lists": { "version": "0.83.1", @@ -39883,7 +39627,6 @@ "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -39908,7 +39651,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -39921,8 +39663,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/babel-preset-expo": { "version": "54.0.10", @@ -39930,7 +39671,6 @@ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -39975,7 +39715,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -39986,7 +39725,6 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -39997,7 +39735,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -40062,7 +39799,6 @@ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -40079,7 +39815,6 @@ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -40095,7 +39830,6 @@ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -40123,7 +39857,6 @@ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -40135,7 +39868,6 @@ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -40153,7 +39885,6 @@ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -40183,7 +39914,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -40202,7 +39932,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -40218,16 +39947,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/lru-cache": { "version": "11.2.4", @@ -40235,7 +39962,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -40246,7 +39972,6 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -40302,7 +40027,6 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -40319,7 +40043,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40330,7 +40053,6 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -40347,7 +40069,6 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40361,7 +40082,6 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -40382,7 +40102,6 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -40398,7 +40117,6 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -40420,7 +40138,6 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -40435,7 +40152,6 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40449,7 +40165,6 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -40464,7 +40179,6 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -40487,7 +40201,6 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -40509,7 +40222,6 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40528,7 +40240,6 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40553,8 +40264,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/metro/node_modules/hermes-parser": { "version": "0.32.0", @@ -40562,7 +40272,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40573,7 +40282,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40596,7 +40304,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -40607,7 +40314,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -40621,7 +40327,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -40638,7 +40343,6 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -40652,7 +40356,6 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40666,7 +40369,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -40684,7 +40386,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -40702,7 +40403,6 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -40730,7 +40430,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -40746,7 +40445,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -40772,8 +40470,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native": { "version": "0.83.1", @@ -40841,7 +40538,6 @@ "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -40863,8 +40559,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -40872,7 +40567,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -40883,7 +40577,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -40895,7 +40588,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -40907,7 +40599,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40929,7 +40620,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40940,7 +40630,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -40954,7 +40643,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40976,16 +40664,14 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/source-map": { "version": "0.5.7", @@ -40993,7 +40679,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -41004,7 +40689,6 @@ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -41036,7 +40720,6 @@ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -41047,7 +40730,6 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -41289,7 +40971,7 @@ "zqlite": "0.0.0" }, "devDependencies": { - "@rocicorp/zero-events": "0.0.3", + "@rocicorp/zero-events": "0.0.4", "@testcontainers/postgresql": "^10.9.0", "@types/node": "^22.10.5", "@types/pg-format": "^1.0.5", @@ -41389,7 +41071,7 @@ }, "packages/zero-events": { "name": "@rocicorp/zero-events", - "version": "0.0.3", + "version": "0.0.4", "license": "Apache-2.0", "devDependencies": { "shared": "0.0.0", @@ -41471,7 +41153,6 @@ "shared": "0.0.0", "zero-client": "0.0.0", "zero-schema": "0.0.0", - "zero-types": "0.0.0", "zql": "0.0.0" }, "peerDependencies": { @@ -41564,7 +41245,6 @@ "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -41654,7 +41334,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41672,7 +41351,6 @@ "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -41695,7 +41373,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41713,7 +41390,6 @@ "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -41752,7 +41428,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41770,7 +41445,6 @@ "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -41793,7 +41467,6 @@ "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -41820,7 +41493,6 @@ "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -41843,7 +41515,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41856,7 +41527,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41878,7 +41548,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41889,7 +41558,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41903,7 +41571,6 @@ "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -41927,8 +41594,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/babel-preset-expo": { "version": "54.0.4", @@ -41936,7 +41602,6 @@ "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -41981,7 +41646,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -42032,7 +41696,6 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -42043,7 +41706,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -42108,7 +41770,6 @@ "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -42125,7 +41786,6 @@ "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -42141,7 +41801,6 @@ "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -42169,7 +41828,6 @@ "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -42181,7 +41839,6 @@ "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -42243,8 +41900,7 @@ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/minimatch": { "version": "9.0.5", @@ -42252,7 +41908,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -42269,7 +41924,6 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -42301,7 +41955,6 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -42329,7 +41982,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -42351,7 +42003,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -42365,7 +42016,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -42381,7 +42031,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -42405,8 +42054,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native": { "version": "0.82.0", @@ -42473,8 +42121,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -42482,7 +42129,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -42493,7 +42139,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -42506,7 +42151,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -42528,7 +42172,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -42539,7 +42182,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -42553,7 +42195,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -42575,16 +42216,14 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/tar": { "version": "7.5.1", @@ -42592,7 +42231,6 @@ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -42624,7 +42262,6 @@ "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -42771,7 +42408,6 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -43132,7 +42768,6 @@ "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, - "peer": true, "requires": {} }, "@ai-sdk/gateway": { @@ -43272,6 +42907,7 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", + "peer": true, "requires": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -44106,6 +43742,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -44347,7 +43984,6 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, - "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -44360,7 +43996,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -44370,7 +44005,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -44382,7 +44016,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -44391,29 +44024,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -44477,7 +44106,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, - "peer": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -44489,7 +44117,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44505,7 +44132,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44515,7 +44141,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44525,7 +44150,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -44535,7 +44159,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44545,7 +44168,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44563,7 +44185,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44573,7 +44194,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44599,7 +44219,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44609,7 +44228,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44627,7 +44245,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44637,7 +44254,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44647,7 +44263,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44657,7 +44272,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44667,7 +44281,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44677,7 +44290,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44687,7 +44299,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44697,7 +44308,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44876,7 +44486,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -45446,7 +45055,6 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -45571,12 +45179,14 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "peer": true }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -46610,6 +46220,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -46774,6 +46385,7 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", + "peer": true, "requires": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -47132,7 +46744,8 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "peer": true }, "which": { "version": "4.0.0", @@ -47193,7 +46806,8 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true + "dev": true, + "peer": true }, "@electric-sql/pglite-socket": { "version": "0.0.6", @@ -47604,7 +47218,6 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, - "peer": true, "requires": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -47615,7 +47228,6 @@ "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -47637,7 +47249,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47647,7 +47258,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47658,15 +47268,13 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47676,7 +47284,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47689,7 +47296,6 @@ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, - "peer": true, "requires": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -47712,7 +47318,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47723,15 +47328,13 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47741,7 +47344,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47753,15 +47355,13 @@ "version": "54.0.10", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true, - "peer": true + "dev": true }, "@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, - "peer": true, "requires": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -47772,7 +47372,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "peer": true, "requires": { "ms": "^2.1.1" } @@ -47784,7 +47383,6 @@ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, - "peer": true, "requires": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -47798,7 +47396,6 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -47817,15 +47414,13 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -47835,7 +47430,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -47847,7 +47441,6 @@ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -47865,15 +47458,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "peer": true + "dev": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, - "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -47885,7 +47476,6 @@ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -47896,7 +47486,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47908,7 +47497,6 @@ "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, - "peer": true, "requires": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -47920,7 +47508,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, - "peer": true, "requires": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -47941,7 +47528,6 @@ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -47952,7 +47538,6 @@ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, - "peer": true, "requires": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -47967,7 +47552,6 @@ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, - "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -47978,22 +47562,19 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true, - "peer": true + "dev": true }, "@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true, - "peer": true + "dev": true }, "@expo/spawn-async": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.3" } @@ -48002,22 +47583,19 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true, - "peer": true + "dev": true }, "@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true, - "peer": true + "dev": true }, "@expo/xcpretty": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -48030,7 +47608,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -48040,7 +47617,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -48051,7 +47627,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -48061,7 +47636,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -48565,7 +48139,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "peer": true, "requires": { "minipass": "^7.0.4" } @@ -48574,15 +48147,13 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true, - "peer": true + "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "peer": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -48596,7 +48167,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -48605,15 +48175,13 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true + "dev": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -48624,7 +48192,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -48635,7 +48202,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -48645,7 +48211,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "peer": true, "requires": { "p-try": "^2.0.0" } @@ -48655,7 +48220,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -48666,15 +48230,13 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "peer": true + "dev": true }, "@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3" } @@ -48684,7 +48246,6 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "peer": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -48697,7 +48258,6 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -48720,7 +48280,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -48744,7 +48303,6 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -48968,6 +48526,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "peer": true, "requires": { "@types/mdx": "^2.0.0" } @@ -49061,7 +48620,8 @@ "@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "peer": true }, "@noble/curves": { "version": "1.8.1", @@ -49240,7 +48800,8 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "peer": true }, "@opentelemetry/api-logs": { "version": "0.203.0", @@ -49315,6 +48876,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -50532,6 +50094,7 @@ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, + "peer": true, "requires": { "@prisma/client-runtime-utils": "7.2.0" } @@ -50833,15 +50396,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -50852,7 +50413,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -50906,7 +50466,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50922,7 +50481,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50939,7 +50497,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, - "peer": true, "requires": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -50954,15 +50511,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true, - "peer": true + "dev": true }, "@react-native/dev-middleware": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -50983,7 +50538,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50994,7 +50548,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51005,15 +50558,13 @@ "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true, - "peer": true + "dev": true }, "@react-native/debugger-shell": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -51024,7 +50575,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -51044,7 +50594,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -51055,7 +50604,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51066,22 +50614,19 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/js-polyfills": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/normalize-colors": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true, - "peer": true + "dev": true }, "@react-stately/utils": { "version": "3.10.4", @@ -51193,7 +50738,6 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -51266,7 +50810,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -51279,7 +50822,6 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, - "peer": true, "requires": { "chalk": "^4.1.2" }, @@ -51289,7 +50831,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -51302,7 +50843,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -51332,7 +50872,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -51345,7 +50884,6 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -51364,7 +50902,6 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, - "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -51379,7 +50916,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -51395,7 +50931,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51406,7 +50941,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51421,7 +50955,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51431,7 +50964,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51443,7 +50975,6 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -51453,15 +50984,13 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "babel-preset-expo": { "version": "54.0.4", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, - "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -51492,7 +51021,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -51522,15 +51050,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true + "dev": true }, "commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true + "dev": true }, "expo": { "version": "54.0.13", @@ -51567,7 +51093,6 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, - "peer": true, "requires": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -51578,7 +51103,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -51589,7 +51113,6 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, - "peer": true, "requires": {} }, "expo-font": { @@ -51607,7 +51130,6 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, - "peer": true, "requires": {} }, "expo-modules-core": { @@ -51615,7 +51137,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4" } @@ -51647,15 +51168,13 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -51665,7 +51184,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "peer": true, "requires": { "minipass": "^7.1.2" } @@ -51679,15 +51197,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true + "dev": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -51698,8 +51214,7 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51708,7 +51223,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -51719,8 +51233,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51735,8 +51248,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true }, "react-native": { "version": "0.82.0", @@ -51786,15 +51298,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -51804,7 +51314,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51815,7 +51324,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51830,7 +51338,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51840,7 +51347,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51850,7 +51356,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51866,22 +51371,19 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true + "dev": true }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true, - "peer": true + "dev": true }, "tar": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, - "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -51900,8 +51402,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true, - "peer": true + "dev": true }, "vite": { "version": "7.2.7", @@ -51947,8 +51448,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -52142,6 +51642,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -52317,7 +51818,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "peer": true, "requires": { "type-detect": "4.0.8" } @@ -52327,7 +51827,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "peer": true, "requires": { "@sinonjs/commons": "^3.0.0" } @@ -52979,6 +52478,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "requires": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -53061,6 +52561,7 @@ "version": "3.13.19", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", + "peer": true, "requires": { "@tanstack/virtual-core": "3.13.19" } @@ -53068,7 +52569,8 @@ "@tanstack/virtual-core": { "version": "3.13.19", "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", - "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==" + "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", + "peer": true }, "@tantaman/api-extractor": { "version": "7.52.13", @@ -53137,6 +52639,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -53481,7 +52984,6 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "peer": true, "requires": { "@types/node": "*" } @@ -53608,6 +53110,7 @@ "version": "22.18.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "peer": true, "requires": { "undici-types": "~6.21.0" }, @@ -53639,6 +53142,7 @@ "version": "8.15.4", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", + "peer": true, "requires": { "@types/node": "*", "pg-protocol": "*", @@ -53689,6 +53193,7 @@ "version": "18.3.23", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -53827,8 +53332,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true + "dev": true }, "@types/strip-ansi": { "version": "3.0.0", @@ -53891,7 +53395,6 @@ "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -53902,7 +53405,6 @@ "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, - "peer": true, "requires": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -54110,6 +53612,7 @@ "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, + "peer": true, "requires": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -54134,6 +53637,7 @@ "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, + "peer": true, "requires": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -54391,8 +53895,7 @@ "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "peer": true + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -54481,7 +53984,8 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "peer": true }, "acorn-import-attributes": { "version": "1.9.5", @@ -54534,6 +54038,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -54577,6 +54082,7 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", + "peer": true, "requires": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -54630,8 +54136,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "peer": true + "dev": true }, "ansi-align": { "version": "3.0.1", @@ -54832,8 +54337,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true + "dev": true }, "asn1": { "version": "0.2.6", @@ -54925,8 +54429,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "peer": true + "dev": true }, "async-listen": { "version": "3.0.0", @@ -55010,7 +54513,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "peer": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -55043,7 +54545,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -55057,7 +54558,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -55072,7 +54572,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "peer": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -55086,7 +54585,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -55164,7 +54662,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, - "peer": true, "requires": { "@babel/types": "^7.26.0" } @@ -55173,15 +54670,13 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.29.1" } @@ -55191,7 +54686,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, - "peer": true, "requires": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -55201,7 +54695,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, - "peer": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -55225,7 +54718,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "peer": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -55375,7 +54867,6 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, - "peer": true, "requires": { "open": "^8.0.4" } @@ -55384,8 +54875,7 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "peer": true + "dev": true }, "big.js": { "version": "5.2.2", @@ -55565,7 +55055,6 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, - "peer": true, "requires": { "stream-buffers": "2.2.x" } @@ -55575,7 +55064,6 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, - "peer": true, "requires": { "big-integer": "1.6.x" } @@ -55607,6 +55095,7 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "peer": true, "requires": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -55620,7 +55109,6 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "peer": true, "requires": { "node-int64": "^0.4.0" } @@ -55731,7 +55219,6 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, - "peer": true, "requires": { "callsites": "^2.0.0" }, @@ -55740,8 +55227,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -55750,7 +55236,6 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, - "peer": true, "requires": { "caller-callsite": "^2.0.0" } @@ -55910,7 +55395,6 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, - "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55928,7 +55412,6 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, - "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55997,7 +55480,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, - "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -56006,8 +55488,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "peer": true + "dev": true }, "cli-table3": { "version": "0.6.5", @@ -56050,8 +55531,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "peer": true + "dev": true }, "clone-deep": { "version": "4.0.1", @@ -56851,7 +56331,8 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "peer": true }, "d3-timer": { "version": "3.0.1", @@ -57021,7 +56502,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "peer": true, "requires": { "clone": "^1.0.2" } @@ -57307,7 +56787,6 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, - "peer": true, "requires": { "dotenv": "^16.4.5" } @@ -57493,8 +56972,7 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true, - "peer": true + "dev": true }, "error-ex": { "version": "1.3.2", @@ -57509,7 +56987,6 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, - "peer": true, "requires": { "stackframe": "^1.3.4" } @@ -57563,6 +57040,7 @@ "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "peer": true, "requires": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", @@ -57935,8 +57413,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true, - "peer": true + "dev": true }, "execa": { "version": "5.1.1", @@ -57970,7 +57447,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -57984,8 +57460,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -57993,15 +57468,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true, - "peer": true + "dev": true }, "exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "peer": true + "dev": true }, "express": { "version": "4.22.1", @@ -58271,15 +57744,13 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true, - "peer": true + "dev": true }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "peer": true, "requires": { "bser": "2.1.1" } @@ -58468,8 +57939,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true, - "peer": true + "dev": true }, "follow-redirects": { "version": "1.15.11", @@ -58480,8 +57950,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true, - "peer": true + "dev": true }, "for-each": { "version": "0.3.5", @@ -58538,8 +58007,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true, - "peer": true + "dev": true }, "fresh": { "version": "0.5.2", @@ -58692,8 +58160,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "peer": true + "dev": true }, "get-port": { "version": "7.1.0", @@ -58743,8 +58210,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true, - "peer": true + "dev": true }, "giget": { "version": "2.0.0", @@ -59187,22 +58653,19 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true, - "peer": true + "dev": true }, "hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true, - "peer": true + "dev": true }, "hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.29.1" } @@ -59239,7 +58702,8 @@ "version": "4.10.6", "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true + "dev": true, + "peer": true }, "hpack.js": { "version": "2.1.6", @@ -59533,7 +58997,6 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, - "peer": true, "requires": { "queue": "6.0.2" } @@ -59694,8 +59157,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "peer": true + "dev": true }, "is-docker": { "version": "2.2.1", @@ -59912,7 +59374,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -59925,8 +59386,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59983,7 +59443,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "peer": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -59997,15 +59456,13 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "peer": true + "dev": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -60026,7 +59483,6 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -60043,15 +59499,13 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -60062,8 +59516,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60072,7 +59525,6 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -60083,8 +59535,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "peer": true + "dev": true }, "jest-util": { "version": "29.7.0", @@ -60104,7 +59555,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -60118,15 +59568,13 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -60137,8 +59585,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60167,8 +59614,7 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true, - "peer": true + "dev": true }, "jiti": { "version": "1.21.0", @@ -60232,8 +59678,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true, - "peer": true + "dev": true }, "jsdom": { "version": "26.1.0", @@ -60326,8 +59771,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "peer": true + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -60410,8 +59854,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true, - "peer": true + "dev": true }, "latest-version": { "version": "7.0.0", @@ -60504,7 +59947,6 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, - "peer": true, "requires": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -60515,7 +59957,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "requires": { "ms": "2.0.0" } @@ -60524,8 +59965,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60554,78 +59994,78 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-freebsd-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-arm64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-arm64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-x64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-x64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-win32-arm64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-win32-x64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lilconfig": { "version": "2.1.0", @@ -60712,8 +60152,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "peer": true + "dev": true }, "lodash.uniq": { "version": "4.5.0", @@ -60725,7 +60164,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, - "peer": true, "requires": { "chalk": "^2.0.1" }, @@ -60735,7 +60173,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -60745,7 +60182,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -60757,7 +60193,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -60766,29 +60201,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -60878,6 +60309,7 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, + "peer": true, "requires": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -60903,7 +60335,6 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "peer": true, "requires": { "tmpl": "1.0.5" } @@ -60941,8 +60372,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true, - "peer": true + "dev": true }, "math-intrinsics": { "version": "1.1.0", @@ -61231,8 +60661,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true, - "peer": true + "dev": true }, "merge-anything": { "version": "5.1.7", @@ -61268,7 +60697,6 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -61316,22 +60744,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "peer": true, "requires": { "mime-db": "1.52.0" } @@ -61340,15 +60765,13 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -61358,7 +60781,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -61371,7 +60793,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, - "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -61384,7 +60805,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -61394,7 +60814,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, - "peer": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -61411,7 +60830,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -61421,7 +60839,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, - "peer": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -61434,7 +60851,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, - "peer": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -61445,7 +60861,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -61456,7 +60871,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "peer": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -61466,8 +60880,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -61476,7 +60889,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -61488,7 +60900,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, - "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -61506,7 +60917,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -61517,7 +60927,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -61527,7 +60936,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -61538,7 +60946,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -61556,8 +60963,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -61566,7 +60972,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -61580,8 +60985,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -61590,7 +60994,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61605,7 +61008,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -62240,7 +61642,8 @@ "version": "15.10.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true + "dev": true, + "peer": true }, "graphql-subscriptions": { "version": "1.2.1", @@ -62283,7 +61686,8 @@ "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "peer": true }, "mri": { "version": "1.2.0", @@ -62314,6 +61718,7 @@ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, + "peer": true, "requires": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -62394,8 +61799,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true, - "peer": true + "dev": true }, "netmask": { "version": "2.0.2", @@ -62486,8 +61890,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "peer": true + "dev": true }, "node-releases": { "version": "2.0.27", @@ -62517,7 +61920,6 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, - "peer": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -62530,7 +61932,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "peer": true, "requires": { "lru-cache": "^10.0.1" } @@ -62539,8 +61940,7 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -62601,8 +62001,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "peer": true + "dev": true }, "nwsapi": { "version": "2.2.22", @@ -62628,7 +62027,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -62748,7 +62146,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, - "peer": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -62762,15 +62159,13 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -62780,7 +62175,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -62792,7 +62186,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -62801,29 +62194,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -62833,7 +62222,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -62926,6 +62314,7 @@ "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.14.2.tgz", "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, + "peer": true, "requires": { "@oxlint-tsgolint/darwin-arm64": "0.14.2", "@oxlint-tsgolint/darwin-x64": "0.14.2", @@ -62950,7 +62339,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -63024,8 +62412,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true + "dev": true }, "pac-proxy-agent": { "version": "7.2.0", @@ -63162,7 +62549,6 @@ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, - "peer": true, "requires": { "pngjs": "^3.3.0" } @@ -63215,8 +62601,7 @@ "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, - "peer": true + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -63283,6 +62668,7 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -63445,6 +62831,7 @@ "version": "1.53.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", + "peer": true, "requires": { "fsevents": "2.3.2", "playwright-core": "1.53.2" @@ -63460,7 +62847,6 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, - "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -63471,8 +62857,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true, - "peer": true + "dev": true }, "portfinder": { "version": "1.0.38", @@ -63493,6 +62878,7 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -64120,6 +63506,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -64217,8 +63604,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "peer": true + "dev": true }, "pretty-error": { "version": "4.0.0", @@ -64275,6 +63661,7 @@ "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", "dev": true, + "peer": true, "requires": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -64293,8 +63680,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "peer": true + "dev": true }, "process": { "version": "0.11.10", @@ -64328,15 +63714,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "peer": true + "dev": true }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, - "peer": true, "requires": { "asap": "~2.0.6" } @@ -64506,8 +63890,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true, - "peer": true + "dev": true }, "qs": { "version": "6.14.0", @@ -64522,7 +63905,6 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, - "peer": true, "requires": { "inherits": "~2.0.3" } @@ -64622,6 +64004,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -64631,7 +64014,6 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, - "peer": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -64642,7 +64024,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -64651,6 +64032,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -64699,6 +64081,7 @@ "version": "npm:@docusaurus/react-loadable@6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "peer": true, "requires": { "@types/react": "*" } @@ -64745,6 +64128,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "peer": true, "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -65247,7 +64631,6 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -65319,7 +64702,6 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, - "peer": true, "requires": { "node-forge": "^1.3.3" } @@ -65329,7 +64711,6 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, - "peer": true, "requires": { "chalk": "^4.1.2" } @@ -65339,7 +64720,6 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -65359,7 +64739,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, - "peer": true, "requires": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -65382,7 +64761,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -65412,7 +64790,6 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -65431,7 +64808,6 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, - "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -65445,15 +64821,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true, - "peer": true + "dev": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -65464,7 +64838,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -65518,7 +64891,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -65534,7 +64906,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -65545,7 +64916,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -65560,7 +64930,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65572,7 +64941,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, - "peer": true, "requires": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -65587,15 +64955,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true, - "peer": true + "dev": true }, "@react-native/dev-middleware": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -65616,7 +64982,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -65625,15 +64990,13 @@ "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true, - "peer": true + "dev": true }, "@react-native/debugger-shell": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -65644,7 +65007,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -65664,7 +65026,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -65675,29 +65036,25 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true, - "peer": true + "dev": true }, "@react-native/js-polyfills": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true, - "peer": true + "dev": true }, "@react-native/normalize-colors": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true, - "peer": true + "dev": true }, "@react-native/virtualized-lists": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -65707,22 +65064,19 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "babel-preset-expo": { "version": "54.0.10", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, - "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -65753,7 +65107,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -65762,15 +65115,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true + "dev": true }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true + "dev": true }, "expo": { "version": "54.0.32", @@ -65807,7 +65158,6 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, - "peer": true, "requires": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -65818,7 +65168,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -65829,7 +65178,6 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, - "peer": true, "requires": {} }, "expo-font": { @@ -65847,7 +65195,6 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, - "peer": true, "requires": {} }, "expo-modules-autolinking": { @@ -65855,7 +65202,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -65869,7 +65215,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4" } @@ -65888,7 +65233,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -65900,7 +65244,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -65911,29 +65254,25 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true, - "peer": true + "dev": true }, "hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true + "dev": true }, "lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -65981,15 +65320,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": true }, "hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65999,7 +65336,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -66009,7 +65345,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -66022,7 +65357,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -66034,7 +65368,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, - "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -66047,7 +65380,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -66057,7 +65389,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, - "peer": true, "requires": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -66074,7 +65405,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -66086,7 +65416,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, - "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -66104,7 +65433,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -66115,7 +65443,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -66125,7 +65452,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -66136,7 +65462,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -66155,7 +65480,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -66170,7 +65494,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -66185,7 +65508,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -66206,15 +65528,13 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "peer": true, "requires": { "mime-db": "1.52.0" } @@ -66224,7 +65544,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -66234,7 +65553,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "peer": true, "requires": { "minipass": "^7.1.2" } @@ -66244,7 +65562,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -66254,7 +65571,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -66265,7 +65581,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -66275,15 +65590,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true + "dev": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -66295,7 +65608,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -66313,8 +65625,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true }, "react-native": { "version": "0.83.1", @@ -66365,7 +65676,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -66380,15 +65690,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -66398,7 +65706,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -66408,15 +65715,13 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true + "dev": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -66431,7 +65736,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -66441,7 +65745,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -66451,7 +65754,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -66460,29 +65762,25 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true + "dev": true }, "scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, - "peer": true + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true }, "tar": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, - "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -66501,15 +65799,13 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true, - "peer": true + "dev": true }, "yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -66578,7 +65874,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "peer": true }, "typescript": { "version": "5.9.3", @@ -66631,7 +65928,6 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, - "peer": true, "requires": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -66643,7 +65939,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, - "peer": true, "requires": { "path-parse": "^1.0.5" } @@ -66680,7 +65975,6 @@ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, - "peer": true, "requires": { "global-dirs": "^0.1.1" }, @@ -66690,7 +65984,6 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, - "peer": true, "requires": { "ini": "^1.3.4" } @@ -66711,15 +66004,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true, - "peer": true + "dev": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "peer": true + "dev": true }, "responselike": { "version": "3.0.0", @@ -66734,7 +66025,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, - "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -66744,15 +66034,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "peer": true + "dev": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, - "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -66806,6 +66094,7 @@ "version": "4.46.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "peer": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", @@ -66936,6 +66225,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -67070,8 +66360,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true, - "peer": true + "dev": true }, "serialize-javascript": { "version": "6.0.2", @@ -67085,7 +66374,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true + "dev": true, + "peer": true }, "seroval-plugins": { "version": "1.1.1", @@ -67383,7 +66673,6 @@ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, - "peer": true, "requires": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -67451,8 +66740,7 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true, - "peer": true + "dev": true }, "smart-buffer": { "version": "4.2.0", @@ -67516,6 +66804,7 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, + "peer": true, "requires": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -67678,7 +66967,6 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "peer": true, "requires": { "escape-string-regexp": "^2.0.0" }, @@ -67687,8 +66975,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "peer": true + "dev": true } } }, @@ -67702,15 +66989,13 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "peer": true + "dev": true }, "stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, - "peer": true, "requires": { "type-fest": "^0.7.1" }, @@ -67719,8 +67004,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -67743,8 +67027,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "peer": true + "dev": true }, "stream-shift": { "version": "1.0.3", @@ -67863,8 +67146,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true, - "peer": true + "dev": true }, "style-to-js": { "version": "1.1.21", @@ -67927,7 +67209,6 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, - "peer": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -68004,6 +67285,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, + "peer": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -68112,15 +67394,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "peer": true + "dev": true }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, - "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -68130,6 +67410,7 @@ "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -68277,8 +67558,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "peer": true + "dev": true }, "throttleit": { "version": "2.1.0", @@ -68338,7 +67618,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "peer": true } } }, @@ -68378,8 +67659,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "peer": true + "dev": true }, "to-regex-range": { "version": "5.0.1", @@ -68482,12 +67762,14 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "peer": true }, "tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "peer": true, "requires": { "esbuild": "~0.27.0", "fsevents": "~2.3.3", @@ -68782,8 +68064,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true + "dev": true }, "type-fest": { "version": "4.41.0", @@ -68874,6 +68155,7 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, + "peer": true, "requires": {} }, "typescript": { @@ -69283,8 +68565,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "peer": true + "dev": true }, "value-equal": { "version": "1.0.1", @@ -69350,6 +68631,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fsevents": "~2.3.3", @@ -69444,8 +68726,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "peer": true + "dev": true }, "w3c-xmlserializer": { "version": "5.0.0", @@ -69461,7 +68742,6 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "peer": true, "requires": { "makeerror": "1.0.12" } @@ -69488,7 +68768,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "peer": true, "requires": { "defaults": "^1.0.3" } @@ -69502,6 +68781,7 @@ "version": "5.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -69765,8 +69045,7 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true, - "peer": true + "dev": true }, "whatwg-mimetype": { "version": "4.0.0", @@ -69788,7 +69067,6 @@ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, - "peer": true, "requires": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -69799,8 +69077,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -69891,8 +69168,7 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true, - "peer": true + "dev": true }, "wordwrapjs": { "version": "5.1.0", @@ -69950,6 +69226,7 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "peer": true, "requires": {} }, "wsl-utils": { @@ -69980,7 +69257,6 @@ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, - "peer": true, "requires": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -69990,8 +69266,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -70019,7 +69294,6 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, - "peer": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -70029,8 +69303,7 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -70038,8 +69311,7 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "peer": true + "dev": true }, "xmlchars": { "version": "2.2.0", @@ -70096,8 +69368,7 @@ "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, - "peer": true + "dev": true }, "z2s": { "version": "file:packages/z2s", @@ -70221,7 +69492,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true }, "typescript": { "version": "5.9.3", @@ -70234,6 +69506,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -70291,7 +69564,7 @@ "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", "@rocicorp/resolver": "^1.0.2", - "@rocicorp/zero-events": "0.0.3", + "@rocicorp/zero-events": "0.0.4", "@rocicorp/zero-sqlite3": "^1.0.15", "@testcontainers/postgresql": "^10.9.0", "@types/basic-auth": "^1.1.8", @@ -70413,7 +69686,6 @@ "shared": "0.0.0", "zero-client": "0.0.0", "zero-schema": "0.0.0", - "zero-types": "0.0.0", "zql": "0.0.0" } }, @@ -70529,7 +69801,6 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, - "peer": true, "requires": {} }, "zql": { @@ -70650,7 +69921,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true }, "typescript": { "version": "5.9.3", diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index f1829de17f..5ab7dae83e 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -71,7 +71,7 @@ "zqlite": "0.0.0" }, "devDependencies": { - "@rocicorp/zero-events": "0.0.3", + "@rocicorp/zero-events": "0.0.4", "@testcontainers/postgresql": "^10.9.0", "@types/node": "^22.10.5", "@types/pg-format": "^1.0.5", diff --git a/packages/zero-events/package.json b/packages/zero-events/package.json index 5a277cc0be..728f5ea540 100644 --- a/packages/zero-events/package.json +++ b/packages/zero-events/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero-events", - "version": "0.0.3", + "version": "0.0.4", "author": "Rocicorp, LLC.", "repository": { "type": "git", From 05c7463f1b4e6b35de7d65721abebdba97bbbd36 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Mon, 2 Mar 2026 22:40:23 -1000 Subject: [PATCH 121/495] Bump version to 0.26.1 --- apps/zbugs/package.json | 2 +- package-lock.json | 6 +++--- packages/zero/package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 11a76ceb58..f773d8bd5c 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -44,7 +44,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.0", + "@rocicorp/zero": "0.26.1", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", diff --git a/package-lock.json b/package-lock.json index f26effe5f9..9410e376b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.0", + "@rocicorp/zero": "0.26.1", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", @@ -40825,7 +40825,7 @@ }, "packages/zero": { "name": "@rocicorp/zero", - "version": "0.26.0", + "version": "0.26.1", "license": "Apache-2.0", "dependencies": { "@badrap/valita": "0.3.11", @@ -69400,7 +69400,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.0", + "@rocicorp/zero": "0.26.1", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tailwindcss/forms": "^0.5.0", diff --git a/packages/zero/package.json b/packages/zero/package.json index 148ef8dfc2..a772dc210a 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero", - "version": "0.26.0", + "version": "0.26.1", "description": "Zero is a web framework for serverless web development.", "author": "Rocicorp, Inc.", "repository": { From 6542e8f7683baf04775e105defc0d9b618149a40 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 3 Mar 2026 11:44:31 -0800 Subject: [PATCH 122/495] fix(zero-cache): detect tables moved out of the published schema (#5635) Fixes ddl event logic to detect when a table is removed from the published schema, e.g. ```sql ALTER TABLE foo SET SCHEMA not_published; ``` The previous logic incorrectly ignored such events because the table was not part of the publication; it did not account for the possibility that the table was previously part of the publication (i.e. prior to the ddl command). The fix is to handle ALTER TABLE statements in the same manner as DROP statements, i.e. by generating ddl updates and letting the zero-cache filter based on the diff. --- .../pg/change-source.end-to-mid.pg.test.ts | 20 ++++++++++ .../change-source/pg/schema/ddl.pg.test.ts | 37 ++++++++----------- .../services/change-source/pg/schema/ddl.ts | 7 +++- .../change-source/pg/schema/init.pg.test.ts | 4 +- .../services/change-source/pg/schema/init.ts | 21 +++++++---- 5 files changed, 57 insertions(+), 32 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index 1f032955db..bbb2af349b 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -64,6 +64,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ); CREATE SCHEMA IF NOT EXISTS my; + CREATE SCHEMA IF NOT EXISTS private; CREATE UNIQUE INDEX foo_key ON foo (id); CREATE PUBLICATION zero_some_public FOR TABLE foo (id, int); @@ -1240,6 +1241,25 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [], [], ], + [ + 'remove table from published schema', + `ALTER TABLE your.bar SET SCHEMA private`, + [ + [ + { + tag: 'drop-index', + id: {schema: 'your', name: 'bar_pkey'}, + }, + { + tag: 'drop-table', + id: {schema: 'your', name: 'bar'}, + }, + ], + ], + {}, + [], + [], + ], [ 'data types', ` diff --git a/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts index 5416fc0fec..be0cdc9579 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts @@ -90,7 +90,6 @@ describe('change-source/tables/ddl', () => { CREATE TABLE pub.yoo(id TEXT PRIMARY KEY, name TEXT UNIQUE, description TEXT); CREATE TABLE private.foo(id TEXT PRIMARY KEY, name TEXT UNIQUE, description TEXT); - CREATE TABLE private.yoo(id TEXT PRIMARY KEY, name TEXT UNIQUE, description TEXT); CREATE INDEX foo_custom_index ON pub.foo (description, name); CREATE INDEX yoo_custom_index ON pub.yoo (description, name); @@ -505,6 +504,22 @@ describe('change-source/tables/ddl', () => { }, }, ], + [ + 'remove table from published schema', + `ALTER TABLE pub.yoo SET SCHEMA private`, + { + context: { + query: 'ALTER TABLE pub.yoo SET SCHEMA private', + }, + type: 'ddlUpdate', + version: 1, + event: {tag: 'ALTER TABLE'}, + schema: { + tables: dropped(DDL_START.schema.tables, 2, 1), + indexes: dropped(DDL_START.schema.indexes, 5, 3), + }, + }, + ], [ 'add column that results in a new index', `ALTER TABLE pub.foo ADD username TEXT UNIQUE`, @@ -1337,30 +1352,10 @@ describe('change-source/tables/ddl', () => { 'CREATE INDEX foo_name_index on private.foo (name desc, id)', [/ignoring CREATE INDEX .*private.foo_name_index/], ], - [ - 'ALTER TABLE private.foo RENAME TO food', - [/ignoring ALTER TABLE .*private.food/], - ], - [ - 'ALTER TABLE private.foo ADD username TEXT UNIQUE', - [/ignoring ALTER TABLE .*private.foo/], - ], - [ - `ALTER TABLE private.foo ADD bar text DEFAULT 'boo'`, - [/ignoring ALTER TABLE .*private.foo/], - ], - [ - `ALTER TABLE private.foo ALTER name SET DEFAULT 'alice'`, - [/ignoring ALTER TABLE .*private.foo/], - ], [ `ALTER TABLE private.foo RENAME name to handle`, [/ignoring ALTER TABLE .*private.foo.handle/], ], - [ - `ALTER TABLE private.foo drop description`, - [/ignoring ALTER TABLE .*private.foo/], - ], [ `ALTER PUBLICATION nonzeropub ADD TABLE pub.yoo`, [/ignoring ALTER PUBLICATION .*pub.yoo in publication nonzeropub/], diff --git a/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts b/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts index ee75b75a5f..dbf4336f67 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts @@ -171,7 +171,12 @@ BEGIN -- Filter DDL updates that are not relevant to the shard (i.e. publications) when possible. - IF target.object_type = 'table' OR target.object_type = 'table column' THEN + -- Note: ALTER TABLE statements may *remove* the table from the set of published + -- tables, and there is no way to determine if the table "used to be" in the + -- set. Thus, all ALTER TABLE statements must produce a ddl update, similar to + -- any DROP * statement. + IF (target.object_type = 'table' AND tag != 'ALTER TABLE') + OR target.object_type = 'table column' THEN SELECT ns.nspname AS "schema", c.relname AS "name" FROM pg_class AS c JOIN pg_namespace AS ns ON c.relnamespace = ns.oid JOIN pg_publication_tables AS pb ON pb.schemaname = ns.nspname AND pb.tablename = c.relname diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts index f10b36f8d1..d777c34a29 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts @@ -21,8 +21,8 @@ const SHARD_NUM = 23; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 15, - schemaVersion: 15, + dataVersion: 16, + schemaVersion: 16, minSafeVersion: 1, lock: 'v', } as const; diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.ts index 80ff744838..a9ab8b2466 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.ts @@ -223,14 +223,8 @@ function getIncrementalMigrations( }, // Upgrade DDL trigger to log more info to PG logs. - 14: { - migrateSchema: async (lc, sql) => { - const [{publications}] = await sql<{publications: string[]}[]>` - SELECT publications FROM ${sql(shardConfigTable)}`; - await setupTriggers(lc, sql, {...shard, publications}); - lc.info?.(`Upgraded DDL event triggers`); - }, - }, + // (subsumed by v16) + 14: {}, // Add initialSyncContext column to replicas table. 15: { @@ -242,6 +236,17 @@ function getIncrementalMigrations( `; }, }, + + // Upgrade DDL trigger to fire on all ALTER TABLE statements + // to catch the *removal* of a table from the published set. + 16: { + migrateSchema: async (lc, sql) => { + const [{publications}] = await sql<{publications: string[]}[]>` + SELECT publications FROM ${sql(shardConfigTable)}`; + await setupTriggers(lc, sql, {...shard, publications}); + lc.info?.(`Upgraded DDL event triggers`); + }, + }, }; } From ab690f27afb945616a5b1572707b0ef89f90d222 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Tue, 3 Mar 2026 15:20:03 -0500 Subject: [PATCH 123/495] fix(analyze-query): process scalar subqueries in analyze-query (#5614) Analyzing a query would crash terabugs because it was not converting `exists` to scalar subqueries. CleanShot 2026-02-25 at 10 32 37@2x --- packages/zero-cache/src/services/run-ast.ts | 39 +++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/zero-cache/src/services/run-ast.ts b/packages/zero-cache/src/services/run-ast.ts index b9f0b63fc6..890b5659fc 100644 --- a/packages/zero-cache/src/services/run-ast.ts +++ b/packages/zero-cache/src/services/run-ast.ts @@ -7,7 +7,7 @@ import {assert} from '../../../shared/src/asserts.ts'; import {must} from '../../../shared/src/must.ts'; import {sleep} from '../../../shared/src/sleep.ts'; import type {AnalyzeQueryResult} from '../../../zero-protocol/src/analyze-query-result.ts'; -import type {AST} from '../../../zero-protocol/src/ast.ts'; +import type {AST, LiteralValue} from '../../../zero-protocol/src/ast.ts'; import {mapAST} from '../../../zero-protocol/src/ast.ts'; import type {ClientSchema} from '../../../zero-protocol/src/client-schema.ts'; import type {Row} from '../../../zero-protocol/src/data.ts'; @@ -18,9 +18,12 @@ import { buildPipeline, type BuilderDelegate, } from '../../../zql/src/builder/builder.ts'; +import type {Node} from '../../../zql/src/ivm/data.ts'; +import {skipYields} from '../../../zql/src/ivm/operator.ts'; import type {ConnectionCostModel} from '../../../zql/src/planner/planner-connection.ts'; import type {PlanDebugger} from '../../../zql/src/planner/planner-debug.ts'; import type {Database} from '../../../zqlite/src/db.ts'; +import {resolveSimpleScalarSubqueries} from '../../../zqlite/src/resolve-scalar-subqueries.ts'; import type {JWTAuth} from '../auth/auth.ts'; import {transformAndHashQuery} from '../auth/read-authorizer.ts'; import type {LiteAndZqlSpec} from '../db/specs.ts'; @@ -84,8 +87,34 @@ export async function runAst( result.afterPermissions = await formatOutput(ast.table + astToZQL(ast)); } - const pipeline = buildPipeline( + // Resolve scalar subqueries (e.g. whereExists with {scalar: true}) to + // literal equality conditions so that SQLite can use indexes effectively. + // Without this, correlated subqueries get stripped from SQL filters and + // queries on large tables fall back to full table scans. + const executor = ( + subqueryAST: AST, + childField: string, + ): LiteralValue | null | undefined => { + const input = buildPipeline(subqueryAST, host, 'scalar-subquery'); + // Consume the full stream rather than using first() to avoid + // triggering early return on Take's #initialFetch assertion. + // The subquery AST already has limit: 1, so at most one row is produced. + let node: Node | undefined; + for (const n of skipYields(input.fetch({}))) { + node ??= n; + } + input.destroy(); + return node ? ((node.row[childField] as LiteralValue) ?? null) : undefined; + }; + + const {ast: resolvedAst} = resolveSimpleScalarSubqueries( ast, + options.tableSpecs, + executor, + ); + + const pipeline = buildPipeline( + resolvedAst, host, 'query-id', options.costModel, @@ -98,7 +127,11 @@ export async function runAst( let syncedRowCount = 0; const rowsByTable: Record = {}; const seenByTable: Set = new Set(); - for (const rowChange of hydrate(pipeline, hashOfAST(ast), clientSchema)) { + for (const rowChange of hydrate( + pipeline, + hashOfAST(resolvedAst), + clientSchema, + )) { if (rowChange === 'yield') { await yieldProcess(); continue; From 42a32f65f0042d60b76e8a0632285fa4f9ba7ccb Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Tue, 3 Mar 2026 15:19:25 -0500 Subject: [PATCH 124/495] chore: make `reason` required to `assert` (#5627) To prevent any untrackable asserts in the future. Related to user report from #5621 --- apps/zbugs/api/index.ts | 5 +- apps/zbugs/src/emoji-utils.ts | 4 +- apps/zbugs/src/pages/issue/issue-page.tsx | 2 +- packages/analyze-query/src/run-ast.ts | 5 +- .../src/benchmarks/replicache.ts | 19 ++++- packages/replicache-perf/src/runner.ts | 5 +- packages/replicache/src/btree/node.test.ts | 2 +- packages/replicache/src/btree/node.ts | 8 +- packages/replicache/src/btree/write.ts | 4 +- packages/replicache/src/dag/gc.ts | 7 +- .../replicache/src/dag/store-impl.test.ts | 9 ++- packages/replicache/src/dag/visitor.test.ts | 2 +- packages/replicache/src/db/commit.test.ts | 15 +++- packages/replicache/src/db/rebase.test.ts | 2 +- packages/replicache/src/db/test-helpers.ts | 24 ++++-- packages/replicache/src/db/write.ts | 27 +++++-- packages/replicache/src/error-responses.ts | 5 +- .../kv/idb-store-with-mem-fallback.test.ts | 2 +- packages/replicache/src/kv/idb-store.test.ts | 5 +- .../src/mutation-recovery-test-helper.ts | 2 +- packages/replicache/src/mutation-recovery.ts | 26 +++++-- .../src/persist/clients-test-helpers.ts | 2 +- .../replicache/src/persist/clients.test.ts | 6 +- packages/replicache/src/persist/clients.ts | 5 +- .../src/persist/collect-idb-databases.ts | 2 + .../persist/gather-mem-only-visitor.test.ts | 15 +++- .../replicache/src/persist/heartbeat.test.ts | 5 +- .../src/persist/idb-databases-store.ts | 5 +- .../replicache/src/persist/persist.test.ts | 5 +- .../replicache/src/persist/refresh.test.ts | 12 +-- packages/replicache/src/process-scheduler.ts | 5 +- packages/replicache/src/replicache-impl.ts | 4 +- .../replicache-mutation-recovery-dd31.test.ts | 62 ++++++++-------- .../replicache/src/replicache-persist.test.ts | 2 +- .../replicache/src/replicache-types.test.ts | 4 +- packages/replicache/src/replicache.test.ts | 2 +- packages/replicache/src/subscriptions.ts | 7 +- packages/replicache/src/sync/diff.ts | 5 +- packages/replicache/src/sync/patch.test.ts | 5 +- packages/replicache/src/sync/pull.test.ts | 25 +++++-- packages/replicache/src/sync/pull.ts | 5 +- packages/replicache/src/sync/push.ts | 7 +- packages/replicache/src/sync/test-helpers.ts | 5 +- packages/replicache/src/worker-test.ts | 23 ++++-- packages/shared/src/asserts.ts | 5 +- packages/shared/src/json-schema.test.ts | 4 +- packages/shared/src/promise-race.test.ts | 5 +- packages/shared/src/valita.test.ts | 2 +- packages/z2s/src/compiler.ts | 10 ++- packages/zero-cache/src/auth/auth.test.ts | 10 +-- .../src/integration/integration.pg.test.ts | 7 +- .../src/services/replicator/test-utils.ts | 2 +- .../src/services/view-syncer/cvr.ts | 10 ++- .../view-syncer-inspect.pg.test.ts | 15 +++- .../zero-cache/src/types/subscription.test.ts | 5 +- .../src/client/connection-manager.test.ts | 15 +++- .../zero-client/src/client/context.test.ts | 5 +- .../zero-client/src/client/custom.test.ts | 74 +++++++++++++++---- .../zero-client/src/client/http-string.ts | 4 +- .../src/client/inspector/inspector.test.ts | 10 ++- .../src/client/mutation-tracker.test.ts | 20 ++++- .../src/client/mutator-proxy.test.ts | 10 ++- packages/zero-client/src/client/test-utils.ts | 27 ++++--- .../zero-client/src/client/worker-test.ts | 17 ++++- packages/zero-client/src/client/zero.test.ts | 28 +++++-- packages/zero-client/src/client/zero.ts | 2 +- packages/zero-schema/src/permissions.ts | 5 +- .../src/queries/process-queries.test.ts | 40 ++++++++-- packages/zero-solid/src/use-query.test.tsx | 2 +- packages/zero/tool/build.ts | 2 +- packages/zql/src/builder/filter.ts | 7 +- .../zql/src/builder/test-builder-delegate.ts | 5 +- packages/zql/src/ivm/constraint.ts | 2 +- .../zql/src/ivm/flipped-join.fetch.test.ts | 7 +- .../zql/src/ivm/flipped-join.sibling.test.ts | 7 +- packages/zql/src/ivm/join.fetch.test.ts | 7 +- packages/zql/src/ivm/join.sibling.test.ts | 7 +- packages/zql/src/ivm/take.fetch.test.ts | 10 ++- packages/zql/src/query/expression.test.ts | 41 ++++++++-- packages/zql/src/query/query-registry.test.ts | 4 +- packages/zql/src/query/test/query-delegate.ts | 4 +- packages/zqlite/src/table-source.test.ts | 2 +- 82 files changed, 596 insertions(+), 241 deletions(-) diff --git a/apps/zbugs/api/index.ts b/apps/zbugs/api/index.ts index 675643f811..825cc1d921 100644 --- a/apps/zbugs/api/index.ts +++ b/apps/zbugs/api/index.ts @@ -307,7 +307,10 @@ async function maybeVerifyAuth( return undefined; } - assert(authorization.toLowerCase().startsWith('bearer ')); + assert( + authorization.toLowerCase().startsWith('bearer '), + 'Expected Authorization header to start with "Bearer "', + ); authorization = authorization.substring('Bearer '.length); const jwk = process.env.VITE_PUBLIC_JWK; diff --git a/apps/zbugs/src/emoji-utils.ts b/apps/zbugs/src/emoji-utils.ts index bbe7d1cb32..346c673856 100644 --- a/apps/zbugs/src/emoji-utils.ts +++ b/apps/zbugs/src/emoji-utils.ts @@ -9,12 +9,12 @@ export function formatEmojiCreatorList( emojis: Emoji[], currentUserID: string, ): string { - assert(emojis.length > 0); + assert(emojis.length > 0, 'Expected at least one emoji'); const names = emojis .filter(emoji => emoji.creator !== undefined) .map(emoji => { const {creator} = emoji; - assert(creator); + assert(creator, 'Expected emoji creator to be defined'); if (emoji.creatorID === currentUserID) { return 'you'; } diff --git a/apps/zbugs/src/pages/issue/issue-page.tsx b/apps/zbugs/src/pages/issue/issue-page.tsx index 3c43b4e23a..8574a8779a 100644 --- a/apps/zbugs/src/pages/issue/issue-page.tsx +++ b/apps/zbugs/src/pages/issue/issue-page.tsx @@ -790,7 +790,7 @@ function maybeShowToastForEmoji( ) { const toastID = emoji.id; const {creator} = emoji; - assert(creator); + assert(creator, 'Expected emoji creator to be defined'); // We ony show toasts for emojis in the issue itself. Not for emojis in comments. if (emoji.subjectID !== issue.id || !emojiElement) { diff --git a/packages/analyze-query/src/run-ast.ts b/packages/analyze-query/src/run-ast.ts index 157e360b06..377d5e034d 100644 --- a/packages/analyze-query/src/run-ast.ts +++ b/packages/analyze-query/src/run-ast.ts @@ -93,7 +93,10 @@ export async function runAst( if (rowChange === 'yield') { continue; } - assert(rowChange.type === 'add'); + assert( + rowChange.type === 'add', + () => `Expected rowChange type 'add', got '${rowChange.type}'`, + ); let rows: Row[] = rowsByTable[rowChange.table]; const s = rowChange.table + '.' + JSON.stringify(rowChange.row); diff --git a/packages/replicache-perf/src/benchmarks/replicache.ts b/packages/replicache-perf/src/benchmarks/replicache.ts index c7e31ca77b..f6312c51ec 100644 --- a/packages/replicache-perf/src/benchmarks/replicache.ts +++ b/packages/replicache-perf/src/benchmarks/replicache.ts @@ -140,7 +140,10 @@ export function benchmarkRefresh(opts: { numMutationsRebased: number; indexes?: number; }): Benchmark { - assert(opts.numKeysPerMutation < opts.numKeysPersisted); + assert( + opts.numKeysPerMutation < opts.numKeysPersisted, + 'Expected numKeysPerMutation to be less than numKeysPersisted', + ); const repName = makeRepName(); const repsToClose: ReplicacheImpl[] = []; return { @@ -687,9 +690,17 @@ export function benchmarkWriteSubRead(opts: { subs.forEach(c => c()); - assert(onDataCallCount === numSubsTotal + numSubsDirty); + assert( + onDataCallCount === numSubsTotal + numSubsDirty, + () => + `Expected onDataCallCount (${onDataCallCount}) to equal numSubsTotal + numSubsDirty (${numSubsTotal + numSubsDirty})`, + ); for (const [changeKey, changeValue] of Object.entries(changes)) { - assert(deepEqual(changeValue, dataFromSubscribe[changeKey])); + assert( + deepEqual(changeValue, dataFromSubscribe[changeKey]), + () => + `Expected subscription data for key '${changeKey}' to match the change value`, + ); } }, }; @@ -720,7 +731,7 @@ function benchmarkTmcw(kind: 'populate' | 'persist'): Benchmark { }, })); - assert(updates); + assert(updates, 'Expected updates to be defined'); // Wait for init. await rep.clientGroupID; diff --git a/packages/replicache-perf/src/runner.ts b/packages/replicache-perf/src/runner.ts index e3340ce8cf..0382bf9c9d 100644 --- a/packages/replicache-perf/src/runner.ts +++ b/packages/replicache-perf/src/runner.ts @@ -192,7 +192,10 @@ async function main() { logLine('', options); } first = false; - assert(browser !== 'all'); + assert( + browser !== 'all', + () => `Expected a specific browser, got '${browser}'`, + ); const context = await playwright[browser].launchPersistentContext(userDataDir); diff --git a/packages/replicache/src/btree/node.test.ts b/packages/replicache/src/btree/node.test.ts index 76208df303..c36dd6e09e 100644 --- a/packages/replicache/src/btree/node.test.ts +++ b/packages/replicache/src/btree/node.test.ts @@ -114,7 +114,7 @@ describe('btree node', () => { if (node[NODE_LEVEL] === 0) { for (const [k, v] of node[NODE_ENTRIES]) { if (lastKey !== undefined) { - assert(lastKey < k); + assert(lastKey < k, () => `Expected lastKey ${lastKey} < key ${k}`); lastKey = k; } rv[k] = v; diff --git a/packages/replicache/src/btree/node.ts b/packages/replicache/src/btree/node.ts index aee0504d37..144cee5657 100644 --- a/packages/replicache/src/btree/node.ts +++ b/packages/replicache/src/btree/node.ts @@ -186,7 +186,7 @@ export function parseBTreeNode( assertArray(v); assertDeepFrozen(v); // Be relaxed about what we accept. - assert(v.length >= 2); + assert(v.length >= 2, 'Expected node array to have at least 2 elements'); const [level, entries] = v; assertNumber(level); assertArray(entries); @@ -213,7 +213,7 @@ function assertEntry( ): asserts entry is Entry { assertArray(entry); // Be relaxed about what we accept. - assert(entry.length >= 3); + assert(entry.length >= 3, 'Expected entry array to have at least 3 elements'); assertString(entry[0]); f(entry[1]); assertNumber(entry[2]); @@ -231,7 +231,7 @@ function convertNonV7Entry( getSizeOfEntry: (key: K, value: V) => number, ): Entry { assertArray(entry); - assert(entry.length >= 2); + assert(entry.length >= 2, 'Expected entry array to have at least 2 elements'); assertString(entry[0]); f(entry[1]); const entrySize = getSizeOfEntry(entry[0], entry[1]); @@ -604,7 +604,7 @@ export class InternalNodeImpl extends NodeImpl { return new InternalNodeImpl(entries, newRandomHash(), level - 1, true); } - assert(level === 1); + assert(level === 1, 'Expected level to be 1'); const entries: Entry[] = []; for (const child of output as DataNodeImpl[]) { entries.push(...child.entries); diff --git a/packages/replicache/src/btree/write.ts b/packages/replicache/src/btree/write.ts index dcfe2e00e5..4ca0fa9e6d 100644 --- a/packages/replicache/src/btree/write.ts +++ b/packages/replicache/src/btree/write.ts @@ -64,13 +64,13 @@ export class BTreeWrite extends BTreeRead { } #addToModified(node: DataNodeImpl | InternalNodeImpl): void { - assert(node.isMutable); + assert(node.isMutable, 'Expected node to be mutable'); this.#modified.set(node.hash, node); this._cache.set(node.hash, node); } updateNode(node: DataNodeImpl | InternalNodeImpl): void { - assert(node.isMutable); + assert(node.isMutable, 'Expected node to be mutable'); this.#modified.delete(node.hash); node.hash = newRandomHash(); this.#addToModified(node); diff --git a/packages/replicache/src/dag/gc.ts b/packages/replicache/src/dag/gc.ts index ecef730035..39a367d32c 100644 --- a/packages/replicache/src/dag/gc.ts +++ b/packages/replicache/src/dag/gc.ts @@ -103,8 +103,11 @@ class RefCountUpdates { ); if (this.#isLazyDelegate) { - assert(this.#delegate.areRefsCounted); - assert(this.#refsCounted); + assert( + this.#delegate.areRefsCounted, + 'Expected delegate.areRefsCounted to be defined', + ); + assert(this.#refsCounted, 'Expected refsCounted to be defined'); let refCountsUpdated; do { refCountsUpdated = false; diff --git a/packages/replicache/src/dag/store-impl.test.ts b/packages/replicache/src/dag/store-impl.test.ts index da5a5a8286..a679cc864e 100644 --- a/packages/replicache/src/dag/store-impl.test.ts +++ b/packages/replicache/src/dag/store-impl.test.ts @@ -344,9 +344,9 @@ describe('write', () => { await withRead(store, async dagRead => { const h = await dagRead.getHead('test'); - assert(h); + assert(h, 'Expected head "test" to be defined'); const c = await dagRead.getChunk(h); - assert(c); + assert(c, 'Expected chunk for head hash to be defined'); expect(c.hash).toBe(h); expect(c.data).toEqual(data); }); @@ -358,7 +358,10 @@ describe('write', () => { const hasher = () => (counter++).toString().padStart(32, 'testhash') as unknown as Hash; const testHash = (hash: Hash) => { - assert(hash.toString().startsWith(prefix)); + assert( + hash.toString().startsWith(prefix), + () => `Expected hash to start with '${prefix}', got '${hash}'`, + ); }; await t(hasher, testHash); diff --git a/packages/replicache/src/dag/visitor.test.ts b/packages/replicache/src/dag/visitor.test.ts index c23a43d4bf..025a14c7ab 100644 --- a/packages/replicache/src/dag/visitor.test.ts +++ b/packages/replicache/src/dag/visitor.test.ts @@ -27,7 +27,7 @@ test('Ensure only visited once', async () => { const dagRead: MustGetChunk = { mustGetChunk(h: Hash) { const chunk = chunks.get(h); - assert(chunk); + assert(chunk, () => `Expected chunk for hash ${h} to be defined`); return Promise.resolve(chunk); }, }; diff --git a/packages/replicache/src/db/commit.test.ts b/packages/replicache/src/db/commit.test.ts index e1a3abc74c..49cdb14012 100644 --- a/packages/replicache/src/db/commit.test.ts +++ b/packages/replicache/src/db/commit.test.ts @@ -42,7 +42,10 @@ describe('base snapshot', () => { }); await b.addLocal(clientID); - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); await b.addLocal(clientID); genesisHash = b.chain[0].chunk.hash; await withRead(store, async dagRead => { @@ -99,7 +102,10 @@ describe('local mutations', () => { }); await b.addLocal(clientID); - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); await b.addLocal(clientID); @@ -207,7 +213,10 @@ describe('chain', () => { await b.addSnapshot(undefined, clientID); await b.addLocal(clientID); - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); await b.addLocal(clientID); const headHash = b.chain[b.chain.length - 1].chunk.hash; diff --git a/packages/replicache/src/db/rebase.test.ts b/packages/replicache/src/db/rebase.test.ts index dc9ecee94d..df8ef78660 100644 --- a/packages/replicache/src/db/rebase.test.ts +++ b/packages/replicache/src/db/rebase.test.ts @@ -439,7 +439,7 @@ async function testThrowsErrorOnClientIDMismatch( variant: 'commit' | 'putCommit', formatVersion: FormatVersion, ) { - assert(formatVersion >= FormatVersion.DD31); + assert(formatVersion >= FormatVersion.DD31, 'Expected formatVersion >= DD31'); const clientID = 'test_client_id'; const store = new TestStore(); const b = new ChainBuilder(store, undefined, formatVersion); diff --git a/packages/replicache/src/db/test-helpers.ts b/packages/replicache/src/db/test-helpers.ts index 97024b8cca..7874b44aa4 100644 --- a/packages/replicache/src/db/test-helpers.ts +++ b/packages/replicache/src/db/test-helpers.ts @@ -151,7 +151,10 @@ async function addSnapshot( expect(chain).to.have.length.greaterThan(0); const lc = new LogContext(); await withWriteNoImplicitCommit(store, async dagWrite => { - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); const w = await newWriteSnapshotDD31( await mustGetHeadHash(headName, dagWrite), lastMutationIDs ?? { @@ -211,7 +214,10 @@ export class ChainBuilder { ); const commit = this.chain.at(-1); assertNotUndefined(commit); - assert(this.formatVersion >= FormatVersion.DD31); + assert( + this.formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); assertSnapshotCommitDD31(commit); return commit; } @@ -230,7 +236,10 @@ export class ChainBuilder { ); const commit = this.chain.at(-1); assertNotUndefined(commit); - assert(this.formatVersion >= FormatVersion.DD31); + assert( + this.formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); assertLocalCommitDD31(commit); return commit; @@ -254,7 +263,10 @@ export class ChainBuilder { ); const commit = this.chain.at(-1); assertNotUndefined(commit); - assert(this.formatVersion >= FormatVersion.DD31); + assert( + this.formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); assertSnapshotCommitDD31(commit); return commit; } @@ -277,7 +289,7 @@ export class ChainBuilder { get headHash(): Hash { const lastCommit = this.chain.at(-1); - assert(lastCommit); + assert(lastCommit, 'Expected chain to have at least one commit'); return lastCommit.chunk.hash; } } @@ -295,7 +307,7 @@ export async function initDB( dagWrite, formatVersion, ); - assert(formatVersion >= FormatVersion.DD31); + assert(formatVersion >= FormatVersion.DD31, 'Expected formatVersion >= DD31'); const meta = { basisHash, type: MetaType.SnapshotDD31, diff --git a/packages/replicache/src/db/write.ts b/packages/replicache/src/db/write.ts index f9d233aabd..7f34782225 100644 --- a/packages/replicache/src/db/write.ts +++ b/packages/replicache/src/db/write.ts @@ -63,9 +63,15 @@ export class Write extends Read { // TODO(arv): if (DEBUG) { ... if (basis === undefined) { - assert(meta.basisHash === emptyHash); + assert( + meta.basisHash === emptyHash, + 'Expected basisHash to be emptyHash when basis is undefined', + ); } else { - assert(meta.basisHash === basis.chunk.hash); + assert( + meta.basisHash === basis.chunk.hash, + 'Expected meta.basisHash to equal basis.chunk.hash', + ); } } @@ -123,7 +129,10 @@ export class Write extends Read { const meta = this.#meta; switch (meta.type) { case MetaType.LocalDD31: { - assert(this.#formatVersion >= FormatVersion.DD31); + assert( + this.#formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31 for LocalDD31 commit', + ); const { basisHash, mutationID, @@ -149,7 +158,10 @@ export class Write extends Read { } case MetaType.SnapshotDD31: { - assert(this.#formatVersion > FormatVersion.DD31); + assert( + this.#formatVersion > FormatVersion.DD31, + 'Expected formatVersion > DD31 for SnapshotDD31 commit', + ); const {basisHash, lastMutationIDs, cookieJSON} = meta; commit = commitNewSnapshotDD31( this.#dagWrite.createChunk, @@ -219,7 +231,7 @@ export class Write extends Read { continue; } const basisIndex = basisIndexes.get(name); - assert(index !== basisIndex); + assert(index !== basisIndex, 'Expected index to differ from basisIndex'); const indexDiffResult = await (basisIndex ? diff(basisIndex.map, index.map) @@ -261,7 +273,10 @@ export async function newWriteLocal( const bTreeWrite = new BTreeWrite(dagWrite, formatVersion, basis.valueHash); const mutationID = await basis.getNextMutationID(clientID, dagWrite); const indexes = readIndexesForWrite(basis, dagWrite, formatVersion); - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31 for newWriteLocal', + ); return new Write( dagWrite, bTreeWrite, diff --git a/packages/replicache/src/error-responses.ts b/packages/replicache/src/error-responses.ts index b7396e6199..d98f84c407 100644 --- a/packages/replicache/src/error-responses.ts +++ b/packages/replicache/src/error-responses.ts @@ -60,5 +60,8 @@ export function isVersionNotSupportedResponse( export function assertVersionNotSupportedResponse( v: unknown, ): asserts v is VersionNotSupportedResponse { - assert(isVersionNotSupportedResponse(v)); + assert( + isVersionNotSupportedResponse(v), + 'Expected a VersionNotSupportedResponse', + ); } diff --git a/packages/replicache/src/kv/idb-store-with-mem-fallback.test.ts b/packages/replicache/src/kv/idb-store-with-mem-fallback.test.ts index 43ec8ebe59..2685802294 100644 --- a/packages/replicache/src/kv/idb-store-with-mem-fallback.test.ts +++ b/packages/replicache/src/kv/idb-store-with-mem-fallback.test.ts @@ -82,7 +82,7 @@ function storeThatErrorsInOpen(lc: LogContext, name: string) { const store = newIDBStoreWithMemFallback(lc, name); expect(store).toBeInstanceOf(IDBStoreWithMemFallback); - assert(openRequest.onerror); + assert(openRequest.onerror, 'Expected openRequest.onerror to be defined'); openRequest.onerror(new Event('error')); return store; } diff --git a/packages/replicache/src/kv/idb-store.test.ts b/packages/replicache/src/kv/idb-store.test.ts index 2af042babe..ab6125dfb1 100644 --- a/packages/replicache/src/kv/idb-store.test.ts +++ b/packages/replicache/src/kv/idb-store.test.ts @@ -53,7 +53,10 @@ describe('reopening IDB', () => { store = new IDBStore(name); const result = openSpy.mock.results[0]; - assert(result.type === 'return'); + assert( + result.type === 'return', + () => `Expected result.type to be 'return', got '${result.type}'`, + ); const req = result.value; idb = new Promise((resolve, reject) => { req.addEventListener('success', () => resolve(req.result)); diff --git a/packages/replicache/src/mutation-recovery-test-helper.ts b/packages/replicache/src/mutation-recovery-test-helper.ts index 69e9342184..5a51b76a22 100644 --- a/packages/replicache/src/mutation-recovery-test-helper.ts +++ b/packages/replicache/src/mutation-recovery-test-helper.ts @@ -69,7 +69,7 @@ export async function createAndPersistClientWithPendingLocalDD31({ formatVersion: FormatVersion; snapshotLastMutationIDs?: Record | undefined; }): Promise { - assert(formatVersion >= FormatVersion.DD31); + assert(formatVersion >= FormatVersion.DD31, 'Expected formatVersion >= DD31'); const testMemdag = new LazyStore( perdag, 100 * 2 ** 20, // 100 MB, diff --git a/packages/replicache/src/mutation-recovery.ts b/packages/replicache/src/mutation-recovery.ts index 3e0f13547d..d6c84fc45c 100644 --- a/packages/replicache/src/mutation-recovery.ts +++ b/packages/replicache/src/mutation-recovery.ts @@ -183,7 +183,10 @@ function recoverMutationsFromPerdag( options: MutationRecoveryOptions, perdag: Store, ): Promise { - assert(database.replicacheFormatVersion >= FormatVersion.DD31); + assert( + database.replicacheFormatVersion >= FormatVersion.DD31, + 'Expected replicacheFormatVersion >= DD31 for mutation recovery', + ); return recoverMutationsFromPerdagDD31(database, options, perdag); } @@ -278,7 +281,10 @@ async function recoverMutationsOfClientGroupDD31( options: MutationRecoveryOptions, formatVersion: FormatVersion, ): Promise { - assert(database.replicacheFormatVersion >= FormatVersion.DD31); + assert( + database.replicacheFormatVersion >= FormatVersion.DD31, + 'Expected replicacheFormatVersion >= DD31 for client group mutation recovery', + ); const { delegate, @@ -348,8 +354,11 @@ async function recoverMutationsOfClientGroupDD31( const pushSucceeded = await wrapInOnlineCheck(async () => { const {result: pusherResult} = await wrapInReauthRetries( async (requestID: string, requestLc: LogContext) => { - assert(clientID); - assert(lazyDagForOtherClientGroup); + assert(clientID, 'Expected clientID to be defined'); + assert( + lazyDagForOtherClientGroup, + 'Expected lazyDagForOtherClientGroup to be defined', + ); const pusherResult = await push( requestID, lazyDagForOtherClientGroup, @@ -407,7 +416,7 @@ async function recoverMutationsOfClientGroupDD31( const pullSucceeded = await wrapInOnlineCheck(async () => { const {result: beginPullResponse} = await wrapInReauthRetries( async (requestID: string, requestLc: LogContext) => { - assert(clientID); + assert(clientID, 'Expected clientID to be defined'); const beginPullResponse = await beginPullV1( await delegate.profileID, clientID, @@ -457,7 +466,10 @@ async function recoverMutationsOfClientGroupDD31( // TODO(arv): Refactor to make pullResponse a const. // pullResponse must be non undefined because pullSucceeded is true. - assert(okPullResponse); + assert( + okPullResponse, + 'Expected okPullResponse to be defined after successful pull', + ); lc.debug?.( `Client group ${selfClientGroupID} recovered mutations for client group ${clientGroupID}. Details`, { @@ -474,7 +486,7 @@ async function recoverMutationsOfClientGroupDD31( return clientGroups; } - assert(okPullResponse); + assert(okPullResponse, 'Expected okPullResponse to be defined'); const lastServerAckdMutationIDsUpdates: Record = {}; let anyMutationIDsUpdated = false; for (const [clientID, lastMutationIDChange] of Object.entries( diff --git a/packages/replicache/src/persist/clients-test-helpers.ts b/packages/replicache/src/persist/clients-test-helpers.ts index f390605f13..8a2732fb6b 100644 --- a/packages/replicache/src/persist/clients-test-helpers.ts +++ b/packages/replicache/src/persist/clients-test-helpers.ts @@ -79,7 +79,7 @@ export async function initClientWithClientID( indexes: IndexDefinitions, formatVersion: FormatVersion, ): Promise { - assert(formatVersion >= FormatVersion.DD31); + assert(formatVersion >= FormatVersion.DD31, 'Expected formatVersion >= DD31'); await initClientV6( clientID, new LogContext(), diff --git a/packages/replicache/src/persist/clients.test.ts b/packages/replicache/src/persist/clients.test.ts index feccbecec7..f37a738b55 100644 --- a/packages/replicache/src/persist/clients.test.ts +++ b/packages/replicache/src/persist/clients.test.ts @@ -112,9 +112,9 @@ test('updateClients and getClients for DD31', async () => { // Make sure we write the refresh1Hash as well. await withRead(dagStore, async read => { const h = await read.getHead(CLIENTS_HEAD_NAME); - assert(h); + assert(h, 'Expected clients head hash to be defined'); const chunk = await read.getChunk(h); - assert(chunk); + assert(chunk, 'Expected chunk for clients head hash to be defined'); expect(chunk.meta).toEqual([ refresh1Hash, headClient1Hash, @@ -356,7 +356,7 @@ test('initClient creates new empty snapshot when no existing snapshot to bootstr const {clientGroupID} = client; const clientGroup = await getClientGroup(clientGroupID, dagRead); - assert(clientGroup); + assert(clientGroup, 'Expected clientGroup to be defined'); expect(clientGroup.mutationIDs).toEqual({}); expect(clientGroup.lastServerAckdMutationIDs).toEqual({}); diff --git a/packages/replicache/src/persist/clients.ts b/packages/replicache/src/persist/clients.ts index a1f8245cd5..375d054386 100644 --- a/packages/replicache/src/persist/clients.ts +++ b/packages/replicache/src/persist/clients.ts @@ -334,7 +334,10 @@ export function initClientV6( // Now we create a new client and client group that we fork from the found // snapshot. - assert(res.type === FIND_MATCHING_CLIENT_TYPE_FORK); + assert( + res.type === FIND_MATCHING_CLIENT_TYPE_FORK, + 'Expected result type to be FORK', + ); const {snapshot} = res; diff --git a/packages/replicache/src/persist/collect-idb-databases.ts b/packages/replicache/src/persist/collect-idb-databases.ts index 5793df61bc..864c125d4e 100644 --- a/packages/replicache/src/persist/collect-idb-databases.ts +++ b/packages/replicache/src/persist/collect-idb-databases.ts @@ -218,6 +218,8 @@ function gatherDatabaseInfoForCollect( db.replicacheFormatVersion === FormatVersion.DD31 || db.replicacheFormatVersion === FormatVersion.V6 || db.replicacheFormatVersion === FormatVersion.V7, + () => + `Expected replicacheFormatVersion to be DD31, V6, or V7, got ${db.replicacheFormatVersion}`, ); return canDatabaseBeCollectedAndGetDeletedClientIDs( enableMutationRecovery, diff --git a/packages/replicache/src/persist/gather-mem-only-visitor.test.ts b/packages/replicache/src/persist/gather-mem-only-visitor.test.ts index 7e4728bdaa..81785869d9 100644 --- a/packages/replicache/src/persist/gather-mem-only-visitor.test.ts +++ b/packages/replicache/src/persist/gather-mem-only-visitor.test.ts @@ -81,7 +81,10 @@ describe('dag with only memory-only hashes gathers everything', () => { await mb.addLocal(clientID); await testGatheredChunks(); - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); await mb.addSnapshot(undefined, clientID); await testGatheredChunks(); @@ -126,7 +129,10 @@ describe('dag with some persisted hashes and some memory-only hashes on top', () originalHash: null, timestamp: 42, }; - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); const meta = { type: MetaType.LocalDD31, ...metaBase, @@ -195,7 +201,10 @@ describe('dag with some permanent hashes and some memory-only hashes on top w in }); mb.chain = pb.chain.slice(); - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); await mb.addLocal(clientID, [['c', {name: 'c-name'}]]); await withRead(memdag, async dagRead => { diff --git a/packages/replicache/src/persist/heartbeat.test.ts b/packages/replicache/src/persist/heartbeat.test.ts index 6bdb4bf705..fc2ef46bce 100644 --- a/packages/replicache/src/persist/heartbeat.test.ts +++ b/packages/replicache/src/persist/heartbeat.test.ts @@ -284,7 +284,10 @@ test('heartbeat with dropped idb throws', async () => { await promise; expect(message).lengthOf(3); - assert(message[2] instanceof IDBNotFoundError); + assert( + message[2] instanceof IDBNotFoundError, + 'Expected message[2] to be an IDBNotFoundError', + ); expect(message[2].message).toMatch(/^Expected IndexedDB not found: /); controller.abort(); diff --git a/packages/replicache/src/persist/idb-databases-store.ts b/packages/replicache/src/persist/idb-databases-store.ts index 4b79707dd5..78fd7303fc 100644 --- a/packages/replicache/src/persist/idb-databases-store.ts +++ b/packages/replicache/src/persist/idb-databases-store.ts @@ -37,7 +37,10 @@ function assertIndexedDBDatabaseRecord( for (const [name, db] of Object.entries(value)) { assertString(name); assertIndexedDBDatabase(db); - assert(name === db.name); + assert( + name === db.name, + () => `Expected record key "${name}" to match db.name "${db.name}"`, + ); } } diff --git a/packages/replicache/src/persist/persist.test.ts b/packages/replicache/src/persist/persist.test.ts index 920f3af25b..727e71786d 100644 --- a/packages/replicache/src/persist/persist.test.ts +++ b/packages/replicache/src/persist/persist.test.ts @@ -894,7 +894,10 @@ async function setupPersistTest() { formatVersion, true, ); - assert(clientGroupID === undefined || c.clientGroupID === clientGroupID); + assert( + clientGroupID === undefined || c.clientGroupID === clientGroupID, + 'Expected consistent clientGroupID across clients', + ); clientGroupID = c.clientGroupID; return { clientID: cID, diff --git a/packages/replicache/src/persist/refresh.test.ts b/packages/replicache/src/persist/refresh.test.ts index ed3c34d5bb..8874314c06 100644 --- a/packages/replicache/src/persist/refresh.test.ts +++ b/packages/replicache/src/persist/refresh.test.ts @@ -192,7 +192,7 @@ describe('refresh', () => { formatVersion, undefined, ); - assert(refreshResult); + assert(refreshResult, 'Expected refreshResult to be defined'); expect(Object.fromEntries(refreshResult.diffs)).toEqual({}); const hashes = [ await withRead(memdag, read => read.getHead(DEFAULT_HEAD_NAME)), @@ -242,7 +242,7 @@ describe('refresh', () => { formatVersion, undefined, ); - assert(refreshResult); + assert(refreshResult, 'Expected refreshResult to be defined'); const hashes = [ await withRead(memdag, read => read.getHead(DEFAULT_HEAD_NAME)), ]; @@ -279,7 +279,7 @@ describe('refresh', () => { formatVersion, undefined, ); - assert(refreshResult); + assert(refreshResult, 'Expected refreshResult to be defined'); expect(Object.fromEntries(refreshResult.diffs)).toEqual({ '': [ @@ -390,7 +390,7 @@ describe('refresh', () => { formatVersion, undefined, ); - assert(refreshResult); + assert(refreshResult, 'Expected refreshResult to be defined'); expect(Object.fromEntries(refreshResult.diffs)).toEqual({ '': [ { @@ -454,7 +454,7 @@ describe('refresh', () => { formatVersion, undefined, ); - assert(refreshResult); + assert(refreshResult, 'Expected refreshResult to be defined'); expect(Object.fromEntries(refreshResult.diffs)).toEqual({ '': [ { @@ -831,7 +831,7 @@ describe('refresh', () => { formatVersion, undefined, ); - assert(refreshResult); + assert(refreshResult, 'Expected refreshResult to be defined'); expect(Object.fromEntries(refreshResult.diffs)).toEqual({ '': [{key: 'c', newValue: 3, op: 'add'}], }); diff --git a/packages/replicache/src/process-scheduler.ts b/packages/replicache/src/process-scheduler.ts index 7c48f79b33..3ab81a2378 100644 --- a/packages/replicache/src/process-scheduler.ts +++ b/packages/replicache/src/process-scheduler.ts @@ -168,6 +168,9 @@ async function throttle( try { await sleep(timeMs, abortSignal); } catch (e) { - assert(e instanceof AbortError); + assert( + e instanceof AbortError, + 'Expected caught error to be an AbortError', + ); } } diff --git a/packages/replicache/src/replicache-impl.ts b/packages/replicache/src/replicache-impl.ts index 259adfe8af..ad224ec131 100644 --- a/packages/replicache/src/replicache-impl.ts +++ b/packages/replicache/src/replicache-impl.ts @@ -1212,7 +1212,7 @@ export class ReplicacheImpl { } const clientGroupID = await this.#clientGroupIDPromise; - assert(clientGroupID); + assert(clientGroupID, 'Expected clientGroupID to be defined'); this.#onPersist({clientID, clientGroupID}); }); } @@ -1270,7 +1270,7 @@ export class ReplicacheImpl { async disableClientGroup(): Promise { const clientGroupID = await this.#clientGroupIDPromise; - assert(clientGroupID); + assert(clientGroupID, 'Expected clientGroupID to be defined'); this.isClientGroupDisabled = true; await withWrite(this.perdag, dagWrite => disableClientGroup(clientGroupID, dagWrite), diff --git a/packages/replicache/src/replicache-mutation-recovery-dd31.test.ts b/packages/replicache/src/replicache-mutation-recovery-dd31.test.ts index e07f08cb94..cd54430a77 100644 --- a/packages/replicache/src/replicache-mutation-recovery-dd31.test.ts +++ b/packages/replicache/src/replicache-mutation-recovery-dd31.test.ts @@ -75,7 +75,7 @@ describe('DD31', () => { expectClientGroupDisabled = false, } = args; - assert(formatVersion >= FormatVersion.V6); + assert(formatVersion >= FormatVersion.V6, 'Expected formatVersion >= V6'); const auth = '1'; const pushURL = 'https://test.replicache.dev/push'; @@ -143,7 +143,7 @@ describe('DD31', () => { const clientGroup = await withRead(testPerdag, read => getClientGroup(client1.clientGroupID, read), ); - assert(clientGroup); + assert(clientGroup, 'Expected clientGroup to be defined'); fetchMocker.reset(); fetchMocker.post(pushURL, pushResponse ?? 'ok'); @@ -235,7 +235,7 @@ describe('DD31', () => { getClientGroup(client1.clientGroupID, read), ); - assert(updatedClientGroup); + assert(updatedClientGroup, 'Expected updatedClientGroup to be defined'); const updatedClient2 = await withRead(testPerdag, read => getClient(client2ID, read), @@ -646,11 +646,11 @@ describe('DD31', () => { testPerdagForClients1Thru3, async read => { const clientGroup1 = await getClientGroup(client1.clientGroupID, read); - assert(clientGroup1); + assert(clientGroup1, 'Expected clientGroup1 to be defined'); const clientGroup2 = await getClientGroup(client2.clientGroupID, read); - assert(clientGroup2); + assert(clientGroup2, 'Expected clientGroup2 to be defined'); const clientGroup3 = await getClientGroup(client3.clientGroupID, read); - assert(clientGroup3); + assert(clientGroup3, 'Expected clientGroup3 to be defined'); return {clientGroup1, clientGroup2, clientGroup3}; }, ); @@ -662,7 +662,7 @@ describe('DD31', () => { const clientGroup4 = await withRead(testPerdagForClient4, read => getClientGroup(client4.clientGroupID, read), ); - assert(clientGroup4); + assert(clientGroup4, 'Expected clientGroup4 to be defined'); const pullRequestJsonBodies: JSONObject[] = []; fetchMocker.reset(); @@ -766,11 +766,11 @@ describe('DD31', () => { read => getClientGroups(read), ); const updatedClientGroup1 = updatedClientGroups.get(client1.clientGroupID); - assert(updatedClientGroup1); + assert(updatedClientGroup1, 'Expected updatedClientGroup1 to be defined'); const updatedClientGroup2 = updatedClientGroups.get(client2.clientGroupID); - assert(updatedClientGroup2); + assert(updatedClientGroup2, 'Expected updatedClientGroup2 to be defined'); const updatedClientGroup3 = updatedClientGroups.get(client3.clientGroupID); - assert(updatedClientGroup3); + assert(updatedClientGroup3, 'Expected updatedClientGroup3 to be defined'); const updatedClient4 = await withRead(testPerdagForClient4, read => getClient(client4ID, read), @@ -779,7 +779,7 @@ describe('DD31', () => { const updatedClientGroup4 = await withRead(testPerdagForClient4, read => getClientGroup(client4.clientGroupID, read), ); - assert(updatedClientGroup4); + assert(updatedClientGroup4, 'Expected updatedClientGroup4 to be defined'); expect(updatedClient1).toEqual(client1); expect(updatedClientGroup1).toEqual({ @@ -887,11 +887,11 @@ describe('DD31', () => { testPerdag, async read => { const clientGroup1 = await getClientGroup(client1.clientGroupID, read); - assert(clientGroup1); + assert(clientGroup1, 'Expected clientGroup1 to be defined'); const clientGroup2 = await getClientGroup(client2.clientGroupID, read); - assert(clientGroup2); + assert(clientGroup2, 'Expected clientGroup2 to be defined'); const clientGroup3 = await getClientGroup(client3.clientGroupID, read); - assert(clientGroup3); + assert(clientGroup3, 'Expected clientGroup3 to be defined'); return { clientGroup1, clientGroup2, @@ -993,11 +993,11 @@ describe('DD31', () => { getClientGroups(read), ); const updatedClientGroup1 = updatedClientGroups.get(client1.clientGroupID); - assert(updatedClientGroup1); + assert(updatedClientGroup1, 'Expected updatedClientGroup1 to be defined'); const updatedClientGroup2 = updatedClientGroups.get(client2.clientGroupID); - assert(updatedClientGroup2); + assert(updatedClientGroup2, 'Expected updatedClientGroup2 to be defined'); const updatedClientGroup3 = updatedClientGroups.get(client3.clientGroupID); - assert(updatedClientGroup3); + assert(updatedClientGroup3, 'Expected updatedClientGroup3 to be defined'); expect(updatedClient1).toEqual(client1); expect(updatedClientGroup1).toEqual(clientGroup1); @@ -1077,11 +1077,11 @@ describe('DD31', () => { testPerdag, async read => { const clientGroup1 = await getClientGroup(client1.clientGroupID, read); - assert(clientGroup1); + assert(clientGroup1, 'Expected clientGroup1 to be defined'); const clientGroup2 = await getClientGroup(client2.clientGroupID, read); - assert(clientGroup2); + assert(clientGroup2, 'Expected clientGroup2 to be defined'); const clientGroup3 = await getClientGroup(client3.clientGroupID, read); - assert(clientGroup3); + assert(clientGroup3, 'Expected clientGroup3 to be defined'); return { clientGroup1, clientGroup2, @@ -1189,11 +1189,11 @@ describe('DD31', () => { getClientGroups(read), ); const updatedClientGroup1 = updatedClientGroups.get(client1.clientGroupID); - assert(updatedClientGroup1); + assert(updatedClientGroup1, 'Expected updatedClientGroup1 to be defined'); const updatedClientGroup2 = updatedClientGroups.get(client2.clientGroupID); - assert(updatedClientGroup2); + assert(updatedClientGroup2, 'Expected updatedClientGroup2 to be defined'); const updatedClientGroup3 = updatedClientGroups.get(client3.clientGroupID); - assert(updatedClientGroup3); + assert(updatedClientGroup3, 'Expected updatedClientGroup3 to be defined'); expect(updatedClient1).toEqual(client1); expect(updatedClientGroup1).toEqual(clientGroup1); @@ -1273,12 +1273,12 @@ describe('DD31', () => { const clientGroup1 = await withRead(testPerdagForClient1, read => getClientGroup(client1.clientGroupID, read), ); - assert(clientGroup1); + assert(clientGroup1, 'Expected clientGroup1 to be defined'); const clientGroup2 = await withRead(testPerdagForClient2, read => getClientGroup(client2.clientGroupID, read), ); - assert(clientGroup2); + assert(clientGroup2, 'Expected clientGroup2 to be defined'); const pullRequestJsonBodies: JSONObject[] = []; fetchMocker.reset(); @@ -1363,11 +1363,11 @@ describe('DD31', () => { const updatedClientGroup1 = await withRead(testPerdagForClient1, read => getClientGroup(updatedClient1.clientGroupID, read), ); - assert(updatedClientGroup1); + assert(updatedClientGroup1, 'Expected updatedClientGroup1 to be defined'); const updatedClientGroup2 = await withRead(testPerdagForClient2, read => getClientGroup(updatedClient2.clientGroupID, read), ); - assert(updatedClientGroup2); + assert(updatedClientGroup2, 'Expected updatedClientGroup2 to be defined'); expect(updatedClientGroup1.mutationIDs[client1ID]).toBe( clientGroup1.mutationIDs[client1ID], @@ -1612,7 +1612,7 @@ describe('DD31', () => { const clientGroup1 = await withRead(testPerdagDD31, read => getClientGroup(client1.clientGroupID, read), ); - assert(clientGroup1); + assert(clientGroup1, 'Expected clientGroup1 to be defined'); expect(clientGroup1.mutationIDs[client1ID]).toBe(2); const pullRequestJSONBodies: JSONObject[] = []; @@ -1695,7 +1695,7 @@ describe('DD31', () => { const clientGroup1 = await withRead(testPerdagDD31, read => getClientGroup(client1.clientGroupID, read), ); - assert(clientGroup1); + assert(clientGroup1, 'Expected clientGroup1 to be defined'); expect(clientGroup1.mutationIDs[client1ID]).toBe(2); const pullRequestJSONBodies: JSONObject[] = []; @@ -1819,7 +1819,7 @@ describe('DD31', () => { const clientGroup1 = await withRead(testPerdagDD31, read => getClientGroup(client1.clientGroupID, read), ); - assert(clientGroup1); + assert(clientGroup1, 'Expected clientGroup1 to be defined'); expect(clientGroup1.mutationIDs[client1ID]).toBe(2); const client2 = await withRead(testPerdagDD31, read => @@ -1831,7 +1831,7 @@ describe('DD31', () => { const clientGroup2 = await withRead(testPerdagDD31, read => getClientGroup(client2.clientGroupID, read), ); - assert(clientGroup2); + assert(clientGroup2, 'Expected clientGroup2 to be defined'); expect(clientGroup2.mutationIDs[client2ID]).toBe(2); fetchMocker.reset(); diff --git a/packages/replicache/src/replicache-persist.test.ts b/packages/replicache/src/replicache-persist.test.ts index 618b3f3662..23005beba3 100644 --- a/packages/replicache/src/replicache-persist.test.ts +++ b/packages/replicache/src/replicache-persist.test.ts @@ -44,7 +44,7 @@ async function deleteClientGroupForTesting( rep: ReplicacheTest, ) { const clientGroupID = await rep.clientGroupID; - assert(clientGroupID); + assert(clientGroupID, 'Expected clientGroupID to be defined'); await withWriteNoImplicitCommit(rep.perdag, async tx => { await deleteClientGroup(clientGroupID, tx); await tx.commit(); diff --git a/packages/replicache/src/replicache-types.test.ts b/packages/replicache/src/replicache-types.test.ts index 0f34cad4a3..dccd9da749 100644 --- a/packages/replicache/src/replicache-types.test.ts +++ b/packages/replicache/src/replicache-types.test.ts @@ -457,7 +457,7 @@ test.skip('Parameterized get deep read only object/array [type checking only]', mutators: { mut: async (tx: WriteTransaction) => { const v = await tx.get('x'); - assert(v); + assert(v, 'Expected value for key "x" to be defined'); // @ts-expect-error Cannot assign to 'x' because it is a read-only property.ts(2540) v.x = [42]; // @ts-expect-error Index signature in type 'readonly number[]' only permits reading.ts(2542) @@ -467,7 +467,7 @@ test.skip('Parameterized get deep read only object/array [type checking only]', }); await rep.query(async tx => { const v = await tx.get('x'); - assert(v); + assert(v, 'Expected value for key "x" to be defined'); // @ts-expect-error Cannot assign to 'x' because it is a read-only property.ts(2540) v.x = [42]; // @ts-expect-error Index signature in type 'readonly number[]' only permits reading.ts(2542) diff --git a/packages/replicache/src/replicache.test.ts b/packages/replicache/src/replicache.test.ts index 3ca3bff569..14201f6b43 100644 --- a/packages/replicache/src/replicache.test.ts +++ b/packages/replicache/src/replicache.test.ts @@ -1976,7 +1976,7 @@ test('Create KV Store', async () => { ); expect(store).toBeInstanceOf(MemStoreWithCounters); - assert(store); + assert(store, 'Expected store to be defined'); await testMemStoreWithCounters(rep, store); }); diff --git a/packages/replicache/src/subscriptions.ts b/packages/replicache/src/subscriptions.ts index 24047ddb4c..84623af7c6 100644 --- a/packages/replicache/src/subscriptions.ts +++ b/packages/replicache/src/subscriptions.ts @@ -233,7 +233,10 @@ export class WatchSubscription implements Subscription { } // For the initial run, we need to get the "diffs" for the whole tree. - assert(diffs === undefined); + assert( + diffs === undefined, + 'Expected diffs to be undefined on initial run', + ); const newDiff: DiffOperation[] = []; for await (const entry of tx.scan({prefix, indexName}).entries()) { @@ -245,7 +248,7 @@ export class WatchSubscription implements Subscription { } diff = newDiff; } else { - assert(diffs); + assert(diffs, 'Expected diffs to be defined for non-initial run'); const maybeDiff = diffs.get(indexName ?? '') ?? []; diff = convertInternalDiff(maybeDiff); } diff --git a/packages/replicache/src/sync/diff.ts b/packages/replicache/src/sync/diff.ts index d988603aae..0ac3ccb52e 100644 --- a/packages/replicache/src/sync/diff.ts +++ b/packages/replicache/src/sync/diff.ts @@ -104,7 +104,10 @@ export async function addDiffsForIndexes( const newIndex = newIndexes.get(oldIndexName); if (newIndex !== undefined) { - assert(newIndex !== oldIndex); + assert( + newIndex !== oldIndex, + 'Expected newIndex to differ from oldIndex', + ); const diffs = await btreeDiff(oldIndex.map, newIndex.map); newIndexes.delete(oldIndexName); diffsMap.set(oldIndexName, diffs); diff --git a/packages/replicache/src/sync/patch.test.ts b/packages/replicache/src/sync/patch.test.ts index 2761abb64a..6c9a1a5441 100644 --- a/packages/replicache/src/sync/patch.test.ts +++ b/packages/replicache/src/sync/patch.test.ts @@ -305,7 +305,10 @@ describe('patch', () => { const b = new ChainBuilder(store, undefined, formatVersion); await b.addGenesis(clientID); await withWriteNoImplicitCommit(store, async dagWrite => { - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); const dbWrite = await newWriteSnapshotDD31( b.chain[0].chunk.hash, {[clientID]: 1}, diff --git a/packages/replicache/src/sync/pull.test.ts b/packages/replicache/src/sync/pull.test.ts index de4e3551d6..e79d5eb3ed 100644 --- a/packages/replicache/src/sync/pull.test.ts +++ b/packages/replicache/src/sync/pull.test.ts @@ -677,7 +677,10 @@ describe('maybe end try pull', () => { ); // Add snapshot and replayed commits to the sync chain. - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); const w = await newWriteSnapshotDD31( b.chain[0].chunk.hash, {[clientID]: 0}, @@ -830,7 +833,10 @@ function makeFakePuller(options: FakePullerArgs): Puller { }; } - assert(isPullRequestV1(options.expPullReq)); + assert( + isPullRequestV1(options.expPullReq), + 'Expected expPullReq to be a PullRequestV1', + ); assertPullResponseV1(resp); return { response: resp, @@ -868,7 +874,10 @@ describe('changed keys', () => { }, }; - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); await b.addGenesis(clientID, indexDefinitions); await b.addSnapshot([], clientID, undefined, undefined); } else { @@ -887,7 +896,10 @@ describe('changed keys', () => { const newCookie = 'new_cookie'; - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); const expPullReq: PullRequestV1 = { profileID, clientGroupID, @@ -908,7 +920,10 @@ describe('changed keys', () => { err: undefined, }); - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); const pullResult = await beginPullV1( profileID, clientID, diff --git a/packages/replicache/src/sync/pull.ts b/packages/replicache/src/sync/pull.ts index 18507f297e..83669dbfa0 100644 --- a/packages/replicache/src/sync/pull.ts +++ b/packages/replicache/src/sync/pull.ts @@ -358,7 +358,10 @@ export function maybeEndPull( const localMutations = await localMutations_1(mainHeadHash, dagRead); for (const commit of localMutations) { let cid = clientID; - assert(commitIsLocalDD31(commit)); + assert( + commitIsLocalDD31(commit), + 'Expected commit to be a local DD31 commit', + ); cid = commit.meta.clientID; if ( diff --git a/packages/replicache/src/sync/push.ts b/packages/replicache/src/sync/push.ts index c9c8eade65..8b3d02786c 100644 --- a/packages/replicache/src/sync/push.ts +++ b/packages/replicache/src/sync/push.ts @@ -136,7 +136,10 @@ export async function push( // want tail first (in mutation id order). pending.reverse(); - assert(pushVersion === PUSH_VERSION_DD31); + assert( + pushVersion === PUSH_VERSION_DD31, + 'Expected pushVersion to be PUSH_VERSION_DD31', + ); const pushMutations: FrozenMutationV1[] = []; for (const commit of pending) { @@ -146,7 +149,7 @@ export async function push( throw new Error('Internal non local pending commit'); } } - assert(clientGroupID); + assert(clientGroupID, 'Expected clientGroupID to be defined'); const pushReq: PushRequestV1 = { profileID, clientGroupID, diff --git a/packages/replicache/src/sync/test-helpers.ts b/packages/replicache/src/sync/test-helpers.ts index 782963c7e3..bf848ddfd0 100644 --- a/packages/replicache/src/sync/test-helpers.ts +++ b/packages/replicache/src/sync/test-helpers.ts @@ -50,7 +50,10 @@ export async function addSyncSnapshot( // Add sync snapshot. const cookie = `sync_cookie_${chain.length}`; await withWriteNoImplicitCommit(store, async dagWrite => { - assert(formatVersion >= FormatVersion.DD31); + assert( + formatVersion >= FormatVersion.DD31, + 'Expected formatVersion >= DD31', + ); const w = await newWriteSnapshotDD31( baseSnapshot.chunk.hash, {[clientID]: await baseSnapshot.getMutationID(clientID, dagWrite)}, diff --git a/packages/replicache/src/worker-test.ts b/packages/replicache/src/worker-test.ts index b329001168..acab53162a 100644 --- a/packages/replicache/src/worker-test.ts +++ b/packages/replicache/src/worker-test.ts @@ -27,12 +27,15 @@ async function testGetHasScanOnEmptyDB(name: string) { ) => { const {key, value} = args; await tx.set(key, value); - assert((await tx.has(key)) === true); + assert((await tx.has(key)) === true, 'Expected key to exist after set'); const v = await tx.get(key); - assert(deepEqual(v, value)); + assert(deepEqual(v, value), 'Expected get value to equal set value'); - assert((await tx.del(key)) === true); - assert((await tx.has(key)) === false); + assert((await tx.del(key)) === true, 'Expected del to return true'); + assert( + (await tx.has(key)) === false, + 'Expected key to not exist after del', + ); }, }, }); @@ -54,11 +57,17 @@ async function testGetHasScanOnEmptyDB(name: string) { } async function t(tx: ReadTransaction) { - assert((await tx.get('key')) === undefined); - assert((await tx.has('key')) === false); + assert( + (await tx.get('key')) === undefined, + 'Expected get to return undefined for missing key', + ); + assert( + (await tx.has('key')) === false, + 'Expected has to return false for missing key', + ); const scanItems = await asyncIterableToArray(tx.scan()); - assert(scanItems.length === 0); + assert(scanItems.length === 0, 'Expected scan items to be empty'); } await rep.query(t); diff --git a/packages/shared/src/asserts.ts b/packages/shared/src/asserts.ts index 9a32d43832..21aa4652f8 100644 --- a/packages/shared/src/asserts.ts +++ b/packages/shared/src/asserts.ts @@ -1,7 +1,4 @@ -export function assert( - b: unknown, - msg: string | (() => string) = 'Assertion failed', -): asserts b { +export function assert(b: unknown, msg: string | (() => string)): asserts b { if (!b) { throw new Error(typeof msg === 'string' ? msg : msg()); } diff --git a/packages/shared/src/json-schema.test.ts b/packages/shared/src/json-schema.test.ts index 28c92ccce1..1ea7401e4f 100644 --- a/packages/shared/src/json-schema.test.ts +++ b/packages/shared/src/json-schema.test.ts @@ -15,7 +15,7 @@ test('json schema', () => { } if (message !== undefined) { - assert(ex instanceof TypeError); + assert(ex instanceof TypeError, 'Expected ex to be a TypeError'); expect(ex.message).toBe(message); } else { expect(ex).toBe(undefined); @@ -59,7 +59,7 @@ test('json object schema', () => { } if (message !== undefined) { - assert(ex instanceof TypeError); + assert(ex instanceof TypeError, 'Expected ex to be a TypeError'); expect(ex.message).toBe(message); } else { expect(ex).toBe(undefined); diff --git a/packages/shared/src/promise-race.test.ts b/packages/shared/src/promise-race.test.ts index 93b8953d66..9de5ff0874 100644 --- a/packages/shared/src/promise-race.test.ts +++ b/packages/shared/src/promise-race.test.ts @@ -24,7 +24,10 @@ describe('promiseRace with record', () => { expectTypeOf(result.key).toEqualTypeOf<'bar' | 'foo'>(); expectTypeOf(result.status).toEqualTypeOf<'fulfilled'>(); expectTypeOf(result.result).toEqualTypeOf(); - assert(result.key === 'bar'); + assert( + result.key === 'bar', + () => `Expected result.key to be 'bar', got '${result.key}'`, + ); // type narrows to string expectTypeOf(result.result).toEqualTypeOf(); }); diff --git a/packages/shared/src/valita.test.ts b/packages/shared/src/valita.test.ts index 6b22e79c42..f3f74da6dc 100644 --- a/packages/shared/src/valita.test.ts +++ b/packages/shared/src/valita.test.ts @@ -21,7 +21,7 @@ const t = (s: v.Type, val: unknown, message?: string) => { } if (message !== undefined) { - assert(ex instanceof TypeError); + assert(ex instanceof TypeError, 'Expected ex to be a TypeError'); expect(ex.message).toBe(message); expect(r1.ok).toBe(false); diff --git a/packages/z2s/src/compiler.ts b/packages/z2s/src/compiler.ts index 06e2beeda8..d33cd44987 100644 --- a/packages/z2s/src/compiler.ts +++ b/packages/z2s/src/compiler.ts @@ -523,7 +523,10 @@ function literalValueComparison( true, ); case 'literal': { - assert(plural === Array.isArray(valuePos.value)); + assert( + plural === Array.isArray(valuePos.value), + 'Expected plural flag to match whether value is an array', + ); if (Array.isArray(valuePos.value)) { if (valuePos.value.length > 0) { // If the array is non-empty base its type on its first @@ -617,7 +620,10 @@ export function pullTablesForJunction( 'Too many related tables for a junction edge', ); const otherRelationship = relationship.subquery.related[0]; - assert(!otherRelationship.hidden); + assert( + !otherRelationship.hidden, + 'Expected junction edge relationship to not be hidden', + ); return [ { table: makeTable(spec, relationship.subquery.table), diff --git a/packages/zero-cache/src/auth/auth.test.ts b/packages/zero-cache/src/auth/auth.test.ts index be450d4eb7..691e54eb89 100644 --- a/packages/zero-cache/src/auth/auth.test.ts +++ b/packages/zero-cache/src/auth/auth.test.ts @@ -80,7 +80,7 @@ describe('AuthSession', () => { expect(await authSession.update('u1', 't1')).toEqual({ok: true}); const mismatch = await authSession.update('u2', 't2'); - assert(!mismatch.ok); + assert(!mismatch.ok, 'Expected mismatch update to fail'); expect(mismatch.error.kind).toBe(ErrorKind.Unauthorized); }); @@ -99,7 +99,7 @@ describe('AuthSession', () => { const authSession = new AuthSessionImpl(lc, 'cg1', undefined); expect(await authSession.update('u1', 't1')).toEqual({ok: true}); const result = await authSession.update('u1', ''); - assert(!result.ok); + assert(!result.ok, 'Expected missing auth update to fail'); expect(result.error.kind).toBe(ErrorKind.Unauthorized); expect(result.error.message).toContain('No token provided'); }); @@ -165,7 +165,7 @@ describe('AuthSession', () => { const authSession = new AuthSessionImpl(lc, 'cg1', validateLegacyJWT); const result = await authSession.update('u1', 'jwt-1'); - assert(!result.ok); + assert(!result.ok, 'Expected legacy JWT validation failure'); expect(result.error.kind).toBe(ErrorKind.AuthInvalidated); expect(result.error.origin).toBe(ErrorOrigin.ZeroCache); }); @@ -182,7 +182,7 @@ describe('AuthSession', () => { const authSession = new AuthSessionImpl(lc, 'cg1', validateLegacyJWT); const result = await authSession.update('u1', 'jwt-1'); - assert(!result.ok); + assert(!result.ok, 'Expected protocol error from validator'); expect(result.error.kind).toBe(ErrorKind.Unauthorized); expect(result.error.message).toBe('nope'); }); @@ -201,7 +201,7 @@ describe('AuthSession', () => { const authSession = new AuthSessionImpl(lc, 'cg1', validateLegacyJWT); const failed = await authSession.update('alice', 'bad-token'); - assert(!failed.ok); + assert(!failed.ok, 'Expected bad-token update to fail'); expect(failed.error.kind).toBe(ErrorKind.AuthInvalidated); expect(await authSession.update('bob', 'good-token')).toEqual({ok: true}); diff --git a/packages/zero-cache/src/integration/integration.pg.test.ts b/packages/zero-cache/src/integration/integration.pg.test.ts index 7eecfaa6f7..b10b062d4b 100644 --- a/packages/zero-cache/src/integration/integration.pg.test.ts +++ b/packages/zero-cache/src/integration/integration.pg.test.ts @@ -504,8 +504,11 @@ describe('integration', {timeout: 30000}, () => { type Envs = [NodeJS.ProcessEnv] | [NodeJS.ProcessEnv, NodeJS.ProcessEnv]; async function startZero(envs: Envs) { - assert(zeros.length === 0); - assert(zerosExited.length === 0); + assert(zeros.length === 0, 'Expected zeros to be empty before starting'); + assert( + zerosExited.length === 0, + 'Expected zerosExited to be empty before starting', + ); let i = 0; for (const env of envs) { diff --git a/packages/zero-cache/src/services/replicator/test-utils.ts b/packages/zero-cache/src/services/replicator/test-utils.ts index 47ac7cc0c6..d564a4210e 100644 --- a/packages/zero-cache/src/services/replicator/test-utils.ts +++ b/packages/zero-cache/src/services/replicator/test-utils.ts @@ -90,7 +90,7 @@ export class ReplicationMessages< #relationOrFail(table: string): MessageRelation { const relation = this.#tables.get(table); - assert(relation); // Type parameters should guarantee this. + assert(relation, `Expected relation for table "${table}" to be defined`); return relation; } diff --git a/packages/zero-cache/src/services/view-syncer/cvr.ts b/packages/zero-cache/src/services/view-syncer/cvr.ts index 6fdb0b59e8..7b04962a0c 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr.ts @@ -157,7 +157,10 @@ export class CVRUpdater { } protected _setVersion(version: CVRVersion) { - assert(cmpVersions(this._cvr.version, version) < 0); + assert( + cmpVersions(this._cvr.version, version) < 0, + 'Expected new version to be greater than current version', + ); this._cvr.version = version; return version; } @@ -738,7 +741,10 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { * generated from {@link received} are sent. */ #assertNewVersion(): CVRVersion { - assert(cmpVersions(this._orig.version, this._cvr.version) < 0); + assert( + cmpVersions(this._orig.version, this._cvr.version) < 0, + 'Expected CVR version to have been bumped above original', + ); return this._cvr.version; } diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer-inspect.pg.test.ts b/packages/zero-cache/src/services/view-syncer/view-syncer-inspect.pg.test.ts index a454f8529a..bde13c9180 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer-inspect.pg.test.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer-inspect.pg.test.ts @@ -445,7 +445,10 @@ describe('view-syncer/service', () => { }); test('analyze-query with custom query name and args', async () => { - assert(customQueryTransformer); + assert( + customQueryTransformer, + 'Expected customQueryTransformer to be defined', + ); const {queue: client} = connectWithQueueAndSource(SYNC_CONTEXT, []); @@ -543,7 +546,10 @@ describe('view-syncer/service', () => { }); test('returns error response when custom query transformation fails', async () => { - assert(customQueryTransformer); + assert( + customQueryTransformer, + 'Expected customQueryTransformer to be defined', + ); const {queue: client} = connectWithQueueAndSource(SYNC_CONTEXT, []); @@ -582,7 +588,10 @@ describe('view-syncer/service', () => { }); test('returns error response when custom query transformation returns error result', async () => { - assert(customQueryTransformer); + assert( + customQueryTransformer, + 'Expected customQueryTransformer to be defined', + ); const {queue: client} = connectWithQueueAndSource(SYNC_CONTEXT, []); diff --git a/packages/zero-cache/src/types/subscription.test.ts b/packages/zero-cache/src/types/subscription.test.ts index 478626d1a0..1024e1bb20 100644 --- a/packages/zero-cache/src/types/subscription.test.ts +++ b/packages/zero-cache/src/types/subscription.test.ts @@ -508,7 +508,10 @@ describe('types/subscription', () => { cleanup, consumed: m => consumed.add(m), }); - assert(subscription.pipeline); + assert( + subscription.pipeline, + 'Expected subscription pipeline to be defined', + ); for (let i = 0; i < 5; i++) { const {result} = subscription.push(i); diff --git a/packages/zero-client/src/client/connection-manager.test.ts b/packages/zero-client/src/client/connection-manager.test.ts index 3eba1e78df..d84326cf34 100644 --- a/packages/zero-client/src/client/connection-manager.test.ts +++ b/packages/zero-client/src/client/connection-manager.test.ts @@ -443,7 +443,10 @@ describe('ConnectionManager', () => { manager.closed(); expect(manager.state.name).toEqual(ConnectionStatus.Closed); - assert(manager.state.name === ConnectionStatus.Closed); + assert( + manager.state.name === ConnectionStatus.Closed, + 'Expected connection manager state to be Closed', + ); expect(manager.state.reason.kind).toEqual(ClientErrorKind.ClientClosed); expect(manager.shouldContinueRunLoop()).toBe(false); expect(listener).toHaveBeenCalledWith({ @@ -460,7 +463,10 @@ describe('ConnectionManager', () => { manager.disconnected(sharedDisconnectError); expect(manager.state.name).toEqual(ConnectionStatus.Closed); - assert(manager.state.name === ConnectionStatus.Closed); + assert( + manager.state.name === ConnectionStatus.Closed, + 'Expected connection manager state to remain Closed', + ); expect(manager.state.reason.kind).toEqual(ClientErrorKind.ClientClosed); expect(listener).not.toHaveBeenCalled(); }); @@ -668,7 +674,10 @@ describe('ConnectionManager', () => { const nextState = await nextStatePromise; expect(nextState.name).toEqual(ConnectionStatus.Closed); - assert(nextState.name === ConnectionStatus.Closed); + assert( + nextState.name === ConnectionStatus.Closed, + 'Expected next state to be Closed', + ); expect(nextState.reason.kind).toEqual(ClientErrorKind.ClientClosed); }); diff --git a/packages/zero-client/src/client/context.test.ts b/packages/zero-client/src/client/context.test.ts index 5f46e110ca..23f7c68faf 100644 --- a/packages/zero-client/src/client/context.test.ts +++ b/packages/zero-client/src/client/context.test.ts @@ -56,7 +56,10 @@ test('getSource', () => { ); const source = context.getSource('users'); - assert(source instanceof MemorySource); + assert( + source instanceof MemorySource, + 'Expected source to be a MemorySource instance', + ); expect(source.tableSchema).toMatchInlineSnapshot(` { "columns": { diff --git a/packages/zero-client/src/client/custom.test.ts b/packages/zero-client/src/client/custom.test.ts index 57016c8cb5..dfe90d96a4 100644 --- a/packages/zero-client/src/client/custom.test.ts +++ b/packages/zero-client/src/client/custom.test.ts @@ -661,17 +661,29 @@ describe('error handling', () => { const result = z.mutate.issue.fail(); const clientResult = await result.client; - assert(clientResult.type === 'error'); + assert( + clientResult.type === 'error', + 'Expected client result type to be error', + ); expect(clientResult.error.type).toBe('app'); - assert(clientResult.error.type === 'app'); + assert( + clientResult.error.type === 'app', + 'Expected client error type to be app', + ); expect(clientResult.error.details).toBeUndefined(); expect(clientResult.error.message).toBe('client boom'); const serverResult = await result.server; - assert(serverResult.type === 'error'); + assert( + serverResult.type === 'error', + 'Expected server result type to be error', + ); expect(serverResult.error.type).toBe('app'); expect(serverResult.error.message).toBe('client boom'); - assert(serverResult.error.type === 'app'); + assert( + serverResult.error.type === 'app', + 'Expected server error type to be app', + ); expect(serverResult.error.details).toBeUndefined(); await z.close(); @@ -702,14 +714,20 @@ describe('error handling', () => { z.connectionManager.disconnected(offlineError); const serverResult = await result.server; - assert(serverResult.type === 'error'); + assert( + serverResult.type === 'error', + 'Expected server result type to be error', + ); expect(serverResult.error.type).toBe('zero'); expect(serverResult.error.message).toBe('offline'); expect(noop).toHaveBeenCalledTimes(1); // client promise was already resolved const clientResult = await result.client; - assert(clientResult.type === 'success'); + assert( + clientResult.type === 'success', + 'Expected client result type to be success', + ); await z.close(); }); @@ -742,21 +760,33 @@ describe('error handling', () => { const offlineNamespaced = z.mutate.issue.namespaced({id: '123'}); const offlineTopClient = await offlineTop.client; - assert(offlineTopClient.type === 'error'); + assert( + offlineTopClient.type === 'error', + 'Expected offline top-level client result to be error', + ); expect(offlineTopClient.error.type).toBe('zero'); expect(offlineTopClient.error.message).toBe('offline'); const offlineTopServer = await offlineTop.server; - assert(offlineTopServer.type === 'error'); + assert( + offlineTopServer.type === 'error', + 'Expected offline top-level server result to be error', + ); expect(offlineTopServer.error.type).toBe('zero'); expect(offlineTopServer.error.message).toBe('offline'); const offlineNamespacedClient = await offlineNamespaced.client; - assert(offlineNamespacedClient.type === 'error'); + assert( + offlineNamespacedClient.type === 'error', + 'Expected offline namespaced client result to be error', + ); expect(offlineNamespacedClient.error.type).toBe('zero'); const offlineNamespacedServer = await offlineNamespaced.server; - assert(offlineNamespacedServer.type === 'error'); + assert( + offlineNamespacedServer.type === 'error', + 'Expected offline namespaced server result to be error', + ); expect(offlineNamespacedServer.error.type).toBe('zero'); expect(topLevel).not.toHaveBeenCalled(); @@ -811,9 +841,9 @@ describe('error handling', () => { await z.waitForConnectionStatus(ConnectionStatus.Connected); const result = await z.mutate.issue.create().client; - assert(result.type === 'error'); + assert(result.type === 'error', 'Expected result type to be error'); expect(result.error.type).toBe('app'); - assert(result.error.type === 'app'); + assert(result.error.type === 'app', 'Expected error type to be app'); expect(result.error.message).toBe( 'Cannot wait for complete results in custom mutations', ); @@ -921,10 +951,16 @@ describe('server results and keeping read queries', () => { await z.close(); const closeServerResult = await close.server; - assert(closeServerResult.type === 'error'); + assert( + closeServerResult.type === 'error', + 'Expected close server result type to be error', + ); expect(closeServerResult.error.type).toBe('app'); expect(closeServerResult.error.message).toBe('application error'); - assert(closeServerResult.error.type === 'app'); + assert( + closeServerResult.error.type === 'app', + 'Expected close server error type to be app', + ); expect(closeServerResult.error.details).toEqual({ code: 'APP_ERROR', other: 'some other detail', @@ -1055,10 +1091,16 @@ describe('server results and keeping read queries', () => { z.queryDelegate.flushQueryChanges(); const closeServerResult = await close.server; - assert(closeServerResult.type === 'error'); + assert( + closeServerResult.type === 'error', + 'Expected close server result type to be error', + ); expect(closeServerResult.error.type).toBe('app'); expect(closeServerResult.error.message).toBe('womp womp'); - assert(closeServerResult.error.type === 'app'); + assert( + closeServerResult.error.type === 'app', + 'Expected close server error type to be app', + ); expect(closeServerResult.error.details).toEqual({ issue: 'not found', }); diff --git a/packages/zero-client/src/client/http-string.ts b/packages/zero-client/src/client/http-string.ts index c6972546b7..d8d1b723cf 100644 --- a/packages/zero-client/src/client/http-string.ts +++ b/packages/zero-client/src/client/http-string.ts @@ -13,11 +13,11 @@ export function toHTTPString(url: WSString): HTTPString { } export function assertHTTPString(url: string): asserts url is HTTPString { - assert(/^https?:\/\//.test(url)); + assert(/^https?:\/\//.test(url), () => `Expected HTTP(S) URL, got "${url}"`); } export function assertWSString(url: string): asserts url is WSString { - assert(/^wss?:\/\//.test(url)); + assert(/^wss?:\/\//.test(url), () => `Expected WS(S) URL, got "${url}"`); } export function appendPath( diff --git a/packages/zero-client/src/client/inspector/inspector.test.ts b/packages/zero-client/src/client/inspector/inspector.test.ts index 4de4e81dbe..09c939cfa5 100644 --- a/packages/zero-client/src/client/inspector/inspector.test.ts +++ b/packages/zero-client/src/client/inspector/inspector.test.ts @@ -2222,9 +2222,15 @@ describe('inspector.analyzeQuery name mapping', () => { expect(sentAst?.where).toBeDefined(); expect(sentAst?.where?.type).toBe('simple'); // Type narrowing: we know where is defined and is simple from above assertions - assert(sentAst?.where?.type === 'simple'); + assert( + sentAst?.where?.type === 'simple', + 'Expected where clause type to be simple', + ); expect(sentAst.where.left.type).toBe('column'); - assert(sentAst.where.left.type === 'column'); + assert( + sentAst.where.left.type === 'column', + 'Expected where left operand type to be column', + ); expect(sentAst.where.left.name).toBe('creator_id'); expect(result.syncedRowCount).toBe(1); await z.close(); diff --git a/packages/zero-client/src/client/mutation-tracker.test.ts b/packages/zero-client/src/client/mutation-tracker.test.ts index b6f19d49b5..379034a6a8 100644 --- a/packages/zero-client/src/client/mutation-tracker.test.ts +++ b/packages/zero-client/src/client/mutation-tracker.test.ts @@ -171,7 +171,10 @@ describe('MutationTracker', () => { expect(onFatalError).toHaveBeenCalledTimes(1); const fatalError = onFatalError.mock.calls[0][0]; expect(fatalError).toBeInstanceOf(ProtocolError); - assert(isServerError(fatalError)); + assert( + isServerError(fatalError), + 'Expected fatalError to be a ServerError', + ); expect(fatalError.kind).toBe(ErrorKind.PushFailed); }); @@ -994,7 +997,10 @@ describe('MutationTracker', () => { expect(onFatalError).toHaveBeenCalledTimes(1); const fatalError = onFatalError.mock.calls[0][0]; expect(fatalError).toBeInstanceOf(ProtocolError); - assert(isServerError(fatalError)); + assert( + isServerError(fatalError), + 'Expected fatalError to be a ServerError', + ); expect(fatalError.kind).toBe(ErrorKind.PushFailed); expect(fatalError.message).toContain('Unsupported push version'); }); @@ -1013,7 +1019,10 @@ describe('MutationTracker', () => { expect(onFatalError).toHaveBeenCalledTimes(1); const fatalError = onFatalError.mock.calls[0][0]; expect(fatalError).toBeInstanceOf(ProtocolError); - assert(isServerError(fatalError)); + assert( + isServerError(fatalError), + 'Expected fatalError to be a ServerError', + ); expect(fatalError.kind).toBe(ErrorKind.PushFailed); expect(fatalError.message).toContain('Unsupported schema version'); }); @@ -1033,7 +1042,10 @@ describe('MutationTracker', () => { expect(onFatalError).toHaveBeenCalledTimes(1); const fatalError = onFatalError.mock.calls[0][0]; expect(fatalError).toBeInstanceOf(ProtocolError); - assert(isServerError(fatalError)); + assert( + isServerError(fatalError), + 'Expected fatalError to be a ServerError', + ); expect(fatalError.kind).toBe(ErrorKind.PushFailed); expect(fatalError.message).toContain('ZeroPusher error'); expect(fatalError.message).toContain('pusher failed'); diff --git a/packages/zero-client/src/client/mutator-proxy.test.ts b/packages/zero-client/src/client/mutator-proxy.test.ts index 7e6d8f4a3f..95bb1e1a92 100644 --- a/packages/zero-client/src/client/mutator-proxy.test.ts +++ b/packages/zero-client/src/client/mutator-proxy.test.ts @@ -448,8 +448,14 @@ describe('MutatorProxy', () => { expect(serverResult.type).toBe('error'); - assert(serverResult.type === 'error'); - assert(serverResult.error.type === 'app'); + assert( + serverResult.type === 'error', + 'Expected server result type to be error', + ); + assert( + serverResult.error.type === 'app', + 'Expected server error type to be app', + ); expect(serverResult.error.message).toBe('validation error'); expect(serverResult.error.details).toEqual({ diff --git a/packages/zero-client/src/client/test-utils.ts b/packages/zero-client/src/client/test-utils.ts index 9c0e96d782..358ff02132 100644 --- a/packages/zero-client/src/client/test-utils.ts +++ b/packages/zero-client/src/client/test-utils.ts @@ -118,12 +118,12 @@ export class TestZero< } get connectionStatus(): ConnectionStatus { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); return this[exposedToTestingSymbol].connectionManager().state.name; } get connectionState(): ConnectionManagerState { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); return this[exposedToTestingSymbol].connectionManager().state; } @@ -151,7 +151,7 @@ export class TestZero< } [createLogOptionsSymbol](options: {consoleLogLevel: LogLevel}): LogOptions { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); return { logLevel: options.consoleLogLevel, logSink: new TestLogSink(), @@ -159,9 +159,12 @@ export class TestZero< } get testLogSink(): TestLogSink { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); const {logSink} = this[exposedToTestingSymbol].logOptions; - assert(logSink instanceof TestLogSink); + assert( + logSink instanceof TestLogSink, + 'Expected logSink to be a TestLogSink instance', + ); return logSink; } @@ -185,7 +188,7 @@ export class TestZero< async triggerMessage(data: Downstream): Promise { const socket = await this.socket; - assert(!socket.closed); + assert(!socket.closed, 'Expected socket to be open'); socket.dispatchEvent( new MessageEvent('message', {data: JSON.stringify(data)}), ); @@ -281,22 +284,22 @@ export class TestZero< declare [exposedToTestingSymbol]: TestingContext; get pusher() { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); return this[exposedToTestingSymbol].pusher; } get puller() { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); return this[exposedToTestingSymbol].puller; } set reload(r: () => void) { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); this[exposedToTestingSymbol].setReload(r); } get queryDelegate() { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); return this[exposedToTestingSymbol].queryDelegate(); } @@ -327,7 +330,7 @@ export class TestZero< * want to simulate that all queries have been fully synced from the server. */ async markAllQueriesAsGot(): Promise { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); const queryManager = this[exposedToTestingSymbol].queryManager(); const gotQueriesPatch = Array.from( queryManager.getAllNonGotQueryHashes(), @@ -468,6 +471,6 @@ export function queryID< R, >(query: Query): string { const id = asQueryInternals(query).customQueryID; - assert(id !== undefined); + assert(id !== undefined, 'Expected query to have a customQueryID'); return hashOfNameAndArgs(id.name, id.args); } diff --git a/packages/zero-client/src/client/worker-test.ts b/packages/zero-client/src/client/worker-test.ts index 0553503fff..05084c759a 100644 --- a/packages/zero-client/src/client/worker-test.ts +++ b/packages/zero-client/src/client/worker-test.ts @@ -72,14 +72,21 @@ async function testBasics(userID: string) { await z.triggerConnected(); await sleep(1); - assert(deepEqual(log, [[]])); + assert( + deepEqual(log, [[]]), + 'Expected initial log to contain one empty array', + ); await z.mutate(upsertE({id: 'foo', value: 1})).client; - assert(deepEqual(log, [[], [{id: 'foo', value: 1}]])); + assert( + deepEqual(log, [[], [{id: 'foo', value: 1}]]), + 'Expected log after first mutation', + ); await z.mutate(upsertE({id: 'foo', value: 2})).client; assert( deepEqual(log, [[], [{id: 'foo', value: 1}], [{id: 'foo', value: 2}]]), + 'Expected log after second mutation', ); removeListener(); @@ -87,6 +94,7 @@ async function testBasics(userID: string) { await z.mutate(upsertE({id: 'foo', value: 3})).client; assert( deepEqual(log, [[], [{id: 'foo', value: 1}], [{id: 'foo', value: 2}]]), + 'Expected log unchanged after listener removed', ); const view2 = z.materialize(q); @@ -94,5 +102,8 @@ async function testBasics(userID: string) { view2.addListener(rows => { data = [...rows]; }); - assert(deepEqual(data, [{id: 'foo', value: 3}])); + assert( + deepEqual(data, [{id: 'foo', value: 3}]), + 'Expected materialized view data', + ); } diff --git a/packages/zero-client/src/client/zero.test.ts b/packages/zero-client/src/client/zero.test.ts index 2006f2bd58..b9472613df 100644 --- a/packages/zero-client/src/client/zero.test.ts +++ b/packages/zero-client/src/client/zero.test.ts @@ -3214,7 +3214,10 @@ describe('Disconnect on hide', () => { const changeVisibilityState = ( newVisibilityState: DocumentVisibilityState, ) => { - assert(visibilityState !== newVisibilityState); + assert( + visibilityState !== newVisibilityState, + 'Expected visibility state to change', + ); visibilityState = newVisibilityState; document.dispatchEvent(new Event('visibilitychange')); }; @@ -3277,7 +3280,7 @@ test(ErrorKind.InvalidConnectionRequest, async () => { }); expect(z.connectionStatus).toBe(ConnectionStatus.Error); const msg = z.testLogSink.messages.at(-1); - assert(msg); + assert(msg, 'Expected log sink to have at least one message'); expect(msg[0]).toBe('error'); @@ -3374,7 +3377,10 @@ describe('Downstream handler errors', () => { expect(spy).toHaveBeenCalledTimes(1); expect(z.connectionStatus).toBe(ConnectionStatus.Error); - assert(z.connectionState.name === ConnectionStatus.Error); + assert( + z.connectionState.name === ConnectionStatus.Error, + 'Expected connection state to be Error', + ); const {reason} = z.connectionState; expect(reason).toBeInstanceOf(ClientError); expect(reason.kind).toBe(ClientErrorKind.Internal); @@ -3440,8 +3446,8 @@ describe('Mutation responses poked down', () => { await vi.advanceTimersByTimeAsync(100); const result = await mutation.server; expect(result.type).toBe('error'); - assert(result.type === 'error'); - assert(result.error.type === 'app'); + assert(result.type === 'error', 'Expected result type to be error'); + assert(result.error.type === 'app', 'Expected error type to be app'); expect(result.error.message).toBe('...test '); expect(result.error.details).toBeUndefined(); @@ -4305,7 +4311,10 @@ describe('WebSocket event error handling', () => { await z.waitForConnectionStatus(ConnectionStatus.Error); expect(z.connectionStatus).toBe(ConnectionStatus.Error); - assert(z.connectionState.name === ConnectionStatus.Error); + assert( + z.connectionState.name === ConnectionStatus.Error, + 'Expected connection state to be Error after onOpen failure', + ); const {reason} = z.connectionState; expect(reason).toBeInstanceOf(ClientError); expect(reason.kind).toBe(ClientErrorKind.Internal); @@ -4332,7 +4341,10 @@ describe('WebSocket event error handling', () => { await z.waitForConnectionStatus(ConnectionStatus.Error); expect(z.connectionStatus).toBe(ConnectionStatus.Error); - assert(z.connectionState.name === ConnectionStatus.Error); + assert( + z.connectionState.name === ConnectionStatus.Error, + 'Expected connection state to be Error after onClose failure', + ); const {reason} = z.connectionState; expect(reason).toBeInstanceOf(ClientError); expect(reason.kind).toBe(ClientErrorKind.Internal); @@ -4364,7 +4376,7 @@ test('socket close code 1006 is logged as info, not error', async () => { ([, , args]) => Array.isArray(args) && args[0] === 'Got socket close event', ); expect(closeLog).toBeDefined(); - assert(closeLog); + assert(closeLog, 'Expected close log entry to be defined'); expect(closeLog[0]).toBe('info'); expect(closeLog[2][1]).toEqual({code: 1006, reason: '', wasClean: false}); diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index 0a9bc11388..b280bf7b71 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -304,7 +304,7 @@ const internalReplicacheImplMap = new WeakMap(); export function getInternalReplicacheImplForTesting( z: object, ): ReplicacheImpl { - assert(TESTING); + assert(TESTING, 'Expected TESTING to be true'); return must(internalReplicacheImplMap.get(z)); } diff --git a/packages/zero-schema/src/permissions.ts b/packages/zero-schema/src/permissions.ts index b918f069c7..009ed15e33 100644 --- a/packages/zero-schema/src/permissions.ts +++ b/packages/zero-schema/src/permissions.ts @@ -289,7 +289,10 @@ class CallTracker { if (prop === toStaticParam) { return target[toStaticParam]; } - assert(typeof prop === 'string'); + assert( + typeof prop === 'string', + () => `Expected prop to be a string, got ${typeof prop}`, + ); const path = [...this.#path, prop]; return new Proxy( { diff --git a/packages/zero-server/src/queries/process-queries.test.ts b/packages/zero-server/src/queries/process-queries.test.ts index 202d932277..eec972451b 100644 --- a/packages/zero-server/src/queries/process-queries.test.ts +++ b/packages/zero-server/src/queries/process-queries.test.ts @@ -52,7 +52,10 @@ describe('handleGetQueriesRequest', () => { expect(cb).toHaveBeenCalledWith('namesByFoo', [{foo: 'bar'}]); expect(result[0]).toBe('transformed'); - assert(result[0] === 'transformed'); + assert( + result[0] === 'transformed', + `Expected result type to be 'transformed'`, + ); const [response] = result[1]; assert(!('error' in response)); expect(response).toEqual({ @@ -177,7 +180,10 @@ describe('handleGetQueriesRequest', () => { expect(cb).toHaveBeenCalledTimes(2); expect(result[0]).toBe('transformed'); - assert(result[0] === 'transformed'); + assert( + result[0] === 'transformed', + `Expected result type to be 'transformed'`, + ); const [first, second] = result[1]; expect(first).toEqual({ error: 'app', @@ -205,7 +211,10 @@ describe('handleGetQueriesRequest', () => { ]); expect(result[0]).toBe('transformed'); - assert(result[0] === 'transformed'); + assert( + result[0] === 'transformed', + `Expected result type to be 'transformed'`, + ); const [response] = result[1]; expect(response).toEqual({ error: 'app', @@ -232,7 +241,10 @@ describe('handleGetQueriesRequest', () => { ]); expect(result[0]).toBe('transformed'); - assert(result[0] === 'transformed'); + assert( + result[0] === 'transformed', + `Expected result type to be 'transformed'`, + ); const [response] = result[1]; expect(response).toEqual({ error: 'app', @@ -258,7 +270,10 @@ describe('handleGetQueriesRequest', () => { ]); expect(result[0]).toBe('transformed'); - assert(result[0] === 'transformed'); + assert( + result[0] === 'transformed', + `Expected result type to be 'transformed'`, + ); const [response] = result[1]; expect(response).toEqual({ error: 'parse', @@ -294,7 +309,10 @@ describe('handleGetQueriesRequest', () => { expect(cb).toHaveBeenCalledTimes(2); expect(result[0]).toBe('transformed'); - assert(result[0] === 'transformed'); + assert( + result[0] === 'transformed', + `Expected result type to be 'transformed'`, + ); const [first, second] = result[1]; expect(first).toEqual({ error: 'parse', @@ -333,7 +351,10 @@ describe('handleGetQueriesRequest', () => { ]); expect(result[0]).toBe('transformFailed'); - assert(result[0] === 'transformFailed'); + assert( + result[0] === 'transformFailed', + `Expected result type to be 'transformFailed'`, + ); expect(result[1]).toEqual({ reason: ErrorReason.Internal, kind: expect.any(String), @@ -503,7 +524,10 @@ describe('handleTransformRequest', () => { expect(cb).toHaveBeenCalledTimes(2); expect(result[0]).toBe('transformed'); - assert(result[0] === 'transformed'); + assert( + result[0] === 'transformed', + `Expected result type to be 'transformed'`, + ); const [first, second] = result[1]; expect(first).toEqual({ error: 'app', diff --git a/packages/zero-solid/src/use-query.test.tsx b/packages/zero-solid/src/use-query.test.tsx index fd53873d12..413378b177 100644 --- a/packages/zero-solid/src/use-query.test.tsx +++ b/packages/zero-solid/src/use-query.test.tsx @@ -217,7 +217,7 @@ test('useQuery gets an error', async () => { await new Promise(r => setTimeout(r, 0)); const r = resultType(); - assert(r.type === 'error'); + assert(r.type === 'error', 'Expected result type to be error'); expect(r.error).toEqual({ message: 'Something went wrong', details: {something: 'went wrong'}, diff --git a/packages/zero/tool/build.ts b/packages/zero/tool/build.ts index 771216b618..01ea9a599f 100644 --- a/packages/zero/tool/build.ts +++ b/packages/zero/tool/build.ts @@ -78,7 +78,7 @@ function getWorkerEntryPoints(): Record { const entryPoints: Record = {}; for (const url of Object.values(workerUrls)) { - assert(url instanceof URL); + assert(url instanceof URL, 'Expected worker URL to be a URL instance'); const worker = basename(url.pathname); diff --git a/packages/zql/src/builder/filter.ts b/packages/zql/src/builder/filter.ts index 4bc487960e..146726534a 100644 --- a/packages/zql/src/builder/filter.ts +++ b/packages/zql/src/builder/filter.ts @@ -131,12 +131,15 @@ function createPredicateImpl( case 'NOT ILIKE': return not(getLikePredicate(rhs, 'i')); case 'IN': { - assert(Array.isArray(rhs)); + assert(Array.isArray(rhs), 'Expected rhs to be an array for IN operator'); const set = new Set(rhs); return lhs => set.has(lhs); } case 'NOT IN': { - assert(Array.isArray(rhs)); + assert( + Array.isArray(rhs), + 'Expected rhs to be an array for NOT IN operator', + ); const set = new Set(rhs); return lhs => !set.has(lhs); } diff --git a/packages/zql/src/builder/test-builder-delegate.ts b/packages/zql/src/builder/test-builder-delegate.ts index bca9db6418..1d9e9c0743 100644 --- a/packages/zql/src/builder/test-builder-delegate.ts +++ b/packages/zql/src/builder/test-builder-delegate.ts @@ -38,7 +38,10 @@ export class TestBuilderDelegate implements BuilderDelegate { } createStorage(name: string): Storage { - assert(!Object.hasOwn(this.#storage, name)); + assert( + !Object.hasOwn(this.#storage, name), + () => `Storage "${name}" already exists`, + ); const storage = new MemoryStorage(); this.#storage[name] = storage; return storage; diff --git a/packages/zql/src/ivm/constraint.ts b/packages/zql/src/ivm/constraint.ts index 1532fc237f..6dfc239514 100644 --- a/packages/zql/src/ivm/constraint.ts +++ b/packages/zql/src/ivm/constraint.ts @@ -165,7 +165,7 @@ export class SetOfConstraint { constructor() { // Only used in testing - assert(TESTING); + assert(TESTING, 'SetOfConstraint is only available in testing'); } #indexOf(value: Constraint): number { diff --git a/packages/zql/src/ivm/flipped-join.fetch.test.ts b/packages/zql/src/ivm/flipped-join.fetch.test.ts index 02ee3eafbb..887bb4142b 100644 --- a/packages/zql/src/ivm/flipped-join.fetch.test.ts +++ b/packages/zql/src/ivm/flipped-join.fetch.test.ts @@ -1899,8 +1899,11 @@ suite('compound join keys', () => { }); function fetchTest(t: FetchTest): FetchTestResults { - assert(t.sources.length > 0); - assert(t.joins.length === t.sources.length - 1); + assert(t.sources.length > 0, 'Expected at least one source'); + assert( + t.joins.length === t.sources.length - 1, + 'Expected joins.length to equal sources.length - 1', + ); const log: SnitchMessage[] = []; diff --git a/packages/zql/src/ivm/flipped-join.sibling.test.ts b/packages/zql/src/ivm/flipped-join.sibling.test.ts index 7815002738..c5ac0fa9a6 100644 --- a/packages/zql/src/ivm/flipped-join.sibling.test.ts +++ b/packages/zql/src/ivm/flipped-join.sibling.test.ts @@ -1097,8 +1097,11 @@ suite('sibling relationships tests with issues, comments, and owners', () => { }); function pushSiblingTest(t: PushTestSibling): PushTestSiblingResults { - assert(t.sources.length > 0); - assert(t.joins.length === t.sources.length - 1); + assert(t.sources.length > 0, 'Expected at least one source'); + assert( + t.joins.length === t.sources.length - 1, + 'Expected joins.length to equal sources.length - 1', + ); const log: SnitchMessage[] = []; diff --git a/packages/zql/src/ivm/join.fetch.test.ts b/packages/zql/src/ivm/join.fetch.test.ts index ed5f276f0d..ebec7e624f 100644 --- a/packages/zql/src/ivm/join.fetch.test.ts +++ b/packages/zql/src/ivm/join.fetch.test.ts @@ -2066,8 +2066,11 @@ suite('compound join keys', () => { // Despite the name, this test runs the join through two phases: // hydrate, fetch. function fetchTest(t: FetchTest): FetchTestResults { - assert(t.sources.length > 0); - assert(t.joins.length === t.sources.length - 1); + assert(t.sources.length > 0, 'Expected at least one source'); + assert( + t.joins.length === t.sources.length - 1, + 'Expected joins.length to equal sources.length - 1', + ); const log: SnitchMessage[] = []; diff --git a/packages/zql/src/ivm/join.sibling.test.ts b/packages/zql/src/ivm/join.sibling.test.ts index 2f2fe39448..35b2581296 100644 --- a/packages/zql/src/ivm/join.sibling.test.ts +++ b/packages/zql/src/ivm/join.sibling.test.ts @@ -700,8 +700,11 @@ suite('sibling relationships tests with issues, comments, and owners', () => { }); function pushSiblingTest(t: PushTestSibling): PushTestSiblingResults { - assert(t.sources.length > 0); - assert(t.joins.length === t.sources.length - 1); + assert(t.sources.length > 0, 'Expected at least one source'); + assert( + t.joins.length === t.sources.length - 1, + 'Expected joins.length to equal sources.length - 1', + ); const log: SnitchMessage[] = []; diff --git a/packages/zql/src/ivm/take.fetch.test.ts b/packages/zql/src/ivm/take.fetch.test.ts index 198dced6db..554989ad75 100644 --- a/packages/zql/src/ivm/take.fetch.test.ts +++ b/packages/zql/src/ivm/take.fetch.test.ts @@ -1425,8 +1425,14 @@ function takeTest(t: TakeTest): TakeTestResults { const {partitionKey} = t; const take = new Take(snitch, storage, t.limit, partitionKey); if (t.partitionKey === undefined) { - assert(t.partitionValues.length === 1); - assert(t.partitionValues[0] === undefined); + assert( + t.partitionValues.length === 1, + 'Expected exactly one partition value when partitionKey is undefined', + ); + assert( + t.partitionValues[0] === undefined, + 'Expected partition value to be undefined when partitionKey is undefined', + ); } const results: TakeTestResults = { partitions: [], diff --git a/packages/zql/src/query/expression.test.ts b/packages/zql/src/query/expression.test.ts index df826e42a8..de07880dd1 100644 --- a/packages/zql/src/query/expression.test.ts +++ b/packages/zql/src/query/expression.test.ts @@ -209,7 +209,10 @@ test('compare test framework to real framework', () => { ); function convertTestCondition(c: TestCondition): Condition { - assert(c.type === 'simple'); + assert( + c.type === 'simple', + () => `Expected condition type to be 'simple', got '${c.type}'`, + ); return { type: 'simple', right: { @@ -300,42 +303,64 @@ test('not preserves flip and scalar on correlatedSubquery', () => { // flip: true is preserved const withFlipTrue = not({...base, flip: true}); - assert(withFlipTrue.type === 'correlatedSubquery'); + assert( + withFlipTrue.type === 'correlatedSubquery', + () => `Expected type 'correlatedSubquery', got '${withFlipTrue.type}'`, + ); expect(withFlipTrue.op).toBe('NOT EXISTS'); expect(withFlipTrue.flip).toBe(true); // flip: false is preserved (not dropped) const withFlipFalse = not({...base, flip: false}); - assert(withFlipFalse.type === 'correlatedSubquery'); + assert( + withFlipFalse.type === 'correlatedSubquery', + () => `Expected type 'correlatedSubquery', got '${withFlipFalse.type}'`, + ); expect(withFlipFalse.op).toBe('NOT EXISTS'); expect(withFlipFalse.flip).toBe(false); // flip: undefined is not present const withFlipUndefined = not({...base}); - assert(withFlipUndefined.type === 'correlatedSubquery'); + assert( + withFlipUndefined.type === 'correlatedSubquery', + () => `Expected type 'correlatedSubquery', got '${withFlipUndefined.type}'`, + ); expect(withFlipUndefined.op).toBe('NOT EXISTS'); expect('flip' in withFlipUndefined).toBe(false); // scalar: true is preserved const withScalarTrue = not({...base, scalar: true}); - assert(withScalarTrue.type === 'correlatedSubquery'); + assert( + withScalarTrue.type === 'correlatedSubquery', + () => `Expected type 'correlatedSubquery', got '${withScalarTrue.type}'`, + ); expect(withScalarTrue.op).toBe('NOT EXISTS'); expect(withScalarTrue.scalar).toBe(true); // scalar: false is preserved (not dropped) const withScalarFalse = not({...base, scalar: false}); - assert(withScalarFalse.type === 'correlatedSubquery'); + assert( + withScalarFalse.type === 'correlatedSubquery', + () => `Expected type 'correlatedSubquery', got '${withScalarFalse.type}'`, + ); expect(withScalarFalse.op).toBe('NOT EXISTS'); expect(withScalarFalse.scalar).toBe(false); // scalar: undefined is not present const withScalarUndefined = not({...base}); - assert(withScalarUndefined.type === 'correlatedSubquery'); + assert( + withScalarUndefined.type === 'correlatedSubquery', + () => + `Expected type 'correlatedSubquery', got '${withScalarUndefined.type}'`, + ); expect('scalar' in withScalarUndefined).toBe(false); // both flip and scalar preserved together const withBoth = not({...base, flip: false, scalar: true}); - assert(withBoth.type === 'correlatedSubquery'); + assert( + withBoth.type === 'correlatedSubquery', + () => `Expected type 'correlatedSubquery', got '${withBoth.type}'`, + ); expect(withBoth.op).toBe('NOT EXISTS'); expect(withBoth.flip).toBe(false); expect(withBoth.scalar).toBe(true); diff --git a/packages/zql/src/query/query-registry.test.ts b/packages/zql/src/query/query-registry.test.ts index c9f3a45aaa..0b6549799c 100644 --- a/packages/zql/src/query/query-registry.test.ts +++ b/packages/zql/src/query/query-registry.test.ts @@ -1104,8 +1104,8 @@ describe('getQuery', () => { expect(query1).toBe(queries.getUser); expect(query2).toBe(queries.nested.getBar); - assert(query1); - assert(query2); + assert(query1, 'Expected query1 to be defined'); + assert(query2, 'Expected query2 to be defined'); // The runtime of this property is not the same as the type. expect(query1['~']).toEqual('Query'); diff --git a/packages/zql/src/query/test/query-delegate.ts b/packages/zql/src/query/test/query-delegate.ts index 69236e27ea..826aa5aee4 100644 --- a/packages/zql/src/query/test/query-delegate.ts +++ b/packages/zql/src/query/test/query-delegate.ts @@ -110,7 +110,7 @@ export class QueryDelegateImpl extends QueryDelegateBase { const query = this.addedServerQueries.find(({ast: otherAST}) => deepEqual(otherAST, ast), ); - assert(query); + assert(query, 'Expected matching server query for updateServerQuery'); query.ttl = ttl; } @@ -120,7 +120,7 @@ export class QueryDelegateImpl extends QueryDelegateBase { name === customQueryID.name && (args === undefined || deepEqual(args, customQueryID.args)), ); - assert(query); + assert(query, 'Expected matching server query for updateCustomQuery'); query.ttl = ttl; } diff --git a/packages/zqlite/src/table-source.test.ts b/packages/zqlite/src/table-source.test.ts index 94faaf8aa7..50f3aa75a2 100644 --- a/packages/zqlite/src/table-source.test.ts +++ b/packages/zqlite/src/table-source.test.ts @@ -190,7 +190,7 @@ describe('fetching from a table source', () => { const rows = out.fetch(fetchArgs); expect( rows.map(r => { - assert(r !== 'yield'); + assert(r !== 'yield', 'Expected row result, not yield'); return r.row; }), ).toEqual(expectedRows); From 0497b895c08437f105dc96483042baf1361bf680 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 3 Mar 2026 18:27:41 -0800 Subject: [PATCH 125/495] chore(zero-cache): filter changes for non-syncable tables during advance (#5636) Detect and exclude change log entries for non-syncable tables, which includes both backfilling tables and those without a primary key. --- .../view-syncer/pipeline-driver.test.ts | 19 ++-- .../services/view-syncer/pipeline-driver.ts | 13 ++- .../services/view-syncer/snapshotter.test.ts | 90 ++++++++++++++++--- .../src/services/view-syncer/snapshotter.ts | 26 ++++-- 4 files changed, 122 insertions(+), 26 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts index f4f6651c66..b297e644cb 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts @@ -67,7 +67,7 @@ describe('view-syncer/pipeline-driver', () => { db = dbFile.connect(lc); initReplicationState(db, ['zero_data'], '123'); - db.exec(` + db.exec(/*sql*/ ` CREATE TABLE "${mutationsTableName}" ( "clientGroupID" TEXT, "clientID" TEXT, @@ -124,19 +124,22 @@ describe('view-syncer/pipeline-driver', () => { INSERT INTO "uniques" (id, name, _0_version) VALUES ('foo', 'bar', '123'); INSERT INTO "uniques" (id, name, _0_version) VALUES ('boo', 'dar', '123'); + + CREATE TABLE backfilling (id TEXT PRIMARY KEY, _0_version TEXT NOT NULL); `); - // Initialize ColumnMetadata and mark a column as being backfilled, + // Initialize ColumnMetadata and mark columns/tables as being backfilled, // to verify that it does not appear in the pipeline results. populateFromExistingTables(db, listTables(db, false)); - db.prepare( - /*sql*/ ` + db.exec(/*sql*/ ` UPDATE "_zero.column_metadata" SET backfill = '{"upstreamID":123}' WHERE table_name = 'comments' - AND column_name = 'stillBeingBackfilled' - `, - ).run(); + AND column_name = 'stillBeingBackfilled'; + UPDATE "_zero.column_metadata" + SET backfill = '{"upstreamID":456}' + WHERE table_name = 'backfilling' ; + `); replicator = fakeReplicator(lc, db); }); @@ -418,6 +421,7 @@ describe('view-syncer/pipeline-driver', () => { comments: 'id', issueLabels: ['issueID', 'labelID'], uniques: 'id', + backfilling: 'id', [mutationsTableName]: ['clientGroupID', 'clientID', 'mutationID'], }); @@ -672,6 +676,7 @@ describe('view-syncer/pipeline-driver', () => { issueID: '4', upvotes: BigInt(Number.MAX_SAFE_INTEGER), }), + messages.insert('backfilling', {id: 123}), // should be ignored messages.insert('issues', {id: '4', closed: 0}), ); diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 494de0036c..c447edb044 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -14,8 +14,8 @@ import { import type {Change} from '../../../../zql/src/ivm/change.ts'; import type {Node} from '../../../../zql/src/ivm/data.ts'; import { - type Input, skipYields, + type Input, type Storage, } from '../../../../zql/src/ivm/operator.ts'; import type {SourceSchema} from '../../../../zql/src/ivm/schema.ts'; @@ -135,6 +135,7 @@ export class PipelineDriver { readonly #logConfig: LogConfig; readonly #config: ZeroConfig | undefined; readonly #tableSpecs = new Map(); + readonly #allTableNames = new Set(); readonly #costModels: WeakMap | undefined; readonly #yieldThresholdMs: () => number; #streamer: Streamer | null = null; @@ -214,6 +215,7 @@ export class PipelineDriver { } this.#pipelines.clear(); this.#tables.clear(); + this.#allTableNames.clear(); this.#initAndResetCommon(clientSchema); } @@ -233,6 +235,10 @@ export class PipelineDriver { this.#tableSpecs, fullTables, ); + this.#allTableNames.clear(); + for (const table of fullTables.keys()) { + this.#allTableNames.add(table); + } const primaryKeys = this.#primaryKeys ?? new Map(); this.#primaryKeys = primaryKeys; primaryKeys.clear(); @@ -593,7 +599,10 @@ export class PipelineDriver { this.initialized(), 'Pipeline driver must be initialized before advancing', ); - const diff = this.#snapshotter.advance(this.#tableSpecs); + const diff = this.#snapshotter.advance( + this.#tableSpecs, + this.#allTableNames, + ); const {prev, curr, changes} = diff; this.#lc.debug?.( `advance ${prev.version} => ${curr.version}: ${changes} changes`, diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts index 348a9c2799..e2353be1df 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts @@ -22,6 +22,7 @@ describe('view-syncer/snapshotter', () => { let dbFile: DbFile; let replicator: FakeReplicator; let tableSpecs: Map; + let allTableNames: Set; let s: Snapshotter; beforeEach(() => { @@ -54,6 +55,8 @@ describe('view-syncer/snapshotter', () => { INSERT INTO users(id, handle, ignore, _0_version) VALUES(10, 'alice', 'vvv', '01'); INSERT INTO users(id, handle, ignore, _0_version) VALUES(20, 'bob', 'vxv', '01'); + + CREATE TABLE backfilling(id INT PRIMARY KEY, _0_version TEXT NOT NULL); `); initReplicationState(db, ['zero_data'], '01'); @@ -70,6 +73,7 @@ describe('view-syncer/snapshotter', () => { ).run(); tableSpecs = computeZqlSpecs(lc, db, {includeBackfillingColumns: false}); + allTableNames = new Set(tableSpecs.keys()); replicator = fakeReplicator(lc, db); s = new Snapshotter(lc, dbFile.path, {appID: 'my_app'}).init(); @@ -123,7 +127,7 @@ describe('view-syncer/snapshotter', () => { expect(version).toBe('01'); - const diff = s.advance(tableSpecs); + const diff = s.advance(tableSpecs, allTableNames); expect(diff.prev.version).toBe('01'); expect(diff.curr.version).toBe('01'); expect(diff.changes).toBe(0); @@ -135,6 +139,7 @@ describe('view-syncer/snapshotter', () => { issues: 'id', users: 'id', comments: 'id', + backfilling: 'id', ['my_app.permissions']: 'lock', }); @@ -147,7 +152,7 @@ describe('view-syncer/snapshotter', () => { ); replicator.processTransaction('09'); - const diff = s.advance(tableSpecs); + const diff = s.advance(tableSpecs, allTableNames); expect(diff.prev.version).toBe('01'); expect(diff.curr.version).toBe('09'); expect(diff.changes).toBe(1); @@ -181,6 +186,71 @@ describe('view-syncer/snapshotter', () => { `); }); + test('non-syncable tables skipped', () => { + expect(s.current().version).toBe('01'); + + replicator.processTransaction( + '09', + messages.insert('users', {id: 20, handle: 'alice'}), + messages.insert('backfilling', {id: 30}), + messages.insert('users', {id: 30, handle: 'bob'}), + ); + replicator.processTransaction('09'); + + // simulate the backfilling table being non-syncable + tableSpecs.delete('backfilling'); + const diff = s.advance(tableSpecs, allTableNames); + expect(diff.prev.version).toBe('01'); + expect(diff.curr.version).toBe('09'); + expect(diff.changes).toBe(3); + + expect([...diff]).toMatchInlineSnapshot(` + [ + { + "nextValue": { + "_0_version": "09", + "handle": "alice", + "id": 20, + }, + "prevValues": [ + { + "_0_version": "01", + "handle": "bob", + "id": 20, + }, + { + "_0_version": "01", + "handle": "alice", + "id": 10, + }, + ], + "rowKey": { + "id": 20, + }, + "table": "users", + }, + { + "nextValue": { + "_0_version": "09", + "handle": "bob", + "id": 30, + }, + "prevValues": [ + { + "_0_version": "01", + "handle": "bob", + "id": 20, + }, + ], + "rowKey": { + "id": 30, + }, + "table": "users", + }, + ] + `); + }); + test('concurrent snapshot diffs', () => { const s1 = new Snapshotter(lc, dbFile.path, {appID: 'my_app'}).init(); const s2 = new Snapshotter(lc, dbFile.path, {appID: 'my_app'}).init(); @@ -196,7 +266,7 @@ describe('view-syncer/snapshotter', () => { messages.delete('issues', {id: 3}), ); - const diff1 = s1.advance(tableSpecs); + const diff1 = s1.advance(tableSpecs, allTableNames); expect(diff1.prev.version).toBe('01'); expect(diff1.curr.version).toBe('09'); expect(diff1.changes).toBe(5); // The key update results in a del(old) + set(new). @@ -371,7 +441,7 @@ describe('view-syncer/snapshotter', () => { messages.update('issues', {id: 2, owner: 10, desc: 'bard'}, {id: 5}), ); - const diff2 = s1.advance(tableSpecs); + const diff2 = s1.advance(tableSpecs, allTableNames); expect(diff2.prev.version).toBe('09'); expect(diff2.curr.version).toBe('0d'); expect(diff2.changes).toBe(3); @@ -436,7 +506,7 @@ describe('view-syncer/snapshotter', () => { // The diff for s2 goes straight from '00' to '08'. // This will coalesce multiple changes to a row, and can result in some noops, // (e.g. rows that return to their original state). - const diff3 = s2.advance(tableSpecs); + const diff3 = s2.advance(tableSpecs, allTableNames); expect(diff3.prev.version).toBe('01'); expect(diff3.curr.version).toBe('0d'); expect(diff3.changes).toBe(5); @@ -511,7 +581,7 @@ describe('view-syncer/snapshotter', () => { replicator.processTransaction('07', messages.truncate('users')); - const diff = s.advance(tableSpecs); + const diff = s.advance(tableSpecs, allTableNames); expect(diff.prev.version).toBe('01'); expect(diff.curr.version).toBe('07'); expect(diff.changes).toBe(1); @@ -533,7 +603,7 @@ describe('view-syncer/snapshotter', () => { }), ); - const diff = s.advance(tableSpecs); + const diff = s.advance(tableSpecs, allTableNames); expect(diff.prev.version).toBe('01'); expect(diff.curr.version).toBe('07'); expect(diff.changes).toBe(1); @@ -548,7 +618,7 @@ describe('view-syncer/snapshotter', () => { replicator.processTransaction('07', messages.insert('comments', {id: 1})); - const diff = s.advance(tableSpecs); + const diff = s.advance(tableSpecs, allTableNames); let currStmts = 0; const abortError = new Error('aborted iteration'); @@ -585,7 +655,7 @@ describe('view-syncer/snapshotter', () => { messages.addColumn('comments', 'likes', {dataType: 'INT4', pos: 0}), ); - const diff = s.advance(tableSpecs); + const diff = s.advance(tableSpecs, allTableNames); expect(diff.prev.version).toBe('01'); expect(diff.curr.version).toBe('07'); expect(diff.changes).toBe(1); @@ -605,7 +675,7 @@ describe('view-syncer/snapshotter', () => { messages.insert('users', {id: 30, handle: null}), ); - const diff = s.advance(tableSpecs); + const diff = s.advance(tableSpecs, allTableNames); expect(diff.curr.version).toBe('05'); // Spy on the statement cache to see what queries are generated diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.ts index 92b1e88556..eb72ceb4be 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.ts @@ -1,7 +1,6 @@ import type {LogContext} from '@rocicorp/logger'; import {assert} from '../../../../shared/src/asserts.ts'; import {stringify, type JSONValue} from '../../../../shared/src/bigint-json.ts'; -import {must} from '../../../../shared/src/must.ts'; import * as v from '../../../../shared/src/valita.ts'; import type {Row} from '../../../../zero-protocol/src/data.ts'; import type {PrimaryKey} from '../../../../zero-types/src/schema.ts'; @@ -170,9 +169,12 @@ export class Snapshotter { * on `prev` before each iteration, and (2) rollback to the save point after * the iteration. */ - advance(tables: Map): SnapshotDiff { + advance( + syncableTables: Map, + allTableNames: Set, + ): SnapshotDiff { const {prev, curr} = this.advanceWithoutDiff(); - return new Diff(this.#appID, tables, prev, curr); + return new Diff(this.#appID, syncableTables, allTableNames, prev, curr); } advanceWithoutDiff() { @@ -379,19 +381,22 @@ class Snapshot { class Diff implements SnapshotDiff { readonly #permissionsTable: string; - readonly tables: Map; + readonly #syncableTables: Map; + readonly #allTableNames: Set; readonly prev: Snapshot; readonly curr: Snapshot; readonly changes: number; constructor( appID: string, - tables: Map, + syncableTables: Map, + allTableNames: Set, prev: Snapshot, curr: Snapshot, ) { this.#permissionsTable = `${appID}.permissions`; - this.tables = tables; + this.#syncableTables = syncableTables; + this.#allTableNames = allTableNames; this.prev = prev; this.curr = curr; this.changes = curr.numChangesSince(prev.version); @@ -432,7 +437,14 @@ class Diff implements SnapshotDiff { `table ${table} has been truncated`, ); } - const {tableSpec, zqlSpec} = must(this.tables.get(table)); + const specs = this.#syncableTables.get(table); + if (!specs) { + if (this.#allTableNames.has(table)) { + continue; // skip change log entries for non-syncable tables. + } + throw new Error(`change for unknown table ${table}`); + } + const {tableSpec, zqlSpec} = specs; assert(rowKey !== null, 'rowKey must be present for row changes'); const nextValue = From 5d1a195c158c2f3fe862941a3418a56613f2dd11 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Wed, 4 Mar 2026 09:50:46 -0500 Subject: [PATCH 126/495] fix(zero-server): skip the mutation if the retry tx succeeds (#5634) --- .../zero-server/src/process-mutations.test.ts | 159 +++++++++++++++++- packages/zero-server/src/process-mutations.ts | 37 ++-- 2 files changed, 175 insertions(+), 21 deletions(-) diff --git a/packages/zero-server/src/process-mutations.test.ts b/packages/zero-server/src/process-mutations.test.ts index 12ab9bed32..b76dc9fa33 100644 --- a/packages/zero-server/src/process-mutations.test.ts +++ b/packages/zero-server/src/process-mutations.test.ts @@ -113,6 +113,8 @@ function createTrackingDatabase(options: TrackingDatabaseOptions = {}): { } // Track whether updateClientMutationID was called in this transaction let lmidWasUpdated = false; + // Buffer results to simulate rollback on transaction failure + const pendingResults: MutationResponse[] = []; const resultPromise = Promise.resolve( callback(undefined, { updateClientMutationID: () => { @@ -131,7 +133,7 @@ function createTrackingDatabase(options: TrackingDatabaseOptions = {}): { return Promise.resolve({lastMutationID}); }, writeMutationResult: result => { - recordedResults.push(result); + pendingResults.push(result); return Promise.resolve(); }, deleteMutationResults: args => { @@ -154,10 +156,11 @@ function createTrackingDatabase(options: TrackingDatabaseOptions = {}): { throw postTransactionError; } - // Only record LMID if updateClientMutationID was called (simulates tx commit) + // Only record on commit (simulates tx commit) if (lmidWasUpdated) { recordedLMIDs.push(transactionInput?.mutationID ?? 0); } + recordedResults.push(...pendingResults); return result; }); @@ -754,6 +757,158 @@ describe('handleMutateRequest', () => { expect(recordedResults).toEqual([]); }); + test.each([ + { + errorProviderKey: 'postTransactionErrorProvider' as const, + errorMsg: 'transient db timeout', + }, + { + errorProviderKey: 'transactionErrorProvider' as const, + errorMsg: 'connection refused', + }, + ])( + 'retries on $errorProviderKey failure and returns app error when retry succeeds', + async ({errorProviderKey, errorMsg}) => { + const { + db: flakyDb, + recordedLMIDs, + recordedResults, + } = createTrackingDatabase({ + // Fail only on the first transaction attempt for mutationID 2 + [errorProviderKey]: ({ + mutationID, + transactionCount, + }: { + mutationID: number | undefined; + transactionCount: number; + }) => + mutationID === 2 && transactionCount === 2 + ? new Error(errorMsg) + : undefined, + }); + + const response = await handleMutateRequest( + flakyDb, + (transact, _mutation) => + transact((_tx, _name, _args) => promiseUndefined), + baseQuery, + makePushBody([ + makeCustomMutation({id: 1}), + makeCustomMutation({id: 2}), + ]), + ); + + // Both mutations complete; the second is retried and treated as app error + expect(response).toEqual({ + mutations: [ + { + id: {clientID: 'cid', id: 1}, + result: {}, + }, + { + id: {clientID: 'cid', id: 2}, + result: { + error: 'app', + message: errorMsg, + }, + }, + ], + }); + + // Both LMIDs are persisted (first attempt for m1, retry for m2) + expect(recordedLMIDs).toEqual([1, 2]); + // The retry persists the error result + expect(recordedResults).toEqual([ + { + id: {clientID: 'cid', id: 2}, + result: { + error: 'app', + message: errorMsg, + }, + }, + ]); + }, + ); + + test.each([ + { + errorProviderKey: 'postTransactionErrorProvider' as const, + errorMsg: 'persistent db failure', + }, + { + errorProviderKey: 'transactionErrorProvider' as const, + errorMsg: 'persistent connection failure', + }, + ])( + 'retry double failure with $errorProviderKey returns database error', + async ({errorProviderKey, errorMsg}) => { + const { + db: flakyDb, + recordedLMIDs, + recordedResults, + } = createTrackingDatabase({ + // Fail both attempts for mutationID 2 + [errorProviderKey]: ({mutationID}: {mutationID: number | undefined}) => + mutationID === 2 ? new Error(errorMsg) : undefined, + }); + + const response = await handleMutateRequest( + flakyDb, + (transact, _mutation) => + transact((_tx, _name, _args) => promiseUndefined), + baseQuery, + makePushBody([ + makeCustomMutation({id: 1}), + makeCustomMutation({id: 2}), + ]), + ); + + expect(response).toMatchObject({ + kind: ErrorKind.PushFailed, + origin: ErrorOrigin.Server, + reason: ErrorReason.Database, + message: expect.stringContaining(errorMsg), + mutationIDs: [{id: 2, clientID: 'cid'}], + }); + + // First mutation's LMID is persisted, but the failing mutation's is not + expect(recordedLMIDs).toEqual([1]); + expect(recordedResults).toEqual([]); + }, + ); + + test('persistPreTransactionFailure failure returns database error', async () => { + const { + db: failingDb, + recordedLMIDs, + recordedResults, + } = createTrackingDatabase({ + // persistPreTransactionFailure opens a transaction, which fails + transactionErrorProvider: () => new Error('db went away'), + }); + + const response = await handleMutateRequest( + failingDb, + () => { + throw new Error('pre-tx failure'); + }, + baseQuery, + makePushBody([makeCustomMutation({id: 1})]), + ); + + expect(response).toMatchObject({ + kind: ErrorKind.PushFailed, + origin: ErrorOrigin.Server, + reason: ErrorReason.Database, + message: expect.stringContaining('db went away'), + mutationIDs: [{id: 1, clientID: 'cid'}], + }); + + // LMID is NOT persisted because the persist transaction itself failed + expect(recordedLMIDs).toEqual([]); + expect(recordedResults).toEqual([]); + }); + test('processes push requests when provided with a Request object', async () => { const { db: trackingDb, diff --git a/packages/zero-server/src/process-mutations.ts b/packages/zero-server/src/process-mutations.ts index 0899e70bc4..dbf630916b 100644 --- a/packages/zero-server/src/process-mutations.ts +++ b/packages/zero-server/src/process-mutations.ts @@ -279,9 +279,7 @@ export async function handleMutateRequest< const transactProxy: TransactFn = async innerCb => { mutationPhase = 'transactionPending'; - const result = await transactor.transact(m, (tx, name, args) => - applicationErrorWrapper(() => innerCb(tx, name, args)), - ); + const result = await transactor.transact(m, innerCb); mutationPhase = 'postCommit'; return result; }; @@ -395,21 +393,26 @@ class Transactor>> { }; } - if (isApplicationError(error)) { - appError = error; - this.#lc.warn?.( - `Application error processing mutation ${mutation.id} for client ${mutation.clientID}`, - appError, + if (appError !== undefined) { + // Retry also failed → internal error, cannot skip mutation + this.#lc.error?.( + `Retry also failed for mutation ${mutation.id} for client ${mutation.clientID}`, + error, ); - continue; + throw error; } - this.#lc.error?.( - `Unexpected error processing mutation ${mutation.id} for client ${mutation.clientID}`, - error, + // First attempt failed → store error and retry without mutator + const originalError = + error instanceof DatabaseTransactionError + ? (error.cause ?? error) + : error; + appError = wrapWithApplicationError(originalError); + this.#lc.warn?.( + `Error processing mutation ${mutation.id} for client ${mutation.clientID}, retrying without mutator`, + appError, ); - - throw error; + continue; } } }; @@ -452,11 +455,7 @@ class Transactor>> { this.#lc.debug?.( `Executing mutator '${mutation.name}' (id=${mutation.id})`, ); - try { - await cb(dbTx, mutation.name, mutation.args[0]); - } catch (appError) { - throw wrapWithApplicationError(appError); - } + await cb(dbTx, mutation.name, mutation.args[0]); } else { const mutationResult = makeAppErrorResponse(mutation, appError); await transactionHooks.writeMutationResult(mutationResult); From 5ea9e8cf64e3eabfc16006457e0f11342cbac619 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 4 Mar 2026 21:52:04 -0800 Subject: [PATCH 127/495] chore(zero-cache): publish a replication error if change-streamer cannot connect (#5640) In line with logging errors if the change-streamer cannot connect for > 10 seconds, also publish a replication error event. --- .../change-streamer/change-streamer-service.ts | 13 ++++++++++++- .../src/services/replicator/replication-status.ts | 2 +- packages/zero-cache/src/services/running-state.ts | 5 +++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 82fcfe0458..5b7fb73dda 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -2,6 +2,8 @@ import type {LogContext} from '@rocicorp/logger'; import {resolver} from '@rocicorp/resolver'; import {getDefaultHighWaterMark} from 'node:stream'; import {unreachable} from '../../../../shared/src/asserts.ts'; +import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; +import {publishCriticalEvent} from '../../observability/events.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import { min, @@ -20,7 +22,10 @@ import { type ChangeStreamControl, type ChangeStreamData, } from '../change-source/protocol/current/downstream.ts'; -import {publishReplicationError} from '../replicator/replication-status.ts'; +import { + publishReplicationError, + replicationStatusError, +} from '../replicator/replication-status.ts'; import type {SubscriptionState} from '../replicator/schema/replication-state.ts'; import { DEFAULT_MAX_RETRY_DELAY_MS, @@ -407,6 +412,12 @@ class ChangeStreamerImpl implements ChangeStreamerService { await Promise.all([ this.#storer.stop(), this.#state.backoff(this.#lc, err), + this.#state.retryDelay > 5000 + ? publishCriticalEvent( + this.#lc, + replicationStatusError(this.#lc, 'Replicating', err), + ) + : promiseVoid, ]); } this.#lc.info?.('ChangeStreamer stopped'); diff --git a/packages/zero-cache/src/services/replicator/replication-status.ts b/packages/zero-cache/src/services/replicator/replication-status.ts index b3758f6005..2f1398bce0 100644 --- a/packages/zero-cache/src/services/replicator/replication-status.ts +++ b/packages/zero-cache/src/services/replicator/replication-status.ts @@ -70,7 +70,7 @@ export class ReplicationStatusPublisher { e: unknown, ): Promise { this.stop(); - const event = replicationStatusError(lc, stage, 'ERROR', this.#db); + const event = replicationStatusError(lc, stage, e, this.#db); await this.#publish(lc, event); throw e; } diff --git a/packages/zero-cache/src/services/running-state.ts b/packages/zero-cache/src/services/running-state.ts index 7ddc39544e..df84bbdf3f 100644 --- a/packages/zero-cache/src/services/running-state.ts +++ b/packages/zero-cache/src/services/running-state.ts @@ -71,6 +71,10 @@ export class RunningState { return this.#controller.signal; } + get retryDelay() { + return this.#retryDelay; + } + /** * Returns `true` until {@link stop()} has been called. * @@ -147,6 +151,7 @@ export class RunningState { this.#retryDelay = Math.min(delay * 2, this.#maxRetryDelay); if (err instanceof AbortError || err instanceof UnrecoverableError) { + this.resetBackoff(); this.stop(lc, err); } else if (this.shouldRun()) { // Use delay-based log level: higher delay means more retries From 8bc71f0c6c70a4cbb246a3f73539a9450fe557fe Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 5 Mar 2026 10:49:40 -0800 Subject: [PATCH 128/495] chore(zero-cache): set a longer connection lifetime for initial-sync / backfill (#5641) --- .../zero-cache/src/services/change-source/pg/backfill-stream.ts | 1 + .../zero-cache/src/services/change-source/pg/initial-sync.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts index 0318b61d69..34847f8ac7 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts @@ -68,6 +68,7 @@ export async function* streamBackfill( const {flushThresholdBytes = POSTGRES_COPY_CHUNK_SIZE} = opts; const db = pgClient(lc, upstreamURI, { connection: {['application_name']: 'backfill-stream'}, + ['max_lifetime']: 120 * 60, // set a long (2h) limit for COPY streaming }); const tx = new TransactionPool(lc, READONLY).run(db); try { diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index 39ed56ba8d..d51aede9d6 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -171,6 +171,7 @@ export async function initialSync( const copyPool = pgClient(lc, upstreamURI, { max: numWorkers, connection: {['application_name']: 'initial-sync-copy-worker'}, + ['max_lifetime']: 120 * 60, // set a long (2h) limit for COPY streaming }); const copiers = startTableCopyWorkers( lc, From 73a41a180992ec3a0ce40f03cf2e7208c857cbe5 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 5 Mar 2026 12:25:32 -0800 Subject: [PATCH 129/495] chore(zero-cache): send tx pool keepalives at shorter interval (#5642) --- packages/zero-cache/src/db/transaction-pool.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/zero-cache/src/db/transaction-pool.ts b/packages/zero-cache/src/db/transaction-pool.ts index 5ba6699369..8159fb9b80 100644 --- a/packages/zero-cache/src/db/transaction-pool.ts +++ b/packages/zero-cache/src/db/transaction-pool.ts @@ -711,7 +711,10 @@ interface TaskRunner { // TODO: Get rid of the timeout stuff. It's no longer needed. const IDLE_TIMEOUT_MS = 5_000; -const KEEPALIVE_TIMEOUT_MS = 60_000; +// This must be less than IDLE_IN_TRANSACTION_SESSION_TIMEOUT_MS +// in run-transaction.ts (1 minute), so that pooled transactions +// aren't inadvertently killed by PG for being idle. +const KEEPALIVE_TIMEOUT_MS = 30_000; const KEEPALIVE_TASK: Task = tx => [tx`SELECT 1`.simple()]; From 7024d43348c77ee0937de982d0f7906cdbd59cc0 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 5 Mar 2026 13:07:01 -0800 Subject: [PATCH 130/495] chore(zero-cache): end copier transaction pool as soon as COPYs complete (#5643) --- .../src/services/change-source/pg/initial-sync.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index d51aede9d6..f084b9daf7 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -206,6 +206,7 @@ export async function initialSync( ), ); void copyProfiler?.stopAndDispose(lc, 'initial-copy'); + copiers.setDone(); const total = rowCounts.reduce( (acc, curr) => ({ @@ -241,14 +242,8 @@ export async function initialSync( `(flush: ${total.flushTime.toFixed(3)}, index: ${index.toFixed(3)}, total: ${elapsed.toFixed(3)} ms)`, ); } finally { - copiers.setDone(); - if (platform() === 'win32') { - // Workaround a Node bug in Windows in which certain COPY streams result - // in hanging the connection, which causes this await to never resolve. - void copyPool.end().catch(e => lc.warn?.(`Error closing copyPool`, e)); - } else { - await copyPool.end(); - } + // All meaningful errors are handled at the processReadTask() call site. + void copyPool.end().catch(e => lc.warn?.(`Error closing copyPool`, e)); } } catch (e) { // If initial-sync did not succeed, make a best effort to drop the From 1a459bc0eb764a4d4860428fb44811c1c5a909fc Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 5 Mar 2026 14:13:53 -0800 Subject: [PATCH 131/495] chore(zero-cache): rejection handler and more frequent keepalives (#5644) --- .../zero-cache/src/db/transaction-pool.ts | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/packages/zero-cache/src/db/transaction-pool.ts b/packages/zero-cache/src/db/transaction-pool.ts index 8159fb9b80..ce8ad28d7f 100644 --- a/packages/zero-cache/src/db/transaction-pool.ts +++ b/packages/zero-cache/src/db/transaction-pool.ts @@ -230,19 +230,24 @@ export class TransactionPool { } }; - this.#workers.push( - runTx(db, worker, {mode: this.#mode}) - .catch(e => { - if (e instanceof RollbackSignal) { - // A RollbackSignal is used to gracefully rollback the postgres.js - // transaction block. It should not be thrown up to the application. - lc.debug?.('aborted transaction'); - } else { - throw e; - } - }) - .finally(() => this.#numWorkers--), - ); + const workerTx = runTx(db, worker, {mode: this.#mode}) + .catch(e => { + if (e instanceof RollbackSignal) { + // A RollbackSignal is used to gracefully rollback the postgres.js + // transaction block. It should not be thrown up to the application. + lc.debug?.('aborted transaction'); + } else { + throw e; + } + }) + .finally(() => this.#numWorkers--); + + // Attach a rejection handler immediately to prevent unhandledRejections. + // The application will handle errors when it awaits processReadTask() + // or done(). + workerTx.catch(() => {}); + + this.#workers.push(workerTx); // After adding the worker, enqueue a terminal signal if we are in either of the // terminal states (both of which prevent more tasks from being enqueued), to ensure @@ -708,15 +713,24 @@ interface TaskRunner { rejected(reason: unknown): void; } -// TODO: Get rid of the timeout stuff. It's no longer needed. const IDLE_TIMEOUT_MS = 5_000; -// This must be less than IDLE_IN_TRANSACTION_SESSION_TIMEOUT_MS -// in run-transaction.ts (1 minute), so that pooled transactions -// aren't inadvertently killed by PG for being idle. -const KEEPALIVE_TIMEOUT_MS = 30_000; - -const KEEPALIVE_TASK: Task = tx => [tx`SELECT 1`.simple()]; +// The keepalive interval is settable by ZERO_TRANSACTION_POOL_KEEPALIVE_MS +// as an emergency measure and is explicitly not made available as a server +// option. This value is function of how the zero-cache uses transactions, and +// should never need to be "tuned" or adjusted for different environments. +// +// Note that it must be shorter than IDLE_IN_TRANSACTION_SESSION_TIMEOUT_MS +// with sufficient buffering to account for when the process is blocked by +// synchronous calls (e.g. to the replica). +const KEEPALIVE_TIMEOUT_MS = parseInt( + process.env.ZERO_TRANSACTION_POOL_KEEPALIVE_MS ?? '5000', +); + +const KEEPALIVE_TASK: Task = (tx, lc) => { + lc.debug?.(`sending tx keepalive`); + return [tx`SELECT 1`.simple()]; +}; type TimeoutTask = { timeoutMs: number; From ec7b5a7907cd4da16b44cb042364819a2ef303a1 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 6 Mar 2026 11:00:41 -0800 Subject: [PATCH 132/495] fix(zero-cache): fix promises for unconsumed (pipelined) entries (#5645) Fixes the Promise returned by `Subscription.push()` for pipelined entries when the subscription is canceled (e.g. the websocket disconnected). The Subscription object is the application level abstraction on top of the websocket, the implementation for which pipelining of entries is supported; multiple entries can be pushed (i.e. sent over the wire), allowing the application layer to decide when to wait for the corresponding ACKs. In the case of ungraceful termination (e.g. when pings fail and our liveness check terminates the connection), the Promises representing the `Result` of these sent-but-not-acked messages were never resolved, thus causing the replication stream to hang on the [new flow control logic](https://github.com/rocicorp/mono/pull/5560). Part 1 of 2 fixes: * This fix tracks these outstanding entries (dequeued but not yet consumed) in the Subscription class as "consuming" entries. These entries are cleaned up (and their Promises resolved to "unconsumed") when the Subscription is canceled. * This will effectively unblock replication when the websocket connections are terminated. Part 2 (forthcoming) will adjust flow control policy to detect stuck subscribers earlier, before the websocket ping intervals kick in. Incident: * https://rocicorp.slack.com/archives/C0A8NUDMDM1/p1772736459460419 --- packages/zero-cache/src/types/streams.test.ts | 77 +++++++++++++++---- .../zero-cache/src/types/subscription.test.ts | 70 +++++++++++++++-- packages/zero-cache/src/types/subscription.ts | 44 ++++++++--- 3 files changed, 160 insertions(+), 31 deletions(-) diff --git a/packages/zero-cache/src/types/streams.test.ts b/packages/zero-cache/src/types/streams.test.ts index 5032f6e938..d5cfbca075 100644 --- a/packages/zero-cache/src/types/streams.test.ts +++ b/packages/zero-cache/src/types/streams.test.ts @@ -15,13 +15,13 @@ import {randInt} from '../../../shared/src/rand.ts'; import {sleep} from '../../../shared/src/sleep.ts'; import * as v from '../../../shared/src/valita.ts'; import { - type Sink, - type Source, stream, streamIn, streamOut, + type Sink, + type Source, } from './streams.ts'; -import {Subscription} from './subscription.ts'; +import {Subscription, type Result} from './subscription.ts'; const messageSchema = v.object({ from: v.number(), @@ -250,9 +250,16 @@ describe('streams with internal acks', () => { await server.close(); }); - function startReceiver() { + async function startReceiver() { ws = new WebSocket(`http://localhost:${port}/`); - return streamIn(lc, ws, messageSchema); + return { + ws, + consumer: (await streamIn( + lc, + ws, + messageSchema, + )) as Subscription, + }; } test('one at a time', async () => { @@ -260,7 +267,7 @@ describe('streams with internal acks', () => { producer.push({from: num, to: num + 1, str: 'foo'}); - const consumer = await startReceiver(); + const {consumer} = await startReceiver(); for await (const msg of consumer) { if (num > 0) { expect(await consumed.dequeue()).toEqual({ @@ -283,11 +290,12 @@ describe('streams with internal acks', () => { }); test('pipelined', async () => { - producer.push({from: 0, to: 1, str: 'foo'}); - producer.push({from: 1, to: 2, str: 'bar'}); - producer.push({from: 2, to: 3, str: 'baz'}); + const results: Promise[] = []; + results.push(producer.push({from: 0, to: 1, str: 'foo'}).result); + results.push(producer.push({from: 1, to: 2, str: 'bar'}).result); + results.push(producer.push({from: 2, to: 3, str: 'baz'}).result); - const consumer = (await startReceiver()) as Subscription; + const {consumer} = await startReceiver(); // Pipelining should send all messages even before they are // "consumed" on the receiving end. @@ -327,6 +335,42 @@ describe('streams with internal acks', () => { } expect(await consumed.dequeue()).toEqual({from: 2, to: 3, str: 'baz'}); expect(await cleanedUp).toEqual([]); + expect(await Promise.all(results)).toEqual([ + 'consumed', + 'consumed', + 'consumed', + ]); + }); + + test('pipelined (unconsumed)', async () => { + const results: Promise[] = []; + results.push(producer.push({from: 0, to: 1, str: 'foo'}).result); + results.push(producer.push({from: 1, to: 2, str: 'bar'}).result); + results.push(producer.push({from: 2, to: 3, str: 'baz'}).result); + + const {consumer, ws} = await startReceiver(); + + // Pipelining should send all messages even before they are + // "consumed" on the receiving end. + while (consumer.queued < 3) { + await sleep(1); + } + expect(consumed.size()).toBe(0); + + // Terminate the websocket ungracefully. + ws.terminate(); + + expect(consumed.size()).toBe(0); + expect(await cleanedUp).toEqual([ + {from: 0, str: 'foo', to: 1}, + {from: 1, str: 'bar', to: 2}, + {from: 2, str: 'baz', to: 3}, + ]); + expect(await Promise.all(results)).toEqual([ + 'unconsumed', + 'unconsumed', + 'unconsumed', + ]); }); test('coalesce and cleanup', async () => { @@ -346,7 +390,7 @@ describe('streams with internal acks', () => { // oxlint-disable-next-line no-unused-vars -- Used in switch statement increment let i = 0; - const consumer = await startReceiver(); + const {consumer} = await startReceiver(); for await (const msg of consumer) { switch (i++) { case 0: @@ -391,7 +435,10 @@ describe('streams with internal acks', () => { expect(consumed.size()).toBe(0); // In this case, the producer does not get the ack that the last messages // were consumed - expect(await cleanedUp).toEqual([{from: 8, to: 10, str: 'voodoo'}]); + expect(await cleanedUp).toEqual([ + {from: 5, to: 8, str: 'fooboodoo'}, + {from: 8, to: 10, str: 'voodoo'}, + ]); }); async function drain( @@ -412,7 +459,7 @@ describe('streams with internal acks', () => { test('passthrough', async () => { producer.push({from: 1, to: 2, str: 'foo', extra: 'bar'} as Message); - const consumer = await startReceiver(); + const {consumer} = await startReceiver(); expect(await drain(1, consumer)).toEqual([ {from: 1, to: 2, str: 'foo', extra: 'bar'}, ]); @@ -432,7 +479,7 @@ describe('streams with internal acks', () => { ], } as Message); - const consumer = await startReceiver(); + const {consumer} = await startReceiver(); expect(await drain(1, consumer)).toEqual([ { from: 1, @@ -450,7 +497,7 @@ describe('streams with internal acks', () => { }); test('unconsumed array receives pending messages after close', async () => { - const consumer = (await startReceiver()) as Subscription; + const {consumer} = await startReceiver(); for (let i = 0; i < 100; i++) { producer.push({from: i, to: i + 1, str: 'foo' + 1}); diff --git a/packages/zero-cache/src/types/subscription.test.ts b/packages/zero-cache/src/types/subscription.test.ts index 1024e1bb20..99e8741aad 100644 --- a/packages/zero-cache/src/types/subscription.test.ts +++ b/packages/zero-cache/src/types/subscription.test.ts @@ -48,7 +48,7 @@ describe('types/subscription', () => { expect(await subscription.push(6).result).toBe('unconsumed'); }); - test('cancel', async () => { + test('cancel non-pipelined', async () => { const consumed = new Set(); const cleanup = vi.fn(); const results: Promise[] = []; @@ -86,7 +86,66 @@ describe('types/subscription', () => { expect(received).toEqual([0, 1, 2]); expect(consumed).toEqual(new Set(received)); expect(cleanup).toBeCalledTimes(1); - expect(cleanup.mock.calls[0][0]).toEqual([3, 4]); + // Note: 2 is also sent to cleanup due to the fact that cancel() + // is called from within the loop, before it was "consumed". + expect(cleanup.mock.calls[0][0]).toEqual([2, 3, 4]); + + expect(await subscription.push(6).result).toBe('unconsumed'); + }); + + test('cancel pipelined', async () => { + const consumed = new Set(); + const cleanup = vi.fn(); + const results: Promise[] = []; + + const subscription = Subscription.create({ + cleanup, + consumed: m => consumed.add(m), + }); + for (let i = 0; i < 5; i++) { + const {result} = subscription.push(i); + results.push(result); + } + + const received: number[] = []; + + let j = 0; + const {pipeline} = subscription; + assert(pipeline, 'must support pipeline'); + + for await (const {value: m, consumed: signalConsumed} of pipeline) { + expect(consumed.has(m)).toBe(false); + for (let i = 0; i < m && i < 2; i++) { + expect(consumed.has(i)).toBe(true); + expect(await results[i]).toBe('consumed'); + } + if (j < 2) { + // Ack 0, 1 + received.push(m); + expect(subscription.consuming).toBe(1); + signalConsumed(); + expect(subscription.consuming).toBe(0); + } else { + // but not 2 and 3 + expect(subscription.consuming).toBe(j - 1); + if (j === 4) { + // Cancel at 4 + expect(subscription.active).toBe(true); + subscription.cancel(); + expect(subscription.active).toBe(false); + } + } + j++; + } + + for (let i = 0; i < 5; i++) { + expect(await results[i]).toBe(i < 2 ? 'consumed' : 'unconsumed'); + } + + expect(received).toEqual([0, 1]); + expect(consumed).toEqual(new Set(received)); + expect(cleanup).toBeCalledTimes(1); + expect(cleanup.mock.calls[0][0]).toEqual([2, 3, 4]); expect(await subscription.push(6).result).toBe('unconsumed'); }); @@ -142,7 +201,7 @@ describe('types/subscription', () => { expect(received).toEqual([0, 1, 2]); expect(consumed).toEqual(new Set(received)); expect(cleanup).toBeCalledTimes(1); - expect(cleanup.mock.calls[0][0]).toEqual([3, 4]); + expect(cleanup.mock.calls[0][0]).toEqual([2, 3, 4]); expect(cleanup.mock.calls[0][1]).toBe(failure); expect(await subscription.push(6).result).toBe('unconsumed'); @@ -318,12 +377,12 @@ describe('types/subscription', () => { } } expect(await results[2]).toBe('coalesced'); - expect(await results[3]).toBe('consumed'); + expect(await results[3]).toBe('unconsumed'); expect(received).toEqual(['a,b', 'c,d']); expect(consumed).toEqual(new Set(received)); expect(cleanup).toBeCalledTimes(1); - expect(cleanup.mock.calls[0][0]).toEqual([]); + expect(cleanup.mock.calls[0][0]).toEqual(['c,d']); expect(await subscription.push('e').result).toBe('unconsumed'); }); @@ -451,6 +510,7 @@ describe('types/subscription', () => { expect(consumed).toEqual(new Set([0, 1, 2])); expect(cleanup).toBeCalledTimes(1); expect(cleanup.mock.calls[0][0]).toEqual([ + {foo: 2, bar: 'internal'}, {foo: 3, bar: 'internal'}, {foo: 4, bar: 'internal'}, ]); diff --git a/packages/zero-cache/src/types/subscription.ts b/packages/zero-cache/src/types/subscription.ts index 39838fbf05..68e0b976c7 100644 --- a/packages/zero-cache/src/types/subscription.ts +++ b/packages/zero-cache/src/types/subscription.ts @@ -76,8 +76,10 @@ export class Subscription implements Source, Sink { // Consumers waiting to consume messages (i.e. an async iteration awaiting the next message). readonly #consumers: Resolver | null>[] = []; - // Messages waiting to be consumed. + // Messages waiting to be dequeued. readonly #messages: (Entry | 'terminus')[] = []; + // Messages dequeued but not yet consumed. + readonly #consuming: Entry[] = []; readonly #pipelineEnabled: boolean; // Sentinel value signaling that the subscription is "done" and no more // messages can be added. @@ -112,6 +114,7 @@ export class Subscription implements Source, Sink { this.#consumed = entry => { consumed(entry.value); + this.#removeFromConsuming(entry); entry.resolve('consumed'); }; @@ -173,11 +176,16 @@ export class Subscription implements Source, Sink { return this.#sentinel === undefined; } - /** The number messages waiting to be consumed. */ + /** The number of messages waiting to be consumed. */ get queued(): number { return this.#messages.length; } + /** The number of messages dequeued but not yet "consumed" */ + get consuming(): number { + return this.#consuming.length; + } + /** * Cancels the subscription after any queued messages are consumed. This is * meant for the producer-side code. @@ -222,7 +230,7 @@ export class Subscription implements Source, Sink { if (!this.#sentinel) { this.#sentinel = sentinel; this.#cleanup( - this.#messages.filter(m => m !== 'terminus'), + [...this.#consuming, ...this.#messages.filter(m => m !== 'terminus')], sentinel instanceof Error ? sentinel : undefined, ); this.#messages.splice(0); @@ -245,6 +253,17 @@ export class Subscription implements Source, Sink { : undefined; } + #removeFromConsuming(entry: Entry) { + const pos = this.#consuming.indexOf(entry); + if (pos === 0) { + // In the common case, where consume() is called in the same order in + // which items were dequeued, use shift(), as it is faster than splice(). + this.#consuming.shift(); + } else if (pos > 0) { + this.#consuming.splice(pos, 1); + } + } + #pipeline(): AsyncIterator<{value: T; consumed: () => void}> { return { next: async () => { @@ -254,6 +273,7 @@ export class Subscription implements Source, Sink { return {value: undefined, done: true}; } if (entry !== undefined) { + this.#consuming.push(entry); return { value: { value: this.#publish(entry.value), @@ -272,14 +292,16 @@ export class Subscription implements Source, Sink { // Wait for push() (or termination) to resolve the consumer. const result = await consumer.promise; - return result - ? { - value: { - value: this.#publish(result.value), - consumed: () => this.#consumed(result), - }, - } - : {value: undefined, done: true}; + if (result !== null) { + this.#consuming.push(result); + return { + value: { + value: this.#publish(result.value), + consumed: () => this.#consumed(result), + }, + }; + } + return {value: undefined, done: true}; }, return: value => { From d8da65f66cfb334549dacd6a47c90a5dfbb4ef1d Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 6 Mar 2026 12:17:17 -0800 Subject: [PATCH 133/495] chore(zero-cache): use a Set for "consuming" entries (#5646) --- packages/zero-cache/src/types/subscription.ts | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/packages/zero-cache/src/types/subscription.ts b/packages/zero-cache/src/types/subscription.ts index 68e0b976c7..095ef8a8a4 100644 --- a/packages/zero-cache/src/types/subscription.ts +++ b/packages/zero-cache/src/types/subscription.ts @@ -79,7 +79,7 @@ export class Subscription implements Source, Sink { // Messages waiting to be dequeued. readonly #messages: (Entry | 'terminus')[] = []; // Messages dequeued but not yet consumed. - readonly #consuming: Entry[] = []; + readonly #consuming = new Set>(); readonly #pipelineEnabled: boolean; // Sentinel value signaling that the subscription is "done" and no more // messages can be added. @@ -114,7 +114,7 @@ export class Subscription implements Source, Sink { this.#consumed = entry => { consumed(entry.value); - this.#removeFromConsuming(entry); + this.#consuming.delete(entry); entry.resolve('consumed'); }; @@ -176,14 +176,14 @@ export class Subscription implements Source, Sink { return this.#sentinel === undefined; } - /** The number of messages waiting to be consumed. */ + /** The number of messages waiting to be dequeued. */ get queued(): number { return this.#messages.length; } /** The number of messages dequeued but not yet "consumed" */ get consuming(): number { - return this.#consuming.length; + return this.#consuming.size; } /** @@ -253,17 +253,6 @@ export class Subscription implements Source, Sink { : undefined; } - #removeFromConsuming(entry: Entry) { - const pos = this.#consuming.indexOf(entry); - if (pos === 0) { - // In the common case, where consume() is called in the same order in - // which items were dequeued, use shift(), as it is faster than splice(). - this.#consuming.shift(); - } else if (pos > 0) { - this.#consuming.splice(pos, 1); - } - } - #pipeline(): AsyncIterator<{value: T; consumed: () => void}> { return { next: async () => { @@ -273,7 +262,7 @@ export class Subscription implements Source, Sink { return {value: undefined, done: true}; } if (entry !== undefined) { - this.#consuming.push(entry); + this.#consuming.add(entry); return { value: { value: this.#publish(entry.value), @@ -293,7 +282,7 @@ export class Subscription implements Source, Sink { // Wait for push() (or termination) to resolve the consumer. const result = await consumer.promise; if (result !== null) { - this.#consuming.push(result); + this.#consuming.add(result); return { value: { value: this.#publish(result.value), From bfb064fd74bb62bbdccfbc59807995e0452204d5 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 7 Mar 2026 21:30:06 -0800 Subject: [PATCH 134/495] chore(zero-cache): consensus-based flow control (#5648) ### Consensus-based flow control This is part 2 of 2 flow control fixes, a followup to #5645 Replace the all-or-nothing (`Promise.all()`) flow control algorithm with one that more gracefully degrades in the face of unresponsive or backlogged subscribers. Previously, a backlogged subscriber or a severed TCP connection would pause overall replication until the subscriber finishes its backlog (or is disconnected by liveness checks). The new consensus-based flow control algorithm improves application availability during such imbalances by setting a timeout after the majority of subscribers have processed the change. This timeout provides a buffer for backlogged subscribers to eventually catch up, while still allowing replication to progress while that happens. --- .../zero-cache/src/config/zero-config.test.ts | 1079 +++++++++-------- packages/zero-cache/src/config/zero-config.ts | 18 + .../zero-cache/src/server/change-streamer.ts | 2 + .../change-streamer/broadcast.test.ts | 107 ++ .../src/services/change-streamer/broadcast.ts | 216 ++++ .../change-streamer-service.pg.test.ts | 8 + .../change-streamer-service.ts | 22 +- .../change-streamer/forwarder.test.ts | 25 +- .../src/services/change-streamer/forwarder.ts | 80 +- .../change-streamer/subscriber.test.ts | 14 +- .../services/change-streamer/subscriber.ts | 87 +- 11 files changed, 1095 insertions(+), 563 deletions(-) create mode 100644 packages/zero-cache/src/services/change-streamer/broadcast.test.ts create mode 100644 packages/zero-cache/src/services/change-streamer/broadcast.ts diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index bc995543ef..a495e52b99 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -27,538 +27,553 @@ test('zero-cache --help', () => { expect(logger.info).toHaveBeenCalled(); expect(stripAnsi(logger.info.mock.calls[0][0])).toMatchInlineSnapshot(` " - --upstream-db string required - ZERO_UPSTREAM_DB env - The "upstream" authoritative postgres database. - In the future we will support other types of upstream besides PG. - - --upstream-max-conns number default: 20 - ZERO_UPSTREAM_MAX_CONNS env - The maximum number of connections to open to the upstream database - for committing mutations. This is divided evenly amongst sync workers. - In addition to this number, zero-cache uses one connection for the - replication stream. - - Note that this number must allow for at least one connection per - sync worker, or zero-cache will fail to start. See num-sync-workers - - --mutate-url string[] optional - ZERO_MUTATE_URL env - The URL of the API server to which zero-cache will push mutations. - - IMPORTANT: URLs are matched using URLPattern, a standard Web API. - - Pattern Syntax: - URLPattern uses a simple and intuitive syntax similar to Express routes. - Wildcards and named parameters make it easy to match multiple URLs. - - Basic Examples: - Exact URL match: - "https://api.example.com/mutate" - Any subdomain using wildcard: - "https://*.example.com/mutate" - Multiple subdomain levels: - "https://*.*.example.com/mutate" - Any path under a domain: - "https://api.example.com/*" - Named path parameters: - "https://api.example.com/:version/mutate" - ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. - - Advanced Patterns: - Optional path segments: - "https://api.example.com/:path?" - Regex in segments (for specific patterns): - "https://api.example.com/:version(v\\d+)/mutate" - ↳ Matches only "v" followed by digits - - Multiple patterns: - ["https://api1.example.com/mutate", "https://api2.example.com/mutate"] - - Note: Query parameters and URL fragments (#) are automatically ignored during matching. - - For full URLPattern syntax, see: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern - - --mutate-api-key string optional - ZERO_MUTATE_API_KEY env - An optional secret used to authorize zero-cache to call the API server handling writes. - - --mutate-forward-cookies boolean default: false - ZERO_MUTATE_FORWARD_COOKIES env - If true, zero-cache will forward cookies from the request. - This is useful for passing authentication cookies to the API server. - If false, cookies are not forwarded. - - --mutate-allowed-client-headers string[] optional - ZERO_MUTATE_ALLOWED_CLIENT_HEADERS env - A list of header names that clients are allowed to set via custom headers. - If specified, only headers in this list will be forwarded to the push URL. - Header names are case-insensitive. - If not specified, no client-provided headers are forwarded (secure by default). - Example: ZERO_MUTATE_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id - - --query-url string[] optional - ZERO_QUERY_URL env - The URL of the API server to which zero-cache will send synced queries. - - IMPORTANT: URLs are matched using URLPattern, a standard Web API. - - Pattern Syntax: - URLPattern uses a simple and intuitive syntax similar to Express routes. - Wildcards and named parameters make it easy to match multiple URLs. - - Basic Examples: - Exact URL match: - "https://api.example.com/mutate" - Any subdomain using wildcard: - "https://*.example.com/mutate" - Multiple subdomain levels: - "https://*.*.example.com/mutate" - Any path under a domain: - "https://api.example.com/*" - Named path parameters: - "https://api.example.com/:version/mutate" - ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. - - Advanced Patterns: - Optional path segments: - "https://api.example.com/:path?" - Regex in segments (for specific patterns): - "https://api.example.com/:version(v\\d+)/mutate" - ↳ Matches only "v" followed by digits - - Multiple patterns: - ["https://api1.example.com/mutate", "https://api2.example.com/mutate"] - - Note: Query parameters and URL fragments (#) are automatically ignored during matching. - - For full URLPattern syntax, see: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern - - --query-api-key string optional - ZERO_QUERY_API_KEY env - An optional secret used to authorize zero-cache to call the API server handling writes. - - --query-forward-cookies boolean default: false - ZERO_QUERY_FORWARD_COOKIES env - If true, zero-cache will forward cookies from the request. - This is useful for passing authentication cookies to the API server. - If false, cookies are not forwarded. - - --query-allowed-client-headers string[] optional - ZERO_QUERY_ALLOWED_CLIENT_HEADERS env - A list of header names that clients are allowed to set via custom headers. - If specified, only headers in this list will be forwarded to the query URL. - Header names are case-insensitive. - If not specified, no client-provided headers are forwarded (secure by default). - Example: ZERO_QUERY_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id - - --cvr-db string optional - ZERO_CVR_DB env - The Postgres database used to store CVRs. CVRs (client view records) keep track - of the data synced to clients in order to determine the diff to send on reconnect. - If unspecified, the upstream-db will be used. - - --cvr-max-conns number default: 30 - ZERO_CVR_MAX_CONNS env - The maximum number of connections to open to the CVR database. - This is divided evenly amongst sync workers. - - Note that this number must allow for at least one connection per - sync worker, or zero-cache will fail to start. See num-sync-workers - - --cvr-garbage-collection-inactivity-threshold-hours number default: 48 - ZERO_CVR_GARBAGE_COLLECTION_INACTIVITY_THRESHOLD_HOURS env - The duration after which an inactive CVR is eligible for garbage collection. - Note that garbage collection is an incremental, periodic process which does not - necessarily purge all eligible CVRs immediately. - - --cvr-garbage-collection-initial-interval-seconds number default: 60 - ZERO_CVR_GARBAGE_COLLECTION_INITIAL_INTERVAL_SECONDS env - The initial interval at which to check and garbage collect inactive CVRs. - This interval is increased exponentially (up to 16 minutes) when there is - nothing to purge. - - --cvr-garbage-collection-initial-batch-size number default: 25 - ZERO_CVR_GARBAGE_COLLECTION_INITIAL_BATCH_SIZE env - The initial number of CVRs to purge per garbage collection interval. - This number is increased linearly if the rate of new CVRs exceeds the rate of - purged CVRs, in order to reach a steady state. - - Setting this to 0 effectively disables CVR garbage collection. - - --query-hydration-stats boolean optional - ZERO_QUERY_HYDRATION_STATS env - Track and log the number of rows considered by query hydrations which - take longer than log-slow-hydrate-threshold milliseconds. - This is useful for debugging and performance tuning. - - --enable-query-planner boolean default: true - ZERO_ENABLE_QUERY_PLANNER env - Enable the query planner for optimizing ZQL queries. - - The query planner analyzes and optimizes query execution by determining - the most efficient join strategies. - - You can disable the planner if it is picking bad strategies. - - --yield-threshold-ms number default: 10 - ZERO_YIELD_THRESHOLD_MS env - The maximum amount of time in milliseconds that a sync worker will - spend in IVM (processing query hydration and advancement) before yielding - to the event loop. Lower values increase responsiveness and fairness at - the cost of reduced throughput. - - --change-db string optional - ZERO_CHANGE_DB env - The Postgres database used to store recent replication log entries, in order - to sync multiple view-syncers without requiring multiple replication slots on - the upstream database. If unspecified, the upstream-db will be used. - - --change-max-conns number default: 5 - ZERO_CHANGE_MAX_CONNS env - The maximum number of connections to open to the change database. - This is used by the change-streamer for catching up - zero-cache replication subscriptions. - - --replica-file string default: "zero.db" - ZERO_REPLICA_FILE env - File path to the SQLite replica that zero-cache maintains. - This can be lost, but if it is, zero-cache will have to re-replicate next - time it starts up. - - --replica-vacuum-interval-hours number optional - ZERO_REPLICA_VACUUM_INTERVAL_HOURS env - Performs a VACUUM at server startup if the specified number of hours has elapsed - since the last VACUUM (or initial-sync). The VACUUM operation is heavyweight - and requires double the size of the db in disk space. If unspecified, VACUUM - operations are not performed. - - --log-level debug,info,warn,error default: "info" - ZERO_LOG_LEVEL env - - --log-format text,json default: "text" - ZERO_LOG_FORMAT env - Use text for developer-friendly console logging - and json for consumption by structured-logging services - - --log-slow-row-threshold number default: 2 - ZERO_LOG_SLOW_ROW_THRESHOLD env - The number of ms a row must take to fetch from table-source before it is considered slow. - - --log-slow-hydrate-threshold number default: 100 - ZERO_LOG_SLOW_HYDRATE_THRESHOLD env - The number of milliseconds a query hydration must take to print a slow warning. - - --log-ivm-sampling number default: 5000 - ZERO_LOG_IVM_SAMPLING env - How often to collect IVM metrics. 1 out of N requests will be sampled where N is this value. - - --app-id string default: "zero" - ZERO_APP_ID env - Unique identifier for the app. - - Multiple zero-cache apps can run on a single upstream database, each of which - is isolated from the others, with its own permissions, sharding (future feature), - and change/cvr databases. - - The metadata of an app is stored in an upstream schema with the same name, - e.g. "zero", and the metadata for each app shard, e.g. client and mutation - ids, is stored in the "{app-id}_{#}" schema. (Currently there is only a single - "0" shard, but this will change with sharding). - - The CVR and Change data are managed in schemas named "{app-id}_{shard-num}/cvr" - and "{app-id}_{shard-num}/cdc", respectively, allowing multiple apps and shards - to share the same database instance (e.g. a Postgres "cluster") for CVR and Change management. - - Due to constraints on replication slot names, an App ID may only consist of - lower-case letters, numbers, and the underscore character. - - Note that this option is used by both zero-cache and zero-deploy-permissions. - - --app-publications string[] default: [] - ZERO_APP_PUBLICATIONS env - Postgres PUBLICATIONs that define the tables and columns to - replicate. Publication names may not begin with an underscore, - as zero reserves that prefix for internal use. - - If unspecified, zero-cache will create and use an internal publication that - publishes all tables in the public schema, i.e.: - - CREATE PUBLICATION _{app-id}_public_0 FOR TABLES IN SCHEMA public; - - Note that changing the set of publications will result in resyncing the replica, - which may involve downtime (replication lag) while the new replica is initializing. - To change the set of publications without disrupting an existing app, a new app - should be created. - - --port number default: 4848 - ZERO_PORT env - The port for sync connections. - - --change-streamer-uri string optional - ZERO_CHANGE_STREAMER_URI env - When set, connects to the change-streamer at the given URI. - In a multi-node setup, this should be specified in view-syncer options, - pointing to the replication-manager URI, which runs a change-streamer - on port 4849. - - --change-streamer-mode dedicated,discover default: "dedicated" - ZERO_CHANGE_STREAMER_MODE env - As an alternative to ZERO_CHANGE_STREAMER_URI, the ZERO_CHANGE_STREAMER_MODE - can be set to "discover" to instruct the view-syncer to connect to the - ip address registered by the replication-manager upon startup. - - This may not work in all networking configurations, e.g. certain private - networking or port forwarding configurations. Using the ZERO_CHANGE_STREAMER_URI - with an explicit routable hostname is recommended instead. - - Note: This option is ignored if the ZERO_CHANGE_STREAMER_URI is set. - - --change-streamer-port number optional - ZERO_CHANGE_STREAMER_PORT env - The port on which the change-streamer runs. This is an internal - protocol between the replication-manager and view-syncers, which - runs in the same process tree in local development or a single-node configuration. - - If unspecified, defaults to --port + 1. - - --change-streamer-startup-delay-ms number default: 15000 - ZERO_CHANGE_STREAMER_STARTUP_DELAY_MS env - The delay to wait before the change-streamer takes over the replication stream - (i.e. the handoff during replication-manager updates), to allow loadbalancers to register - the task as healthy based on healthcheck parameters. Note that if a change stream request - is received during this interval, the delay will be canceled and the takeover will happen - immediately, since the incoming request indicates that the task is registered as a target. - - --change-streamer-back-pressure-limit-heap-proportion number default: 0.04 - ZERO_CHANGE_STREAMER_BACK_PRESSURE_LIMIT_HEAP_PROPORTION env - The percentage of --max-old-space-size to use as a buffer for absorbing replication - stream spikes. When the estimated amount of queued data exceeds this threshold, back pressure - is applied to the replication stream, delaying downstream sync as a result. - - The threshold was determined empirically with load testing. Higher thresholds have resulted - in OOMs. Note also that the byte-counting logic in the queue is strictly an underestimate of - actual memory usage (but importantly, proportionally correct), so the queue is actually - using more than what this proportion suggests. - - This parameter is exported as an emergency knob to reduce the size of the buffer in the - event that the server OOMs from back pressure. Resist the urge to increase this - proportion, as it is mainly useful for absorbing periodic spikes and does not meaningfully - affect steady-state replication throughput; the latter is determined by other factors such - as object serialization and PG throughput - - In other words, the back pressure limit does not constrain replication throughput; - rather, it protects the system when the upstream throughput exceeds the downstream - throughput. - - --task-id string optional - ZERO_TASK_ID env - Globally unique identifier for the zero-cache instance. - - Setting this to a platform specific task identifier can be useful for debugging. - If unspecified, zero-cache will attempt to extract the TaskARN if run from within - an AWS ECS container, and otherwise use a random string. - - --per-user-mutation-limit-max number optional - ZERO_PER_USER_MUTATION_LIMIT_MAX env - The maximum mutations per user within the specified windowMs. - If unset, no rate limiting is enforced. - - --per-user-mutation-limit-window-ms number default: 60000 - ZERO_PER_USER_MUTATION_LIMIT_WINDOW_MS env - The sliding window over which the perUserMutationLimitMax is enforced. - - --num-sync-workers number optional - ZERO_NUM_SYNC_WORKERS env - The number of processes to use for view syncing. - Leave this unset to use the maximum available parallelism. - If set to 0, the server runs without sync workers, which is the - configuration for running the replication-manager. - - --auto-reset boolean default: true - ZERO_AUTO_RESET env - Automatically wipe and resync the replica when replication is halted. - This situation can occur for configurations in which the upstream database - provider prohibits event trigger creation, preventing the zero-cache from - being able to correctly replicate schema changes. For such configurations, - an upstream schema change will instead result in halting replication with an - error indicating that the replica needs to be reset. - - When auto-reset is enabled, zero-cache will respond to such situations - by shutting down, and when restarted, resetting the replica and all synced - clients. This is a heavy-weight operation and can result in user-visible - slowness or downtime if compute resources are scarce. - - --admin-password string optional - ZERO_ADMIN_PASSWORD env - A password used to administer zero-cache server, for example to access the - /statz endpoint. - - A password is optional in development mode but required in production mode. - - --websocket-compression boolean default: false - ZERO_WEBSOCKET_COMPRESSION env - Enable WebSocket per-message deflate compression. - - Compression can reduce bandwidth usage for sync traffic but - increases CPU usage on both client and server. Disabled by default. - - See: https://github.com/websockets/ws#websocket-compression - - --websocket-compression-options string optional - ZERO_WEBSOCKET_COMPRESSION_OPTIONS env - JSON string containing WebSocket compression options. - - Only used if websocketCompression is enabled. - - Example: {"zlibDeflateOptions":{"level":3},"threshold":1024} - - See https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback for available options. - - --websocket-max-payload-bytes number default: 10485760 - ZERO_WEBSOCKET_MAX_PAYLOAD_BYTES env - Maximum size of incoming WebSocket messages in bytes. - - Messages exceeding this limit are rejected before parsing. - Default: 10MB (10 * 1024 * 1024 = 10485760) - - --litestream-executable string optional - ZERO_LITESTREAM_EXECUTABLE env - Path to the litestream executable. - - --litestream-config-path string default: "./src/services/litestream/config.yml" - ZERO_LITESTREAM_CONFIG_PATH env - Path to the litestream yaml config file. zero-cache will run this with its - environment variables, which can be referenced in the file via \${ENV} - substitution, for example: - * ZERO_REPLICA_FILE for the db path - * ZERO_LITESTREAM_BACKUP_LOCATION for the db replica url - * ZERO_LITESTREAM_LOG_LEVEL for the log level - * ZERO_LOG_FORMAT for the log type - - --litestream-log-level debug,info,warn,error default: "warn" - ZERO_LITESTREAM_LOG_LEVEL env - - --litestream-backup-url string optional - ZERO_LITESTREAM_BACKUP_URL env - The location of the litestream backup, usually an s3:// URL. - This is only consulted by the replication-manager. - view-syncers receive this information from the replication-manager. - - --litestream-endpoint string optional - ZERO_LITESTREAM_ENDPOINT env - The S3-compatible endpoint URL to use for the litestream backup. Only required for non-AWS services. - The replication-manager and view-syncers must have the same endpoint. - - --litestream-port number optional - ZERO_LITESTREAM_PORT env - Port on which litestream exports metrics, used to determine the replication - watermark up to which it is safe to purge change log records. - - If unspecified, defaults to --port + 2. - - --litestream-checkpoint-threshold-mb number default: 40 - ZERO_LITESTREAM_CHECKPOINT_THRESHOLD_MB env - The size of the WAL file at which to perform an SQlite checkpoint to apply - the writes in the WAL to the main database file. Each checkpoint creates - a new WAL segment file that will be backed up by litestream. Smaller thresholds - may improve read performance, at the expense of creating more files to download - when restoring the replica from the backup. - - --litestream-min-checkpoint-page-count number optional - ZERO_LITESTREAM_MIN_CHECKPOINT_PAGE_COUNT env - The WAL page count at which SQLite attempts a PASSIVE checkpoint, which - transfers pages to the main database file without blocking writers. - Defaults to checkpointThresholdMB * 250 (since SQLite page size is 4KB). - - --litestream-max-checkpoint-page-count number optional - ZERO_LITESTREAM_MAX_CHECKPOINT_PAGE_COUNT env - The WAL page count at which SQLite performs a RESTART checkpoint, which - blocks writers until complete. Defaults to minCheckpointPageCount * 10. - Set to 0 to disable RESTART checkpoints entirely. - - --litestream-incremental-backup-interval-minutes number default: 15 - ZERO_LITESTREAM_INCREMENTAL_BACKUP_INTERVAL_MINUTES env - The interval between incremental backups of the replica. Shorter intervals - reduce the amount of change history that needs to be replayed when catching - up a new view-syncer, at the expense of increasing the number of files needed - to download for the initial litestream restore. - - --litestream-snapshot-backup-interval-hours number default: 12 - ZERO_LITESTREAM_SNAPSHOT_BACKUP_INTERVAL_HOURS env - The interval between snapshot backups of the replica. Snapshot backups - make a full copy of the database to a new litestream generation. This - improves restore time at the expense of bandwidth. Applications with a - large database and low write rate can increase this interval to reduce - network usage for backups (litestream defaults to 24 hours). - - --litestream-restore-parallelism number default: 48 - ZERO_LITESTREAM_RESTORE_PARALLELISM env - The number of WAL files to download in parallel when performing the - initial restore of the replica from the backup. - - --litestream-multipart-concurrency number default: 48 - ZERO_LITESTREAM_MULTIPART_CONCURRENCY env - The number of parts (of size --litestream-multipart-size bytes) - to upload or download in parallel when backing up or restoring the snapshot. - - --litestream-multipart-size number default: 16777216 - ZERO_LITESTREAM_MULTIPART_SIZE env - The size of each part when uploading or downloading the snapshot with - --multipart-concurrency. Note that up to concurrency * size - bytes of memory are used when backing up or restoring the snapshot. - - --storage-db-tmp-dir string optional - ZERO_STORAGE_DB_TMP_DIR env - tmp directory for IVM operator storage. Leave unset to use os.tmpdir() - - --initial-sync-table-copy-workers number default: 5 - ZERO_INITIAL_SYNC_TABLE_COPY_WORKERS env - The number of parallel workers used to copy tables during initial sync. - Each worker uses a database connection and will buffer up to (approximately) - 10 MB of table data in memory during initial sync. Increasing the number of - workers may improve initial sync speed; however, note that local disk throughput - (i.e. IOPS), upstream CPU, and network bandwidth may also be bottlenecks. - - --lazy-startup boolean default: false - ZERO_LAZY_STARTUP env - Delay starting the majority of zero-cache until first request. - - This is mainly intended to avoid connecting to Postgres replication stream - until the first request is received, which can be useful i.e., for preview instances. - - Currently only supported in single-node mode. - - --server-version string optional - ZERO_SERVER_VERSION env - The version string outputted to logs when the server starts up. - - --enable-telemetry boolean default: true - ZERO_ENABLE_TELEMETRY env - Set to false to opt out of telemetry collection. - - This helps us improve Zero by collecting anonymous usage data. - Setting the DO_NOT_TRACK environment variable also disables telemetry. - - --cloud-event-sink-env string optional - ZERO_CLOUD_EVENT_SINK_ENV env - ENV variable containing a URI to a CloudEvents sink. When set, ZeroEvents - will be published to the sink as the data field of CloudEvents. - The source field of the CloudEvents will be set to the ZERO_TASK_ID, - along with any extension attributes specified by the ZERO_CLOUD_EVENT_EXTENSION_OVERRIDES_ENV. - - This configuration is modeled to easily integrate with a knative K_SINK binding, - (i.e. https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding). - However, any CloudEvents sink can be used. - - --cloud-event-extension-overrides-env string optional - ZERO_CLOUD_EVENT_EXTENSION_OVERRIDES_ENV env - ENV variable containing a JSON stringified object with an extensions field - containing attributes that should be added or overridden on outbound CloudEvents. - - This configuration is modeled to easily integrate with a knative K_CE_OVERRIDES binding, - (i.e. https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding). - + --upstream-db string required + ZERO_UPSTREAM_DB env + The "upstream" authoritative postgres database. + In the future we will support other types of upstream besides PG. + + --upstream-max-conns number default: 20 + ZERO_UPSTREAM_MAX_CONNS env + The maximum number of connections to open to the upstream database + for committing mutations. This is divided evenly amongst sync workers. + In addition to this number, zero-cache uses one connection for the + replication stream. + + Note that this number must allow for at least one connection per + sync worker, or zero-cache will fail to start. See num-sync-workers + + --mutate-url string[] optional + ZERO_MUTATE_URL env + The URL of the API server to which zero-cache will push mutations. + + IMPORTANT: URLs are matched using URLPattern, a standard Web API. + + Pattern Syntax: + URLPattern uses a simple and intuitive syntax similar to Express routes. + Wildcards and named parameters make it easy to match multiple URLs. + + Basic Examples: + Exact URL match: + "https://api.example.com/mutate" + Any subdomain using wildcard: + "https://*.example.com/mutate" + Multiple subdomain levels: + "https://*.*.example.com/mutate" + Any path under a domain: + "https://api.example.com/*" + Named path parameters: + "https://api.example.com/:version/mutate" + ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. + + Advanced Patterns: + Optional path segments: + "https://api.example.com/:path?" + Regex in segments (for specific patterns): + "https://api.example.com/:version(v\\d+)/mutate" + ↳ Matches only "v" followed by digits + + Multiple patterns: + ["https://api1.example.com/mutate", "https://api2.example.com/mutate"] + + Note: Query parameters and URL fragments (#) are automatically ignored during matching. + + For full URLPattern syntax, see: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern + + --mutate-api-key string optional + ZERO_MUTATE_API_KEY env + An optional secret used to authorize zero-cache to call the API server handling writes. + + --mutate-forward-cookies boolean default: false + ZERO_MUTATE_FORWARD_COOKIES env + If true, zero-cache will forward cookies from the request. + This is useful for passing authentication cookies to the API server. + If false, cookies are not forwarded. + + --mutate-allowed-client-headers string[] optional + ZERO_MUTATE_ALLOWED_CLIENT_HEADERS env + A list of header names that clients are allowed to set via custom headers. + If specified, only headers in this list will be forwarded to the push URL. + Header names are case-insensitive. + If not specified, no client-provided headers are forwarded (secure by default). + Example: ZERO_MUTATE_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id + + --query-url string[] optional + ZERO_QUERY_URL env + The URL of the API server to which zero-cache will send synced queries. + + IMPORTANT: URLs are matched using URLPattern, a standard Web API. + + Pattern Syntax: + URLPattern uses a simple and intuitive syntax similar to Express routes. + Wildcards and named parameters make it easy to match multiple URLs. + + Basic Examples: + Exact URL match: + "https://api.example.com/mutate" + Any subdomain using wildcard: + "https://*.example.com/mutate" + Multiple subdomain levels: + "https://*.*.example.com/mutate" + Any path under a domain: + "https://api.example.com/*" + Named path parameters: + "https://api.example.com/:version/mutate" + ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. + + Advanced Patterns: + Optional path segments: + "https://api.example.com/:path?" + Regex in segments (for specific patterns): + "https://api.example.com/:version(v\\d+)/mutate" + ↳ Matches only "v" followed by digits + + Multiple patterns: + ["https://api1.example.com/mutate", "https://api2.example.com/mutate"] + + Note: Query parameters and URL fragments (#) are automatically ignored during matching. + + For full URLPattern syntax, see: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern + + --query-api-key string optional + ZERO_QUERY_API_KEY env + An optional secret used to authorize zero-cache to call the API server handling writes. + + --query-forward-cookies boolean default: false + ZERO_QUERY_FORWARD_COOKIES env + If true, zero-cache will forward cookies from the request. + This is useful for passing authentication cookies to the API server. + If false, cookies are not forwarded. + + --query-allowed-client-headers string[] optional + ZERO_QUERY_ALLOWED_CLIENT_HEADERS env + A list of header names that clients are allowed to set via custom headers. + If specified, only headers in this list will be forwarded to the query URL. + Header names are case-insensitive. + If not specified, no client-provided headers are forwarded (secure by default). + Example: ZERO_QUERY_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id + + --cvr-db string optional + ZERO_CVR_DB env + The Postgres database used to store CVRs. CVRs (client view records) keep track + of the data synced to clients in order to determine the diff to send on reconnect. + If unspecified, the upstream-db will be used. + + --cvr-max-conns number default: 30 + ZERO_CVR_MAX_CONNS env + The maximum number of connections to open to the CVR database. + This is divided evenly amongst sync workers. + + Note that this number must allow for at least one connection per + sync worker, or zero-cache will fail to start. See num-sync-workers + + --cvr-garbage-collection-inactivity-threshold-hours number default: 48 + ZERO_CVR_GARBAGE_COLLECTION_INACTIVITY_THRESHOLD_HOURS env + The duration after which an inactive CVR is eligible for garbage collection. + Note that garbage collection is an incremental, periodic process which does not + necessarily purge all eligible CVRs immediately. + + --cvr-garbage-collection-initial-interval-seconds number default: 60 + ZERO_CVR_GARBAGE_COLLECTION_INITIAL_INTERVAL_SECONDS env + The initial interval at which to check and garbage collect inactive CVRs. + This interval is increased exponentially (up to 16 minutes) when there is + nothing to purge. + + --cvr-garbage-collection-initial-batch-size number default: 25 + ZERO_CVR_GARBAGE_COLLECTION_INITIAL_BATCH_SIZE env + The initial number of CVRs to purge per garbage collection interval. + This number is increased linearly if the rate of new CVRs exceeds the rate of + purged CVRs, in order to reach a steady state. + + Setting this to 0 effectively disables CVR garbage collection. + + --query-hydration-stats boolean optional + ZERO_QUERY_HYDRATION_STATS env + Track and log the number of rows considered by query hydrations which + take longer than log-slow-hydrate-threshold milliseconds. + This is useful for debugging and performance tuning. + + --enable-query-planner boolean default: true + ZERO_ENABLE_QUERY_PLANNER env + Enable the query planner for optimizing ZQL queries. + + The query planner analyzes and optimizes query execution by determining + the most efficient join strategies. + + You can disable the planner if it is picking bad strategies. + + --yield-threshold-ms number default: 10 + ZERO_YIELD_THRESHOLD_MS env + The maximum amount of time in milliseconds that a sync worker will + spend in IVM (processing query hydration and advancement) before yielding + to the event loop. Lower values increase responsiveness and fairness at + the cost of reduced throughput. + + --change-db string optional + ZERO_CHANGE_DB env + The Postgres database used to store recent replication log entries, in order + to sync multiple view-syncers without requiring multiple replication slots on + the upstream database. If unspecified, the upstream-db will be used. + + --change-max-conns number default: 5 + ZERO_CHANGE_MAX_CONNS env + The maximum number of connections to open to the change database. + This is used by the change-streamer for catching up + zero-cache replication subscriptions. + + --replica-file string default: "zero.db" + ZERO_REPLICA_FILE env + File path to the SQLite replica that zero-cache maintains. + This can be lost, but if it is, zero-cache will have to re-replicate next + time it starts up. + + --replica-vacuum-interval-hours number optional + ZERO_REPLICA_VACUUM_INTERVAL_HOURS env + Performs a VACUUM at server startup if the specified number of hours has elapsed + since the last VACUUM (or initial-sync). The VACUUM operation is heavyweight + and requires double the size of the db in disk space. If unspecified, VACUUM + operations are not performed. + + --log-level debug,info,warn,error default: "info" + ZERO_LOG_LEVEL env + + --log-format text,json default: "text" + ZERO_LOG_FORMAT env + Use text for developer-friendly console logging + and json for consumption by structured-logging services + + --log-slow-row-threshold number default: 2 + ZERO_LOG_SLOW_ROW_THRESHOLD env + The number of ms a row must take to fetch from table-source before it is considered slow. + + --log-slow-hydrate-threshold number default: 100 + ZERO_LOG_SLOW_HYDRATE_THRESHOLD env + The number of milliseconds a query hydration must take to print a slow warning. + + --log-ivm-sampling number default: 5000 + ZERO_LOG_IVM_SAMPLING env + How often to collect IVM metrics. 1 out of N requests will be sampled where N is this value. + + --app-id string default: "zero" + ZERO_APP_ID env + Unique identifier for the app. + + Multiple zero-cache apps can run on a single upstream database, each of which + is isolated from the others, with its own permissions, sharding (future feature), + and change/cvr databases. + + The metadata of an app is stored in an upstream schema with the same name, + e.g. "zero", and the metadata for each app shard, e.g. client and mutation + ids, is stored in the "{app-id}_{#}" schema. (Currently there is only a single + "0" shard, but this will change with sharding). + + The CVR and Change data are managed in schemas named "{app-id}_{shard-num}/cvr" + and "{app-id}_{shard-num}/cdc", respectively, allowing multiple apps and shards + to share the same database instance (e.g. a Postgres "cluster") for CVR and Change management. + + Due to constraints on replication slot names, an App ID may only consist of + lower-case letters, numbers, and the underscore character. + + Note that this option is used by both zero-cache and zero-deploy-permissions. + + --app-publications string[] default: [] + ZERO_APP_PUBLICATIONS env + Postgres PUBLICATIONs that define the tables and columns to + replicate. Publication names may not begin with an underscore, + as zero reserves that prefix for internal use. + + If unspecified, zero-cache will create and use an internal publication that + publishes all tables in the public schema, i.e.: + + CREATE PUBLICATION _{app-id}_public_0 FOR TABLES IN SCHEMA public; + + Note that changing the set of publications will result in resyncing the replica, + which may involve downtime (replication lag) while the new replica is initializing. + To change the set of publications without disrupting an existing app, a new app + should be created. + + --port number default: 4848 + ZERO_PORT env + The port for sync connections. + + --change-streamer-uri string optional + ZERO_CHANGE_STREAMER_URI env + When set, connects to the change-streamer at the given URI. + In a multi-node setup, this should be specified in view-syncer options, + pointing to the replication-manager URI, which runs a change-streamer + on port 4849. + + --change-streamer-mode dedicated,discover default: "dedicated" + ZERO_CHANGE_STREAMER_MODE env + As an alternative to ZERO_CHANGE_STREAMER_URI, the ZERO_CHANGE_STREAMER_MODE + can be set to "discover" to instruct the view-syncer to connect to the + ip address registered by the replication-manager upon startup. + + This may not work in all networking configurations, e.g. certain private + networking or port forwarding configurations. Using the ZERO_CHANGE_STREAMER_URI + with an explicit routable hostname is recommended instead. + + Note: This option is ignored if the ZERO_CHANGE_STREAMER_URI is set. + + --change-streamer-port number optional + ZERO_CHANGE_STREAMER_PORT env + The port on which the change-streamer runs. This is an internal + protocol between the replication-manager and view-syncers, which + runs in the same process tree in local development or a single-node configuration. + + If unspecified, defaults to --port + 1. + + --change-streamer-startup-delay-ms number default: 15000 + ZERO_CHANGE_STREAMER_STARTUP_DELAY_MS env + The delay to wait before the change-streamer takes over the replication stream + (i.e. the handoff during replication-manager updates), to allow loadbalancers to register + the task as healthy based on healthcheck parameters. Note that if a change stream request + is received during this interval, the delay will be canceled and the takeover will happen + immediately, since the incoming request indicates that the task is registered as a target. + + --change-streamer-back-pressure-limit-heap-proportion number default: 0.04 + ZERO_CHANGE_STREAMER_BACK_PRESSURE_LIMIT_HEAP_PROPORTION env + The percentage of --max-old-space-size to use as a buffer for absorbing replication + stream spikes. When the estimated amount of queued data exceeds this threshold, back pressure + is applied to the replication stream, delaying downstream sync as a result. + + The threshold was determined empirically with load testing. Higher thresholds have resulted + in OOMs. Note also that the byte-counting logic in the queue is strictly an underestimate of + actual memory usage (but importantly, proportionally correct), so the queue is actually + using more than what this proportion suggests. + + This parameter is exported as an emergency knob to reduce the size of the buffer in the + event that the server OOMs from back pressure. Resist the urge to increase this + proportion, as it is mainly useful for absorbing periodic spikes and does not meaningfully + affect steady-state replication throughput; the latter is determined by other factors such + as object serialization and PG throughput + + In other words, the back pressure limit does not constrain replication throughput; + rather, it protects the system when the upstream throughput exceeds the downstream + throughput. + + --change-streamer-flow-control-consensus-padding-seconds number default: 1 + ZERO_CHANGE_STREAMER_FLOW_CONTROL_CONSENSUS_PADDING_SECONDS env + During periodic flow control checks (every 64kb), the amount of time to wait after the + majority of subscribers have acked, after which replication will continue even if + some subscribers have yet to ack. (Note that this is not a timeout for the entire send, + but a timeout that starts after the majority of receivers have acked.) + + This allows a bounded amount of time for backlogged subscribers to catch up on each flush + without forcing all subscribers to wait for the entire backlog to be processed. It is also + useful for mitigating the effect of unresponsive subscribers due to severed websocket + connections (until liveness checks disconnect them). + + Set this to a negative number to disable early flow control releases. (Not recommended, but + available as an emergency measure.) + + --task-id string optional + ZERO_TASK_ID env + Globally unique identifier for the zero-cache instance. + + Setting this to a platform specific task identifier can be useful for debugging. + If unspecified, zero-cache will attempt to extract the TaskARN if run from within + an AWS ECS container, and otherwise use a random string. + + --per-user-mutation-limit-max number optional + ZERO_PER_USER_MUTATION_LIMIT_MAX env + The maximum mutations per user within the specified windowMs. + If unset, no rate limiting is enforced. + + --per-user-mutation-limit-window-ms number default: 60000 + ZERO_PER_USER_MUTATION_LIMIT_WINDOW_MS env + The sliding window over which the perUserMutationLimitMax is enforced. + + --num-sync-workers number optional + ZERO_NUM_SYNC_WORKERS env + The number of processes to use for view syncing. + Leave this unset to use the maximum available parallelism. + If set to 0, the server runs without sync workers, which is the + configuration for running the replication-manager. + + --auto-reset boolean default: true + ZERO_AUTO_RESET env + Automatically wipe and resync the replica when replication is halted. + This situation can occur for configurations in which the upstream database + provider prohibits event trigger creation, preventing the zero-cache from + being able to correctly replicate schema changes. For such configurations, + an upstream schema change will instead result in halting replication with an + error indicating that the replica needs to be reset. + + When auto-reset is enabled, zero-cache will respond to such situations + by shutting down, and when restarted, resetting the replica and all synced + clients. This is a heavy-weight operation and can result in user-visible + slowness or downtime if compute resources are scarce. + + --admin-password string optional + ZERO_ADMIN_PASSWORD env + A password used to administer zero-cache server, for example to access the + /statz endpoint. + + A password is optional in development mode but required in production mode. + + --websocket-compression boolean default: false + ZERO_WEBSOCKET_COMPRESSION env + Enable WebSocket per-message deflate compression. + + Compression can reduce bandwidth usage for sync traffic but + increases CPU usage on both client and server. Disabled by default. + + See: https://github.com/websockets/ws#websocket-compression + + --websocket-compression-options string optional + ZERO_WEBSOCKET_COMPRESSION_OPTIONS env + JSON string containing WebSocket compression options. + + Only used if websocketCompression is enabled. + + Example: {"zlibDeflateOptions":{"level":3},"threshold":1024} + + See https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback for available options. + + --websocket-max-payload-bytes number default: 10485760 + ZERO_WEBSOCKET_MAX_PAYLOAD_BYTES env + Maximum size of incoming WebSocket messages in bytes. + + Messages exceeding this limit are rejected before parsing. + Default: 10MB (10 * 1024 * 1024 = 10485760) + + --litestream-executable string optional + ZERO_LITESTREAM_EXECUTABLE env + Path to the litestream executable. + + --litestream-config-path string default: "./src/services/litestream/config.yml" + ZERO_LITESTREAM_CONFIG_PATH env + Path to the litestream yaml config file. zero-cache will run this with its + environment variables, which can be referenced in the file via \${ENV} + substitution, for example: + * ZERO_REPLICA_FILE for the db path + * ZERO_LITESTREAM_BACKUP_LOCATION for the db replica url + * ZERO_LITESTREAM_LOG_LEVEL for the log level + * ZERO_LOG_FORMAT for the log type + + --litestream-log-level debug,info,warn,error default: "warn" + ZERO_LITESTREAM_LOG_LEVEL env + + --litestream-backup-url string optional + ZERO_LITESTREAM_BACKUP_URL env + The location of the litestream backup, usually an s3:// URL. + This is only consulted by the replication-manager. + view-syncers receive this information from the replication-manager. + + --litestream-endpoint string optional + ZERO_LITESTREAM_ENDPOINT env + The S3-compatible endpoint URL to use for the litestream backup. Only required for non-AWS services. + The replication-manager and view-syncers must have the same endpoint. + + --litestream-port number optional + ZERO_LITESTREAM_PORT env + Port on which litestream exports metrics, used to determine the replication + watermark up to which it is safe to purge change log records. + + If unspecified, defaults to --port + 2. + + --litestream-checkpoint-threshold-mb number default: 40 + ZERO_LITESTREAM_CHECKPOINT_THRESHOLD_MB env + The size of the WAL file at which to perform an SQlite checkpoint to apply + the writes in the WAL to the main database file. Each checkpoint creates + a new WAL segment file that will be backed up by litestream. Smaller thresholds + may improve read performance, at the expense of creating more files to download + when restoring the replica from the backup. + + --litestream-min-checkpoint-page-count number optional + ZERO_LITESTREAM_MIN_CHECKPOINT_PAGE_COUNT env + The WAL page count at which SQLite attempts a PASSIVE checkpoint, which + transfers pages to the main database file without blocking writers. + Defaults to checkpointThresholdMB * 250 (since SQLite page size is 4KB). + + --litestream-max-checkpoint-page-count number optional + ZERO_LITESTREAM_MAX_CHECKPOINT_PAGE_COUNT env + The WAL page count at which SQLite performs a RESTART checkpoint, which + blocks writers until complete. Defaults to minCheckpointPageCount * 10. + Set to 0 to disable RESTART checkpoints entirely. + + --litestream-incremental-backup-interval-minutes number default: 15 + ZERO_LITESTREAM_INCREMENTAL_BACKUP_INTERVAL_MINUTES env + The interval between incremental backups of the replica. Shorter intervals + reduce the amount of change history that needs to be replayed when catching + up a new view-syncer, at the expense of increasing the number of files needed + to download for the initial litestream restore. + + --litestream-snapshot-backup-interval-hours number default: 12 + ZERO_LITESTREAM_SNAPSHOT_BACKUP_INTERVAL_HOURS env + The interval between snapshot backups of the replica. Snapshot backups + make a full copy of the database to a new litestream generation. This + improves restore time at the expense of bandwidth. Applications with a + large database and low write rate can increase this interval to reduce + network usage for backups (litestream defaults to 24 hours). + + --litestream-restore-parallelism number default: 48 + ZERO_LITESTREAM_RESTORE_PARALLELISM env + The number of WAL files to download in parallel when performing the + initial restore of the replica from the backup. + + --litestream-multipart-concurrency number default: 48 + ZERO_LITESTREAM_MULTIPART_CONCURRENCY env + The number of parts (of size --litestream-multipart-size bytes) + to upload or download in parallel when backing up or restoring the snapshot. + + --litestream-multipart-size number default: 16777216 + ZERO_LITESTREAM_MULTIPART_SIZE env + The size of each part when uploading or downloading the snapshot with + --multipart-concurrency. Note that up to concurrency * size + bytes of memory are used when backing up or restoring the snapshot. + + --storage-db-tmp-dir string optional + ZERO_STORAGE_DB_TMP_DIR env + tmp directory for IVM operator storage. Leave unset to use os.tmpdir() + + --initial-sync-table-copy-workers number default: 5 + ZERO_INITIAL_SYNC_TABLE_COPY_WORKERS env + The number of parallel workers used to copy tables during initial sync. + Each worker uses a database connection and will buffer up to (approximately) + 10 MB of table data in memory during initial sync. Increasing the number of + workers may improve initial sync speed; however, note that local disk throughput + (i.e. IOPS), upstream CPU, and network bandwidth may also be bottlenecks. + + --lazy-startup boolean default: false + ZERO_LAZY_STARTUP env + Delay starting the majority of zero-cache until first request. + + This is mainly intended to avoid connecting to Postgres replication stream + until the first request is received, which can be useful i.e., for preview instances. + + Currently only supported in single-node mode. + + --server-version string optional + ZERO_SERVER_VERSION env + The version string outputted to logs when the server starts up. + + --enable-telemetry boolean default: true + ZERO_ENABLE_TELEMETRY env + Set to false to opt out of telemetry collection. + + This helps us improve Zero by collecting anonymous usage data. + Setting the DO_NOT_TRACK environment variable also disables telemetry. + + --cloud-event-sink-env string optional + ZERO_CLOUD_EVENT_SINK_ENV env + ENV variable containing a URI to a CloudEvents sink. When set, ZeroEvents + will be published to the sink as the data field of CloudEvents. + The source field of the CloudEvents will be set to the ZERO_TASK_ID, + along with any extension attributes specified by the ZERO_CLOUD_EVENT_EXTENSION_OVERRIDES_ENV. + + This configuration is modeled to easily integrate with a knative K_SINK binding, + (i.e. https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding). + However, any CloudEvents sink can be used. + + --cloud-event-extension-overrides-env string optional + ZERO_CLOUD_EVENT_EXTENSION_OVERRIDES_ENV env + ENV variable containing a JSON stringified object with an extensions field + containing attributes that should be added or overridden on outbound CloudEvents. + + This configuration is modeled to easily integrate with a knative K_CE_OVERRIDES binding, + (i.e. https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding). + " `); }); diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index b75420f04c..104bc06c80 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -576,6 +576,24 @@ export const zeroOptions = { `throughput.`, ], }, + + flowControlConsensusPaddingSeconds: { + type: v.number().default(1), + desc: [ + `During periodic flow control checks (every 64kb), the amount of time to wait after the`, + `majority of subscribers have acked, after which replication will continue even if`, + `some subscribers have yet to ack. (Note that this is not a timeout for the {italic entire} send,`, + `but a timeout that starts {italic after} the majority of receivers have acked.)`, + ``, + `This allows a bounded amount of time for backlogged subscribers to catch up on each flush`, + `without forcing all subscribers to wait for the entire backlog to be processed. It is also`, + `useful for mitigating the effect of unresponsive subscribers due to severed websocket`, + `connections (until liveness checks disconnect them).`, + ``, + `Set this to a negative number to disable early flow control releases. (Not recommended, but`, + `available as an emergency measure.)`, + ], + }, }, taskID: { diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index 20e07acf88..5a61239aad 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -43,6 +43,7 @@ export default async function runWorker( protocol, startupDelayMs, backPressureLimitHeapProportion, + flowControlConsensusPaddingSeconds, }, upstream, change, @@ -106,6 +107,7 @@ export default async function runWorker( subscriptionState, autoReset ?? false, backPressureLimitHeapProportion, + flowControlConsensusPaddingSeconds, setTimeout, ); break; diff --git a/packages/zero-cache/src/services/change-streamer/broadcast.test.ts b/packages/zero-cache/src/services/change-streamer/broadcast.test.ts new file mode 100644 index 0000000000..97a156c2ce --- /dev/null +++ b/packages/zero-cache/src/services/change-streamer/broadcast.test.ts @@ -0,0 +1,107 @@ +import {consoleLogSink, LogContext} from '@rocicorp/logger'; +import {describe, expect, test} from 'vitest'; +import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; +import {sleep} from '../../../../shared/src/sleep.ts'; +import {ReplicationMessages} from '../replicator/test-utils.ts'; +import {Broadcast} from './broadcast.ts'; +import {createSubscriber} from './test-utils.ts'; + +describe('change-streamer/broadcast', () => { + const messages = new ReplicationMessages({issues: 'id'}); + const lc = new LogContext('debug', {}, consoleLogSink); + createSilentLogContext(); + + test('without tracking', () => { + const [sub1, stream1] = createSubscriber('00', true); + const [sub2, stream2] = createSubscriber('00', true); + const [sub3, stream3] = createSubscriber('00', true); + const [sub4, stream4] = createSubscriber('00', true); + + Broadcast.withoutTracking( + [sub1, sub2, sub3, sub4], + ['11', ['begin', messages.begin(), {commitWatermark: '13'}]], + ); + + for (const sub of [sub1, sub2, sub3, sub4]) { + sub.close(); + } + + for (const stream of [stream1, stream2, stream3, stream4]) { + // sub1 gets all of the messages, as it was not added in a transaction. + expect(stream).toMatchObject([ + ['status', {tag: 'status'}], + ['begin', {tag: 'begin'}, {commitWatermark: '13'}], + ]); + } + }); + + test('with tracking', async () => { + const [sub1, stream1] = createSubscriber('00', true); + const [sub2, stream2] = createSubscriber('00', true); + const [sub3, stream3] = createSubscriber('00', true); + const [sub4, stream4] = createSubscriber('00', true); + + const broadcast = new Broadcast( + [sub1, sub2, sub3, sub4], + ['11', ['begin', messages.begin(), {commitWatermark: '13'}]], + ); + + expect(broadcast.isDone).toBe(false); + + for (const sub of [sub1, sub2, sub3]) { + sub.close(); + } + + expect(broadcast.isDone).toBe(false); + sub4.close(); + + await broadcast.done; + expect(broadcast.isDone).toBe(true); + + for (const stream of [stream1, stream2, stream3, stream4]) { + // sub1 gets all of the messages, as it was not added in a transaction. + expect(stream).toMatchObject([ + ['status', {tag: 'status'}], + ['begin', {tag: 'begin'}, {commitWatermark: '13'}], + ]); + } + }); + + test('checkProgress', async () => { + const [sub1] = createSubscriber('00', true); + const [sub2] = createSubscriber('00', true); + const [sub3] = createSubscriber('00', true); + const [sub4] = createSubscriber('00', true); + + const broadcast = new Broadcast( + [sub1, sub2, sub3, sub4], + ['11', ['begin', messages.begin(), {commitWatermark: '13'}]], + ); + + expect(broadcast.isDone).toBe(false); + + sub1.close(); + sub2.close(); + + await sleep(1); + const twoDoneTime = performance.now(); + + // 2 is less than majority, so checkProgress should not yet advance. + expect(broadcast.checkProgress(lc, 2000, twoDoneTime + 2100)).toBe(false); + + sub3.close(); + await sleep(1); + const threeDoneTime = performance.now(); + + // 3 reaches majority, but not enough time has elapsed. + expect(broadcast.checkProgress(lc, 2000, threeDoneTime + 1100)).toBe(false); + + expect(broadcast.isDone).toBe(false); + + // Once enough time has elapsed, the flow should advance. + expect(broadcast.checkProgress(lc, 2000, threeDoneTime + 2100)).toBe(true); + + await broadcast.done; + expect(broadcast.isDone).toBe(true); + }); +}); diff --git a/packages/zero-cache/src/services/change-streamer/broadcast.ts b/packages/zero-cache/src/services/change-streamer/broadcast.ts new file mode 100644 index 0000000000..1e7f1212f7 --- /dev/null +++ b/packages/zero-cache/src/services/change-streamer/broadcast.ts @@ -0,0 +1,216 @@ +import type {LogContext} from '@rocicorp/logger'; +import {resolver} from '@rocicorp/resolver'; +import type {WatermarkedChange} from './change-streamer-service.ts'; +import type {Subscriber} from './subscriber.ts'; + +/** + * Initiates and tracks the progress of a change broadcasted to + * a set of subscribers. + * + * Creating a `Broadcast` automatically initiates the send. + * + * By default, {@link Broadcast.done} resolves when all subscribers + * have acked the change. However, {@link Broadcast.checkProgress()} + * can be called to resolve the broadcast earlier based on the flow + * control policy. + */ +export class Broadcast { + /** + * Sends the change to the subscribers without the tracking machinery. + * This is suitable for fire-and-forget (i.e. pipelined) sends. + */ + static withoutTracking( + subscribers: Iterable, + change: WatermarkedChange, + ) { + for (const sub of subscribers) { + void sub.send(change); + } + } + + readonly #pending: Set; + readonly #completed: Completed[]; + readonly #done = resolver(); + #isDone = false; + + readonly #watermark: string; + readonly #majority: number; + + readonly #start = performance.now(); + #latestCompleted = Number.MAX_VALUE; + + /** + * Broadcasts the `change` to the `subscribers` and tracks their + * completion. + */ + constructor(subscribers: Iterable, change: WatermarkedChange) { + this.#pending = new Set(subscribers); + this.#completed = []; + this.#watermark = change[0]; + this.#majority = Math.floor(this.#pending.size / 2) + 1; + + for (const sub of this.#pending) { + const changes = sub.numPending + 1; // add one for this `change` + void sub + .send(change) + .catch(() => {}) + .finally(() => this.#markCompleted(sub, changes)); + } + + // set done if there are no subscribers (mainly for tests) + if (this.#pending.size === 0) { + this.#setDone(); + } + } + + #markCompleted(sub: Subscriber, changes: number) { + const elapsed = (this.#latestCompleted = performance.now()) - this.#start; + this.#completed.push({sub, changes, elapsed}); + this.#pending.delete(sub); + if (this.#pending.size === 0) { + this.#setDone(); + } + } + + #setDone() { + this.#isDone = true; + this.#done.resolve(); + } + + get isDone(): boolean { + return this.#isDone; + } + + get done(): Promise { + return this.#done.promise; + } + + /** + * Checks for pathological situations in which flow should be reenabled + * before all subscribers have acked. + * + * ### Background + * + * The purpose of flow control is to pull upstream replication changes + * no faster than the rate as they are processed by downstream subscribers + * in the steady state. In the change-streamer, this is done by occasionally + * waiting for ACKs from subscribers before continuing; without doing so, + * I/O buffers fill up and cause the system to spend most of its time in GC. + * + * However, the naive algorithm of always waiting for all subscribers (e.g. + * `Promise.all()`) can behave poorly in scenarios where subscribers + * are imbalanced: + * * New subscribers may have a backlog of changes to catch up with. + * Having all subscribers wait for the new subscriber to catch up results + * in delaying the entire application. + * * Broken TCP connections similarly require all subscribers to wait until + * connection liveness checks kick in and disconnect the subscriber. + * + * A simplistic approach is to add a limit to the amount of time waiting for + * subscribers, i.e. an ack timeout. However, deciding what this timeout + * should be is non-trivial because of the heterogeneous nature of changes; + * while most changes operate on single rows and are relatively predictable + * in terms of running time, some changes are table-wide operations and can + * legitimately take an arbitrary amount of time. In such scenarios, a + * timeout that is too short can stop progress on replication altogether. + * + * ### Consensus-based Timeout Algorithm + * + * To address these shortcomings, a "consensus-based timeout" algorithm is + * used: + * * Wait for more than half of the subscribers to finish. (In + * case of a single node, or the case of one replication-manager + * and one view-syncer, this reduces to waiting for all subscribers.) + * * Once more than half of the subscribers have finished, proceed after + * a fixed timeout elapses (e.g. 1 second), even if not all subscribers + * have finished. + * + * In other words, the subscribers themselves are used to determine the + * timeout of each batch of changes; the majority determines this when + * they complete, upon which a timeout is logically started. + * + * In the common case, the remaining subscribers finish soon afterward and + * the timeout never elapses. However, in pathological cases where a minority + * of subscribers have a disproportionate amount of load, some will still + * be processing (or otherwise unresponsive). These subscribers are given + * a bounded amount of time to catch up at each flushed batch, up to the + * timeout interval. This guarantees eventual catchup because the + * subscribers with a backlog of changes necessarily have a higher + * processing rate than the subscribers that finished (and are made to wait). + * + * ### Not implemented: Broken connection detection + * + * If a subscriber has not made progress for a certain interval, the + * algorithm could theoretically drop it preemptively, supplementing the + * existing websocket-level liveness checks. + * + * However, a more reliable approach would be to change the replicator + * to use non-blocking writes, and subsequently increase the frequency of + * connection-level liveness checks. The current synchronous replica writes + * can delay both ping responsiveness and change progress arbitrarily (e.g. + * a large index creation); an independently liveness check that is not + * delayed by synchronous writes on the subscriber would be a more failsafe + * solution. + * + * @returns `true` if the broadcast was already done or was marked done. + */ + checkProgress( + lc: LogContext, + flowControlConsensusPaddingMs: number, + now: number, + ) { + if (this.#pending.size === 0) { + return true; + } + const elapsed = now - this.#start; + if (this.#completed.length < this.#majority) { + if (elapsed >= 1000) { + this.#logWithState( + lc, + `waiting for at least ${this.#majority} subscribers to finish`, + elapsed, + ); + } + return false; + } + // Note: In the implementation, #latestCompleted is always updated, + // even after the majority is reached. This is fine and does not affect + // the important properties of the algorithm. + if (now - this.#latestCompleted >= flowControlConsensusPaddingMs) { + this.#logWithState( + lc, + `continuing with ${this.#pending.size} subscriber(s) still pending`, + elapsed, + ); + this.#setDone(); + return true; + } + return false; + } + + #logWithState(lc: LogContext, msg: string, elapsed: number) { + lc.withContext('watermark', this.#watermark).info?.( + `${msg} (${elapsed.toFixed(3)} ms)`, + { + completed: this.#completed.map(d => ({ + id: d.sub.id, + processed: d.changes, + elapsed: d.elapsed, + })), + pending: [...this.#pending].map(sub => ({ + id: sub.id, + ...sub.getStats(), + })), + }, + ); + } +} + +/** Tracks the completed result of a single subscriber. */ +type Completed = { + sub: Subscriber; + /** The number of changes processed. */ + changes: number; + /** The elapsed milliseconds. */ + elapsed: number; +}; diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index 431e046aa9..dd063f6993 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -79,6 +79,7 @@ describe('change-streamer/service', () => { replicaConfig, true, 0.04, + 1, setTimeoutFn as unknown as typeof setTimeout, ); streamerDone = streamer.run(); @@ -910,6 +911,7 @@ describe('change-streamer/service', () => { replicaConfig, true, 0.04, + 1, ); void streamer.run(); @@ -935,6 +937,7 @@ describe('change-streamer/service', () => { replicaConfig, true, 0.04, + 1, ); void streamer.run(); @@ -957,6 +960,7 @@ describe('change-streamer/service', () => { replicaConfig, true, 0.04, + 1, ); void streamer.run(); @@ -992,6 +996,7 @@ describe('change-streamer/service', () => { replicaConfig, true, 0.04, + 1, ); void streamer.run(); @@ -1029,6 +1034,7 @@ describe('change-streamer/service', () => { replicaConfig, true, 0.04, + 1, ); void streamer.run(); @@ -1083,6 +1089,7 @@ describe('change-streamer/service', () => { replicaConfig, true, 0.04, + 1, ); void streamer.run(); @@ -1154,6 +1161,7 @@ describe('change-streamer/service', () => { replicaConfig, true, 0.04, + 1, ); void streamer.run(); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 5b7fb73dda..206d9ebbc1 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -62,6 +62,7 @@ export async function initializeStreamer( subscriptionState: SubscriptionState, autoReset: boolean, backPressureLimitHeapProportion: number, + flowControlConsensusPaddingSeconds: number, setTimeoutFn = setTimeout, ): Promise { // Make sure the ChangeLog DB is set up. @@ -86,6 +87,7 @@ export async function initializeStreamer( changeSource, autoReset, backPressureLimitHeapProportion, + flowControlConsensusPaddingSeconds, setTimeoutFn, ); } @@ -283,6 +285,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { source: ChangeSource, autoReset: boolean, backPressureLimitHeapProportion: number, + flowControlConsensusPaddingSeconds: number, setTimeoutFn = setTimeout, ) { this.id = `change-streamer`; @@ -303,7 +306,9 @@ class ChangeStreamerImpl implements ChangeStreamerService { err => this.stop(err), backPressureLimitHeapProportion, ); - this.#forwarder = new Forwarder(); + this.#forwarder = new Forwarder(lc, { + flowControlConsensusPaddingSeconds, + }); this.#autoReset = autoReset; this.#state = new RunningState(this.id, undefined, setTimeoutFn); } @@ -311,6 +316,8 @@ class ChangeStreamerImpl implements ChangeStreamerService { async run() { this.#lc.info?.('starting change stream'); + this.#forwarder.startProgressMonitor(); + // Once this change-streamer acquires "ownership" of the change DB, // it is safe to start the storer. await this.#storer.assumeOwnership(); @@ -367,9 +374,12 @@ class ChangeStreamerImpl implements ChangeStreamerService { break; } - unflushedBytes += this.#storer.store([watermark, change]); - const sent = this.#forwarder.forward([watermark, change]); - if (unflushedBytes >= flushBytesThreshold) { + const entry: WatermarkedChange = [watermark, change]; + unflushedBytes += this.#storer.store(entry); + if (unflushedBytes < flushBytesThreshold) { + // pipeline changes until flushBytesThreshold + this.#forwarder.forward(entry); + } else { // Wait for messages to clear socket buffers to ensure that they // make their way to subscribers. Without this `await`, the // messages end up being buffered in this process, which: @@ -377,7 +387,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { // (2) prevents subscribers from processing the messages as they // arrive, instead getting them in a large batch after being // idle while they were queued (causing further delays). - await sent; + await this.#forwarder.forwardWithFlowControl(entry); unflushedBytes = 0; } @@ -420,6 +430,8 @@ class ChangeStreamerImpl implements ChangeStreamerService { : promiseVoid, ]); } + + this.#forwarder.stopProgressMonitor(); this.#lc.info?.('ChangeStreamer stopped'); } diff --git a/packages/zero-cache/src/services/change-streamer/forwarder.test.ts b/packages/zero-cache/src/services/change-streamer/forwarder.test.ts index 2ffad5a227..7d2a1e4f27 100644 --- a/packages/zero-cache/src/services/change-streamer/forwarder.test.ts +++ b/packages/zero-cache/src/services/change-streamer/forwarder.test.ts @@ -1,4 +1,5 @@ import {describe, expect, test} from 'vitest'; +import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import {ReplicationMessages} from '../replicator/test-utils.ts'; import {Forwarder} from './forwarder.ts'; import {createSubscriber} from './test-utils.ts'; @@ -7,7 +8,7 @@ describe('change-streamer/forwarder', () => { const messages = new ReplicationMessages({issues: 'id'}); test('in transaction queueing', () => { - const forwarder = new Forwarder(); + const forwarder = new Forwarder(createSilentLogContext()); const [sub1, stream1] = createSubscriber('00', true); const [sub2, stream2] = createSubscriber('00', true); @@ -15,18 +16,21 @@ describe('change-streamer/forwarder', () => { const [sub4, stream4] = createSubscriber('00', true); forwarder.add(sub1); - void forwarder.forward([ + forwarder.forward([ '11', ['begin', messages.begin(), {commitWatermark: '13'}], ]); forwarder.add(sub2); - void forwarder.forward(['12', ['data', messages.truncate('issues')]]); - void forwarder.forward([ + void forwarder.forwardWithFlowControl([ + '12', + ['data', messages.truncate('issues')], + ]); + void forwarder.forwardWithFlowControl([ '13', ['commit', messages.commit(), {watermark: '13'}], ]); forwarder.add(sub3); - void forwarder.forward([ + forwarder.forward([ '14', ['begin', messages.begin(), {commitWatermark: '15'}], ]); @@ -149,7 +153,7 @@ describe('change-streamer/forwarder', () => { }); test('in transaction queueing, rolled back', () => { - const forwarder = new Forwarder(); + const forwarder = new Forwarder(createSilentLogContext()); const [sub1, stream1] = createSubscriber('00', true); const [sub2, stream2] = createSubscriber('00', true); @@ -162,10 +166,13 @@ describe('change-streamer/forwarder', () => { ['begin', messages.begin(), {commitWatermark: '14'}], ]); forwarder.add(sub2); - void forwarder.forward(['12', ['data', messages.truncate('issues')]]); - void forwarder.forward(['13', ['rollback', messages.rollback()]]); + forwarder.forward(['12', ['data', messages.truncate('issues')]]); + void forwarder.forwardWithFlowControl([ + '13', + ['rollback', messages.rollback()], + ]); forwarder.add(sub3); - void forwarder.forward([ + forwarder.forward([ '14', ['begin', messages.begin(), {commitWatermark: '15'}], ]); diff --git a/packages/zero-cache/src/services/change-streamer/forwarder.ts b/packages/zero-cache/src/services/change-streamer/forwarder.ts index b8d45ed47a..cb5f4f9887 100644 --- a/packages/zero-cache/src/services/change-streamer/forwarder.ts +++ b/packages/zero-cache/src/services/change-streamer/forwarder.ts @@ -1,12 +1,58 @@ +import type {LogContext} from '@rocicorp/logger'; import {joinIterables, wrapIterable} from '../../../../shared/src/iterables.ts'; +import type {ChangeStreamData} from '../change-source/protocol/current.ts'; +import {Broadcast} from './broadcast.ts'; import type {WatermarkedChange} from './change-streamer-service.ts'; import type {Subscriber} from './subscriber.ts'; +export type ProgressMonitorOptions = { + flowControlConsensusPaddingSeconds: number; +}; + export class Forwarder { + readonly #lc: LogContext; + readonly #progressMonitorOptions: ProgressMonitorOptions; readonly #active = new Set(); readonly #queued = new Set(); #inTransaction = false; + #currentBroadcast: Broadcast | undefined; + #progressMonitor: NodeJS.Timeout | undefined; + + constructor( + lc: LogContext, + opts: ProgressMonitorOptions = {flowControlConsensusPaddingSeconds: 1}, + ) { + this.#lc = lc.withContext('component', 'progress-monitor'); + this.#progressMonitorOptions = opts; + } + + startProgressMonitor() { + clearInterval(this.#progressMonitor); + this.#progressMonitor = setInterval(this.#trackProgress, 1000); + } + + readonly #trackProgress = () => { + const now = performance.now(); + for (const sub of this.#active) { + sub.sampleProcessRate(now); + } + + const {flowControlConsensusPaddingSeconds} = this.#progressMonitorOptions; + // A negative number disables early flow control release. + if (flowControlConsensusPaddingSeconds >= 0) { + this.#currentBroadcast?.checkProgress( + this.#lc, + flowControlConsensusPaddingSeconds * 1000, + now, + ); + } + }; + + stopProgressMonitor() { + clearInterval(this.#progressMonitor); + } + /** * `add()` is called in lock step with `Storer.catchup()` so that the * two components have an equivalent interpretation of whether a Transaction is @@ -30,10 +76,37 @@ export class Forwarder { * `forward()` is called in lockstep with `Storer.store()` so that the * two components have an equivalent interpretation of whether a Transaction is * currently being streamed. + * + * This version of forward is fire-and-forget, with no flow control. The + * change-streamer should call and await {@link forwardWithFlowControl()} + * occasionally to avoid memory blowup. + */ + forward(entry: WatermarkedChange) { + Broadcast.withoutTracking(this.#active.values(), entry); + this.#updateActiveSubscribers(entry[1]); + } + + /** + * The flow-control-aware equivalent of {@link forward()}, returning a + * Promise that resolves when replication should continue. */ - async forward(entry: WatermarkedChange) { - const [type] = entry[1]; - const results = Array.from(this.#active.values(), sub => sub.send(entry)); + async forwardWithFlowControl(entry: WatermarkedChange) { + const broadcast = new Broadcast(this.#active.values(), entry); + this.#updateActiveSubscribers(entry[1]); + + // set for progress tracking + this.#currentBroadcast = broadcast; + + await broadcast.done; + + // Technically #currentBroadcast may have changed, so only + // unset if it if is still the same. + if (this.#currentBroadcast === broadcast) { + this.#currentBroadcast = undefined; + } + } + + #updateActiveSubscribers([type]: ChangeStreamData) { switch (type) { case 'begin': // While in a Transaction, all added subscribers are "queued" so that no @@ -57,7 +130,6 @@ export class Forwarder { this.#queued.clear(); break; } - await Promise.all(results); } getAcks(): Set { diff --git a/packages/zero-cache/src/services/change-streamer/subscriber.test.ts b/packages/zero-cache/src/services/change-streamer/subscriber.test.ts index 8c82ea82e5..d56c1511e3 100644 --- a/packages/zero-cache/src/services/change-streamer/subscriber.test.ts +++ b/packages/zero-cache/src/services/change-streamer/subscriber.test.ts @@ -158,7 +158,7 @@ describe('change-streamer/subscriber', () => { `); }); - test('ack tracking', async () => { + test('acks, pending, processed, stats', async () => { const [sub, _, receiver] = createSubscriber('00'); // Send some messages while it is catching up. @@ -182,8 +182,16 @@ describe('change-streamer/subscriber', () => { expect(sub.acked).toBe('00'); + let processed = 0; + let pending = 8; + expect(sub.getStats()).toEqual({processRate: 0, pending: 8}); + expect(sub.numPending).toBe(pending); + let txNum = 0; for await (const msg of receiver) { + expect(sub.numProcessed).toBe(processed++); + expect(sub.numPending).toBe(pending--); + if (msg[0] === 'begin') { txNum++; } @@ -203,5 +211,9 @@ describe('change-streamer/subscriber', () => { break; } } + expect(sub.numProcessed).toBe(8); + expect( + sub.sampleProcessRate(performance.now()).getStats().processRate, + ).toBeGreaterThan(0); }); }); diff --git a/packages/zero-cache/src/services/change-streamer/subscriber.ts b/packages/zero-cache/src/services/change-streamer/subscriber.ts index d2cdf066b4..85ddfa3aca 100644 --- a/packages/zero-cache/src/services/change-streamer/subscriber.ts +++ b/packages/zero-cache/src/services/change-streamer/subscriber.ts @@ -1,5 +1,6 @@ import {assert} from '../../../../shared/src/asserts.ts'; import type {Enum} from '../../../../shared/src/enum.ts'; +import {must} from '../../../../shared/src/must.ts'; import {max} from '../../types/lexi-version.ts'; import type {Subscription} from '../../types/subscription.ts'; import type {ChangeStreamData} from '../change-source/protocol/current.ts'; @@ -52,7 +53,7 @@ export class Subscriber { if (this.#backlog) { this.#backlog.push(change); } else { - await this.#send(change); + await this.#sendChange(change); } } } @@ -61,7 +62,7 @@ export class Subscriber { #ensureInitialStatusSent() { if (this.#protocolVersion >= 2 && !this.#initialStatusSent) { - this.#downstream.push(['status', {tag: 'status'}]); + void this.#sendDownstream(['status', {tag: 'status'}]); this.#initialStatusSent = true; } } @@ -69,7 +70,7 @@ export class Subscriber { /** catchup() is called on ChangeEntries loaded from the store. */ async catchup(change: WatermarkedChange) { this.#ensureInitialStatusSent(); - await this.#send(change); + await this.#sendChange(change); } /** @@ -87,12 +88,12 @@ export class Subscriber { // where I/O flow control is not heeded. However, it will be awaited // by the next caller to send(). for (const change of this.#backlog) { - void this.#send(change); + void this.#sendChange(change); } this.#backlog = null; } - async #send(change: WatermarkedChange) { + async #sendChange(change: WatermarkedChange) { const [watermark, downstream] = change; if (watermark <= this.watermark) { return; @@ -100,16 +101,78 @@ export class Subscriber { if (!this.supportsMessage(downstream[1])) { return; } - const pending = this.#downstream.push(downstream); if (downstream[0] === 'commit') { this.#watermark = watermark; - void pending.result.then(val => { - if (val === 'consumed') { - this.#acked = max(this.#acked, watermark); - } - }); } - await pending.result; + const result = await this.#sendDownstream(downstream); + if (downstream[0] === 'commit' && result === 'consumed') { + this.#acked = max(this.#acked, watermark); + } + } + + async #sendDownstream(downstream: Downstream) { + this.#pending++; + const {result} = this.#downstream.push(downstream); + try { + return await result; + } finally { + this.#pending--; + this.#processed++; + } + } + + // `pending` and `processed` stats are tracked by periodically sampling + // the running totals (by the progress tracker in the Forwarder). + // This information was originally collected for use in flow control + // decisions. The final flow control algorithm ended up being simpler + // than expected and does not actually use this information. However, the + // stats are still tracked and logged during flow control decisions for + // debugging, forensics, and potential improvements to the algorithm. + + #pending = 0; + #processed = 0; + #samples: {processed: number; timestamp: number}[] = [ + {processed: 0, timestamp: performance.now()}, + ]; + + /** + * The number of downstream messages that have yet to be acked. + */ + get numPending() { + return this.#pending; + } + + /** + * The total number of downstream messages that the subscriber has + * processed (i.e. acked). + */ + get numProcessed() { + return this.#processed; + } + + /** + * Records a new history entry for the number of messages processed, + * keeping the number of samples bounded to `maxSamples`. + */ + sampleProcessRate(now: number, maxSamples = 10): this { + while (this.#samples.length >= maxSamples) { + this.#samples.shift(); + } + this.#samples.push({processed: this.#processed, timestamp: now}); + return this; + } + + getStats(): {processRate: number; pending: number} { + const pending = this.#pending; + if (this.#samples.length < 2) { + return {processRate: 0, pending}; + } + const from = this.#samples[0]; + const to = must(this.#samples.at(-1)); + const processed = to.processed - from.processed; + const seconds = (to.timestamp - from.timestamp) / 1000; + const processRate = seconds === 0 ? 0 : processed / seconds; + return {processRate, pending}; } supportsMessage(change: ChangeStreamData[1]) { From e42f2f961c14dc581ed587eaa3c1e460cfbeca8b Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Mon, 9 Mar 2026 14:25:49 -0400 Subject: [PATCH 135/495] fix(zero-cache): do not ignore constraints that change definition but keep name (#5647) The index was dropped then re-created in the same transaction. ``` ALTER TABLE "task_dependencies" DROP CONSTRAINT "task_dependencies_pkey", DROP COLUMN "blocked_task_id", DROP COLUMN "blocking_task_id", ADD COLUMN "depends_on_task_id" UUID NOT NULL, ADD COLUMN "required_by_task_id" UUID NOT NULL, ADD CONSTRAINT "task_dependencies_pkey" PRIMARY KEY ("depends_on_task_id", "required_by_task_id"); ``` causing zero to think it did not change. https://rocicorp.slack.com/archives/C013XFG80JC/p1772827103966319 --- .../pg/change-source.end-to-mid.pg.test.ts | 69 +++++++++++ .../change-source/pg/change-source.ts | 108 +++++++++++++++++- 2 files changed, 176 insertions(+), 1 deletion(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index bbb2af349b..8a288e14dc 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -1735,6 +1735,75 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { [], [], ], + [ + 'change primary key columns in single ALTER TABLE (same constraint name)', + ` + CREATE TABLE your.pktest ( + old_a TEXT NOT NULL, + old_b TEXT NOT NULL, + CONSTRAINT pktest_pkey PRIMARY KEY (old_a, old_b) + ); + ALTER TABLE your.pktest + DROP CONSTRAINT pktest_pkey, + DROP COLUMN old_b, + ADD COLUMN new_b TEXT NOT NULL DEFAULT 'x', + ADD CONSTRAINT pktest_pkey PRIMARY KEY (old_a, new_b); + `, + [ + // Both statements execute in one DDL event. The CREATE TABLE + // creates the index "pktest_pkey", and the ALTER TABLE drops and + // recreates it with different columns. The index name is the same + // before and after, so it must be detected as structurally modified. + [ + {tag: 'create-table'}, + {tag: 'create-index'}, + {tag: 'drop-index'}, + {tag: 'update-table-metadata'}, + {tag: 'drop-column'}, + {tag: 'add-column'}, + {tag: 'create-index'}, + ], + ], + {}, + [ + { + name: 'your.pktest', + columns: { + old_a: { + characterMaximumLength: null, + dataType: 'text|NOT_NULL', + elemPgTypeClass: null, + dflt: null, + notNull: false, + pos: 1, + }, + new_b: { + characterMaximumLength: null, + dataType: 'text|NOT_NULL', + elemPgTypeClass: null, + dflt: "'x'", + notNull: false, + pos: 3, + }, + ['_0_version']: { + characterMaximumLength: null, + dataType: 'TEXT', + elemPgTypeClass: null, + notNull: false, + pos: 2, + }, + }, + }, + ], + [ + { + tableName: 'your.pktest', + name: 'your.pktest_pkey', + columns: {old_a: 'ASC', new_b: 'ASC'}, + unique: true, + }, + ], + ], ] satisfies [ name: string, statements: string, diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 0d104d4a88..260921d375 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -23,7 +23,11 @@ import { UnsupportedColumnDefaultError, } from '../../../db/pg-to-lite.ts'; import {runTx} from '../../../db/run-transaction.ts'; -import type {ColumnSpec, PublishedTableSpec} from '../../../db/specs.ts'; +import type { + ColumnSpec, + PublishedIndexSpec, + PublishedTableSpec, +} from '../../../db/specs.ts'; import {StatementRunner} from '../../../db/statements.ts'; import {type LexiVersion} from '../../../types/lexi-version.ts'; import {pgClient, type PostgresDB} from '../../../types/pg.ts'; @@ -854,6 +858,28 @@ class ChangeMaker { } const [droppedIdx, createdIdx] = symmetricDifferences(prevIdx, nextIdx); + + // Detect modified indexes (same name, different definition). + // This happens when a constraint is dropped and recreated with the + // same name in a single ALTER TABLE statement. + // Note: We compare using stable column attnums rather than names, + // because table/column renames change the index spec cosmetically + // (tableName, column keys) without the index actually being recreated. + const keptIdx = intersection(prevIdx, nextIdx); + for (const id of keptIdx) { + if ( + isIndexStructurallyChanged( + must(prevIdx.get(id)), + must(nextIdx.get(id)), + prevTbl, + nextTbl, + ) + ) { + droppedIdx.add(id); + createdIdx.add(id); + } + } + for (const id of droppedIdx) { const {schema, name} = must(prevIdx.get(id)); changes.push({tag: 'drop-index', id: {schema, name}}); @@ -1172,6 +1198,86 @@ function specsByID(published: PublishedSchema) { ] as const; } +/** + * Determines if an index was structurally changed (e.g. constraint dropped + * and recreated with different columns) vs cosmetically changed (e.g. the + * index spec changed because the table or a column was renamed). + * + * Compares boolean properties directly and resolves column names to their + * stable attnums (pg_attribute `attnum`) for the column comparison. + */ +function isIndexStructurallyChanged( + prev: PublishedIndexSpec, + next: PublishedIndexSpec, + prevTables: Map, + nextTables: Map, +): boolean { + if ( + prev.unique !== next.unique || + prev.isPrimaryKey !== next.isPrimaryKey || + prev.isReplicaIdentity !== next.isReplicaIdentity || + prev.isImmediate !== next.isImmediate + ) { + return true; + } + + const prevTable = findTableBySchemaAndName( + prevTables, + prev.schema, + prev.tableName, + ); + const nextTable = findTableBySchemaAndName( + nextTables, + next.schema, + next.tableName, + ); + if (!prevTable || !nextTable) { + // Can't resolve tables; conservatively treat as changed. + return true; + } + + const prevEntries = Object.entries(prev.columns); + const nextEntries = Object.entries(next.columns); + if (prevEntries.length !== nextEntries.length) { + return true; + } + + // Resolve column names → attnums and compare. + const prevByAttnum = new Map( + prevEntries.map(([name, dir]) => [prevTable.columns[name]?.pos, dir]), + ); + const nextByAttnum = new Map( + nextEntries.map(([name, dir]) => [nextTable.columns[name]?.pos, dir]), + ); + + if (prevByAttnum.has(undefined) || nextByAttnum.has(undefined)) { + // Column not found in table spec; conservatively treat as changed. + return true; + } + if (prevByAttnum.size !== nextByAttnum.size) { + return true; + } + for (const [attnum, dir] of prevByAttnum) { + if (nextByAttnum.get(attnum) !== dir) { + return true; + } + } + return false; +} + +function findTableBySchemaAndName( + tables: Map, + schema: string, + name: string, +): PublishedTableWithReplicaIdentity | undefined { + for (const table of tables.values()) { + if (table.schema === schema && table.name === name) { + return table; + } + } + return undefined; +} + function columnsByID( columns: Record, ): Map { From b9d349e207f13f3fb942bb2935d61b4a5fa4ec09 Mon Sep 17 00:00:00 2001 From: YevheniiKotyrlo <44449990+YevheniiKotyrlo@users.noreply.github.com> Date: Tue, 10 Mar 2026 11:43:29 +0200 Subject: [PATCH 136/495] fix(zero): add @types/ws to dependencies (#5639) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The published `@rocicorp/zero` package includes `.d.ts` files from `zero-cache` that import from `'ws'`: - [`zero-cache/src/types/ws.ts:2`](https://github.com/rocicorp/mono/blob/main/packages/zero-cache/src/types/ws.ts#L2) — `import type {WebSocket} from 'ws'` - [`zero-cache/src/types/streams.ts:16`](https://github.com/rocicorp/mono/blob/main/packages/zero-cache/src/types/streams.ts#L16) — `import {type WebSocket} from 'ws'` - [`zero-cache/src/types/websocket-handoff.ts:5`](https://github.com/rocicorp/mono/blob/main/packages/zero-cache/src/types/websocket-handoff.ts#L5) — `import {WebSocketServer, type ServerOptions, type WebSocket} from 'ws'` - [`zero-cache/src/workers/connection.ts:3-4`](https://github.com/rocicorp/mono/blob/main/packages/zero-cache/src/workers/connection.ts#L3-L4) — `import type {CloseEvent, Data, ErrorEvent} from 'ws'` These are compiled to `.d.ts` files in `out/zero-cache/` and included in the published package via the `"files": ["out"]` field. Since `@types/ws` is only in `zero-cache`'s `devDependencies`, consumers with `skipLibCheck: false` get: ``` error TS7016: Could not find a declaration file for module 'ws'. ``` The [TypeScript handbook on publishing declaration files](https://github.com/microsoft/TypeScript-Handbook/blob/master/pages/declaration%20files/Publishing.md#dependencies) says: > We used `"dependencies"` and not `"devDependencies"`, because otherwise our consumers would have needed to manually install those packages. This adds `@types/ws` to `packages/zero/package.json` `dependencies`, matching the existing precedent for [`@types/basic-auth`](https://github.com/rocicorp/mono/blob/main/packages/zero/package.json#L51) which is already listed there for the same reason. --------- Co-authored-by: Erik Arvidsson --- package-lock.json | 1482 +++++++++++++++++++++++++++--------- packages/zero/package.json | 1 + 2 files changed, 1106 insertions(+), 377 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9410e376b8..b0e21d5383 100644 --- a/package-lock.json +++ b/package-lock.json @@ -207,7 +207,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -235,7 +234,6 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -395,7 +393,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -498,6 +495,7 @@ "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -713,7 +711,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -1777,7 +1774,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2131,6 +2127,7 @@ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -2147,6 +2144,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2160,6 +2158,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2175,6 +2174,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2184,7 +2184,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -2192,6 +2193,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -2202,6 +2204,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -2212,6 +2215,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2319,6 +2323,7 @@ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2337,6 +2342,7 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2365,6 +2371,7 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2378,6 +2385,7 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2391,6 +2399,7 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2404,6 +2413,7 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2420,6 +2430,7 @@ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2448,6 +2459,7 @@ "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2464,6 +2476,7 @@ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2510,6 +2523,7 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2523,6 +2537,7 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2551,6 +2566,7 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2564,6 +2580,7 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2577,6 +2594,7 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2590,6 +2608,7 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2603,6 +2622,7 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2616,6 +2636,7 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2629,6 +2650,7 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2645,6 +2667,7 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2963,6 +2986,7 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -3890,6 +3914,7 @@ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -4116,7 +4141,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -4139,7 +4163,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -6656,7 +6679,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6872,7 +6894,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7385,7 +7406,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7487,8 +7507,7 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.6", @@ -8402,6 +8421,7 @@ "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -8413,6 +8433,7 @@ "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -8435,6 +8456,7 @@ "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -8458,6 +8480,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8476,6 +8499,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -8486,6 +8510,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8502,6 +8527,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8518,7 +8544,8 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/config/node_modules/@babel/code-frame": { "version": "7.10.4", @@ -8526,6 +8553,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8536,6 +8564,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8554,6 +8583,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -8564,6 +8594,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8580,6 +8611,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8597,6 +8629,7 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8608,6 +8641,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8618,6 +8652,7 @@ "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8632,6 +8667,7 @@ "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -8654,7 +8690,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/fingerprint/node_modules/brace-expansion": { "version": "2.0.2", @@ -8662,6 +8699,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8672,6 +8710,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8688,6 +8727,7 @@ "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8707,6 +8747,7 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8717,6 +8758,7 @@ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -8730,6 +8772,7 @@ "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -8741,6 +8784,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8751,6 +8795,7 @@ "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -8771,6 +8816,7 @@ "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -8792,6 +8838,7 @@ "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -8806,6 +8853,7 @@ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -8821,6 +8869,7 @@ "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -8832,14 +8881,16 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8847,6 +8898,7 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8859,14 +8911,16 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/xcpretty": { "version": "4.3.2", @@ -8874,6 +8928,7 @@ "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -8890,6 +8945,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8900,6 +8956,7 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8917,6 +8974,7 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8933,6 +8991,7 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9583,6 +9642,7 @@ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -9596,6 +9656,7 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -9606,6 +9667,7 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9623,6 +9685,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -9633,6 +9696,7 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9643,6 +9707,7 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9657,6 +9722,7 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9671,6 +9737,7 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9684,6 +9751,7 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9700,6 +9768,7 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9712,6 +9781,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -9722,6 +9792,7 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9735,6 +9806,7 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9751,6 +9823,7 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9781,6 +9854,7 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9808,6 +9882,7 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10136,7 +10211,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10259,7 +10333,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10493,7 +10566,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10590,7 +10662,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12730,7 +12801,6 @@ "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.2.0" }, @@ -13118,6 +13188,7 @@ "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13128,6 +13199,7 @@ "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -13142,6 +13214,7 @@ "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -13202,6 +13275,7 @@ "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -13225,6 +13299,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13246,6 +13321,7 @@ "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -13277,6 +13353,7 @@ "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13287,6 +13364,7 @@ "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -13311,6 +13389,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13328,6 +13407,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13338,6 +13418,7 @@ "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13348,6 +13429,7 @@ "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -13362,6 +13444,7 @@ "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -13385,6 +13468,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13402,6 +13486,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13412,6 +13497,7 @@ "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13422,6 +13508,7 @@ "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13431,7 +13518,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@react-stately/utils": { "version": "3.10.4", @@ -13838,7 +13926,6 @@ "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -14061,6 +14148,7 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -14071,6 +14159,7 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -15067,7 +15156,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15201,7 +15289,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", "license": "MIT", - "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.19" }, @@ -15219,7 +15306,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -15321,7 +15407,6 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15721,6 +15806,7 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -15861,7 +15947,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15895,7 +15980,6 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -15953,7 +16037,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -16104,7 +16187,8 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -16176,6 +16260,7 @@ "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -16187,6 +16272,7 @@ "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -16466,7 +16552,6 @@ "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -16490,7 +16575,6 @@ "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -16846,6 +16930,7 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" } @@ -16966,7 +17051,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -17052,7 +17136,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17114,7 +17197,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -17156,7 +17238,8 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ansi-align": { "version": "3.0.1", @@ -17449,7 +17532,8 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/asn1": { "version": "0.2.6", @@ -17552,7 +17636,8 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/async-listen": { "version": "3.0.0", @@ -17694,6 +17779,7 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -17742,6 +17828,7 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -17760,6 +17847,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17781,6 +17869,7 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17796,6 +17885,7 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -17898,6 +17988,7 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -17907,7 +17998,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.29.1", @@ -17915,6 +18007,7 @@ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.29.1" } @@ -17925,6 +18018,7 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -17935,6 +18029,7 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -17962,6 +18057,7 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -18193,6 +18289,7 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -18206,6 +18303,7 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">=0.6" } @@ -18472,6 +18570,7 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -18482,6 +18581,7 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -18540,7 +18640,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -18561,6 +18660,7 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -18738,6 +18838,7 @@ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -18751,6 +18852,7 @@ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -18761,6 +18863,7 @@ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -19013,6 +19116,7 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19041,6 +19145,7 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19139,6 +19244,7 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -19151,6 +19257,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "peer": true, "engines": { "node": ">=6" }, @@ -19196,6 +19303,7 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8" } @@ -20456,7 +20564,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -20696,6 +20803,7 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -21119,6 +21227,7 @@ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "dotenv": "^16.4.5" }, @@ -21497,6 +21606,7 @@ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -21515,6 +21625,7 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -21593,7 +21704,6 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22293,7 +22403,8 @@ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/execa": { "version": "5.1.1", @@ -22342,6 +22453,7 @@ "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -22360,6 +22472,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -22370,6 +22483,7 @@ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.16.0" } @@ -22379,7 +22493,8 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/express": { "version": "4.22.1", @@ -22738,6 +22853,7 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", + "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -22751,6 +22867,7 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "bser": "2.1.1" } @@ -23034,7 +23151,8 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -23061,7 +23179,8 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/for-each": { "version": "0.3.5", @@ -23158,6 +23277,7 @@ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23376,6 +23496,7 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -23457,6 +23578,7 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -24092,14 +24214,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-parser": { "version": "0.29.1", @@ -24107,6 +24231,7 @@ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.29.1" } @@ -24146,7 +24271,6 @@ "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -24592,6 +24716,7 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -24837,6 +24962,7 @@ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -25211,6 +25337,7 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -25228,6 +25355,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -25303,6 +25431,7 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -25321,6 +25450,7 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25331,6 +25461,7 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -25357,6 +25488,7 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -25378,6 +25510,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25391,6 +25524,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25405,7 +25539,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-mock": { "version": "29.7.0", @@ -25413,6 +25548,7 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -25428,6 +25564,7 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25455,6 +25592,7 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -25473,6 +25611,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25486,6 +25625,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25500,7 +25640,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-worker": { "version": "29.7.0", @@ -25537,7 +25678,8 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jiti": { "version": "1.21.0", @@ -25616,7 +25758,8 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/jsdom": { "version": "26.1.0", @@ -25745,7 +25888,8 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -25849,6 +25993,7 @@ "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -25972,6 +26117,7 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -25983,6 +26129,7 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -25992,7 +26139,8 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lightningcss": { "version": "1.30.2", @@ -26032,12 +26180,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "android" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26053,12 +26201,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26074,12 +26222,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26095,12 +26243,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26116,12 +26264,12 @@ "cpu": [ "arm" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26137,12 +26285,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26158,12 +26306,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26179,12 +26327,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26200,12 +26348,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26221,12 +26369,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26242,12 +26390,12 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26350,7 +26498,8 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -26364,6 +26513,7 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -26377,6 +26527,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -26390,6 +26541,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26405,6 +26557,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -26414,7 +26567,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -26422,6 +26576,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -26432,6 +26587,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -26442,6 +26598,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -26578,7 +26735,6 @@ "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -26612,6 +26768,7 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -26672,7 +26829,8 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -27061,7 +27219,8 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/merge-anything": { "version": "5.1.7", @@ -27117,6 +27276,7 @@ "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -27172,6 +27332,7 @@ "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -27188,6 +27349,7 @@ "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -27204,6 +27366,7 @@ "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27217,6 +27380,7 @@ "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -27237,6 +27401,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -27247,6 +27412,7 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -27263,6 +27429,7 @@ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -27277,6 +27444,7 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -27291,6 +27459,7 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -27305,6 +27474,7 @@ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -27315,6 +27485,7 @@ "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27330,6 +27501,7 @@ "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27351,6 +27523,7 @@ "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27365,6 +27538,7 @@ "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27378,6 +27552,7 @@ "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27392,6 +27567,7 @@ "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27414,6 +27590,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27424,6 +27601,7 @@ "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27445,6 +27623,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27455,6 +27634,7 @@ "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27473,6 +27653,7 @@ "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27497,7 +27678,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", @@ -27505,6 +27687,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -27515,6 +27698,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -27528,6 +27712,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27538,6 +27723,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28554,7 +28740,6 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10.x" } @@ -28612,8 +28797,7 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", @@ -28658,7 +28842,6 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -28772,7 +28955,8 @@ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/netmask": { "version": "2.0.2", @@ -28903,7 +29087,8 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/node-releases": { "version": "2.0.27", @@ -28952,6 +29137,7 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -28968,6 +29154,7 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -28980,7 +29167,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -29068,7 +29256,8 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/nwsapi": { "version": "2.2.22", @@ -29103,6 +29292,7 @@ "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29289,6 +29479,7 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -29307,6 +29498,7 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -29317,6 +29509,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -29330,6 +29523,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29345,6 +29539,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -29354,7 +29549,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -29362,6 +29558,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -29372,6 +29569,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -29382,6 +29580,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -29395,6 +29594,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -29500,7 +29700,6 @@ "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -29536,6 +29735,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -29660,6 +29860,7 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -29844,6 +30045,7 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -29915,6 +30117,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -30005,7 +30208,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -30236,7 +30438,6 @@ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright-core": "1.53.2" }, @@ -30268,6 +30469,7 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -30283,6 +30485,7 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0.0" } @@ -30329,7 +30532,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31466,7 +31668,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31636,6 +31837,7 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -31725,7 +31927,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -31768,6 +31969,7 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -31815,6 +32017,7 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.4.0" } @@ -31825,6 +32028,7 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -32058,6 +32262,7 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, + "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -32083,6 +32288,7 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -32232,7 +32438,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32246,6 +32451,7 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -32257,6 +32463,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -32278,7 +32485,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32353,7 +32559,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -32428,7 +32633,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -33145,6 +33349,7 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, + "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -33160,6 +33365,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "path-parse": "^1.0.5" } @@ -33211,6 +33417,7 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "global-dirs": "^0.1.1" }, @@ -33224,6 +33431,7 @@ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -33250,7 +33458,8 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/resolve.exports": { "version": "2.0.3", @@ -33258,6 +33467,7 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -33283,6 +33493,7 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -33297,6 +33508,7 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -33307,6 +33519,7 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -33385,7 +33598,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33594,7 +33806,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -33792,6 +34003,7 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -33810,7 +34022,6 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" } @@ -34178,6 +34389,7 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -34267,6 +34479,7 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -34351,7 +34564,6 @@ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -34557,6 +34769,7 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -34570,6 +34783,7 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -34586,7 +34800,8 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -34594,6 +34809,7 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34607,6 +34823,7 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=8" } @@ -34637,6 +34854,7 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">= 0.10.0" } @@ -34808,7 +35026,8 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/style-to-js": { "version": "1.1.21", @@ -34894,6 +35113,7 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -35004,7 +35224,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35151,6 +35370,7 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -35161,6 +35381,7 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -35177,7 +35398,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -35384,7 +35604,8 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/throttleit": { "version": "2.1.0", @@ -35486,7 +35707,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -35548,7 +35768,8 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -35725,15 +35946,13 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -36364,6 +36583,7 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -36475,7 +36695,6 @@ "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 18" }, @@ -37180,6 +37399,7 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -37258,7 +37478,6 @@ "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -37504,7 +37723,8 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -37525,6 +37745,7 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -37557,6 +37778,7 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -37572,7 +37794,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -37991,7 +38212,8 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/whatwg-mimetype": { "version": "4.0.0", @@ -38019,6 +38241,7 @@ "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -38034,6 +38257,7 @@ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=8" } @@ -38175,7 +38399,8 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/wordwrapjs": { "version": "5.1.0", @@ -38256,7 +38481,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -38317,6 +38541,7 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -38331,6 +38556,7 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -38375,6 +38601,7 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -38389,6 +38616,7 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0" } @@ -38399,6 +38627,7 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0" } @@ -38487,6 +38716,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -38625,6 +38855,7 @@ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", + "peer": true, "peerDependencies": { "zod": "^3.24.1" } @@ -38951,7 +39182,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -39052,6 +39282,7 @@ "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -39140,6 +39371,7 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -39150,6 +39382,7 @@ "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -39172,6 +39405,7 @@ "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -39195,6 +39429,7 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -39218,6 +39453,7 @@ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -39256,6 +39492,7 @@ "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -39278,6 +39515,7 @@ "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -39304,6 +39542,7 @@ "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39314,6 +39553,7 @@ "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -39328,6 +39568,7 @@ "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -39388,6 +39629,7 @@ "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -39410,6 +39652,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -39422,6 +39665,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -39443,6 +39687,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39456,6 +39701,7 @@ "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -39487,6 +39733,7 @@ "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39497,6 +39744,7 @@ "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -39521,6 +39769,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39543,6 +39792,7 @@ "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39553,6 +39803,7 @@ "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -39567,6 +39818,7 @@ "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -39590,6 +39842,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -39600,6 +39853,7 @@ "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39610,6 +39864,7 @@ "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39619,7 +39874,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/@react-native/virtualized-lists": { "version": "0.83.1", @@ -39627,6 +39883,7 @@ "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -39651,6 +39908,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -39663,7 +39921,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/babel-preset-expo": { "version": "54.0.10", @@ -39671,6 +39930,7 @@ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -39715,6 +39975,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -39725,6 +39986,7 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -39735,6 +39997,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -39799,6 +40062,7 @@ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -39815,6 +40079,7 @@ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -39830,6 +40095,7 @@ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -39857,6 +40123,7 @@ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -39868,6 +40135,7 @@ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -39885,6 +40153,7 @@ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -39914,6 +40183,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -39932,6 +40202,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -39947,14 +40218,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/lru-cache": { "version": "11.2.4", @@ -39962,6 +40235,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -39972,6 +40246,7 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -40027,6 +40302,7 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -40043,6 +40319,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40053,6 +40330,7 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -40069,6 +40347,7 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40082,6 +40361,7 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -40102,6 +40382,7 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -40117,6 +40398,7 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -40138,6 +40420,7 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -40152,6 +40435,7 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40165,6 +40449,7 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -40179,6 +40464,7 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -40201,6 +40487,7 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -40222,6 +40509,7 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40240,6 +40528,7 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40264,7 +40553,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/metro/node_modules/hermes-parser": { "version": "0.32.0", @@ -40272,6 +40562,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40282,6 +40573,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40304,6 +40596,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -40314,6 +40607,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -40327,6 +40621,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -40343,6 +40638,7 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -40356,6 +40652,7 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40369,6 +40666,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -40386,6 +40684,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -40403,6 +40702,7 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -40430,6 +40730,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -40445,6 +40746,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -40470,7 +40772,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native": { "version": "0.83.1", @@ -40538,6 +40841,7 @@ "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -40559,7 +40863,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -40567,6 +40872,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -40577,6 +40883,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -40588,6 +40895,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -40599,6 +40907,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40620,6 +40929,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40630,6 +40940,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -40643,6 +40954,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40664,14 +40976,16 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/source-map": { "version": "0.5.7", @@ -40679,6 +40993,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -40689,6 +41004,7 @@ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -40720,6 +41036,7 @@ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18.17" } @@ -40730,6 +41047,7 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -40851,6 +41169,7 @@ "@rocicorp/zero-sqlite3": "^1.0.15", "@standard-schema/spec": "^1.0.0", "@types/basic-auth": "^1.1.8", + "@types/ws": "^8.5.12", "basic-auth": "^2.0.1", "chalk": "^5.3.0", "chalk-template": "^1.1.0", @@ -41245,6 +41564,7 @@ "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -41334,6 +41654,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41351,6 +41672,7 @@ "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -41373,6 +41695,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41390,6 +41713,7 @@ "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -41428,6 +41752,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41445,6 +41770,7 @@ "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -41467,6 +41793,7 @@ "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -41493,6 +41820,7 @@ "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -41515,6 +41843,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41527,6 +41856,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41548,6 +41878,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41558,6 +41889,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41571,6 +41903,7 @@ "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -41594,7 +41927,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/babel-preset-expo": { "version": "54.0.4", @@ -41602,6 +41936,7 @@ "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -41646,6 +41981,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -41696,6 +42032,7 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -41706,6 +42043,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -41770,6 +42108,7 @@ "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -41786,6 +42125,7 @@ "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -41801,6 +42141,7 @@ "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -41828,6 +42169,7 @@ "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -41839,6 +42181,7 @@ "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -41900,7 +42243,8 @@ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/minimatch": { "version": "9.0.5", @@ -41908,6 +42252,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -41924,6 +42269,7 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -41955,6 +42301,7 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -41982,6 +42329,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -42003,6 +42351,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -42016,6 +42365,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -42031,6 +42381,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -42054,7 +42405,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native": { "version": "0.82.0", @@ -42121,7 +42473,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -42129,6 +42482,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -42139,6 +42493,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -42151,6 +42506,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -42172,6 +42528,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -42182,6 +42539,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -42195,6 +42553,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -42216,14 +42575,16 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/tar": { "version": "7.5.1", @@ -42231,6 +42592,7 @@ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -42262,6 +42624,7 @@ "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18.17" } @@ -42408,6 +42771,7 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -42768,6 +43132,7 @@ "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, + "peer": true, "requires": {} }, "@ai-sdk/gateway": { @@ -42907,7 +43272,6 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", - "peer": true, "requires": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -43742,7 +44106,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -43984,6 +44347,7 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, + "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -43996,6 +44360,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -44005,6 +44370,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -44016,6 +44382,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -44024,25 +44391,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -44106,6 +44477,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, + "peer": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -44117,6 +44489,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44132,6 +44505,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44141,6 +44515,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44150,6 +44525,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -44159,6 +44535,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44168,6 +44545,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44185,6 +44563,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44194,6 +44573,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44219,6 +44599,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44228,6 +44609,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44245,6 +44627,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44254,6 +44637,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44263,6 +44647,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44272,6 +44657,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44281,6 +44667,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44290,6 +44677,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44299,6 +44687,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44308,6 +44697,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44486,6 +44876,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -45055,6 +45446,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -45179,14 +45571,12 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "peer": true + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -46220,7 +46610,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -46385,7 +46774,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "peer": true, "requires": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -46744,8 +47132,7 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "peer": true + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" }, "which": { "version": "4.0.0", @@ -46806,8 +47193,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true, - "peer": true + "dev": true }, "@electric-sql/pglite-socket": { "version": "0.0.6", @@ -47218,6 +47604,7 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -47228,6 +47615,7 @@ "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -47249,6 +47637,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47258,6 +47647,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47268,13 +47658,15 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47284,6 +47676,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47296,6 +47689,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, + "peer": true, "requires": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -47318,6 +47712,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47328,13 +47723,15 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47344,6 +47741,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47355,13 +47753,15 @@ "version": "54.0.10", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true + "dev": true, + "peer": true }, "@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, + "peer": true, "requires": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -47372,6 +47772,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "peer": true, "requires": { "ms": "^2.1.1" } @@ -47383,6 +47784,7 @@ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, + "peer": true, "requires": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -47396,6 +47798,7 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -47414,13 +47817,15 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -47430,6 +47835,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -47441,6 +47847,7 @@ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -47458,13 +47865,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true + "dev": true, + "peer": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -47476,6 +47885,7 @@ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -47486,6 +47896,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47497,6 +47908,7 @@ "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, + "peer": true, "requires": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -47508,6 +47920,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, + "peer": true, "requires": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -47528,6 +47941,7 @@ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -47538,6 +47952,7 @@ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, + "peer": true, "requires": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -47552,6 +47967,7 @@ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, + "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -47562,19 +47978,22 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true + "dev": true, + "peer": true }, "@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true + "dev": true, + "peer": true }, "@expo/spawn-async": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.3" } @@ -47583,19 +48002,22 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true + "dev": true, + "peer": true }, "@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true + "dev": true, + "peer": true }, "@expo/xcpretty": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -47608,6 +48030,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47617,6 +48040,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -47627,6 +48051,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -47636,6 +48061,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -48139,6 +48565,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "peer": true, "requires": { "minipass": "^7.0.4" } @@ -48147,13 +48574,15 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true + "dev": true, + "peer": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "peer": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -48167,6 +48596,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -48175,13 +48605,15 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "peer": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -48192,6 +48624,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -48202,6 +48635,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -48211,6 +48645,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "requires": { "p-try": "^2.0.0" } @@ -48220,6 +48655,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -48230,13 +48666,15 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true + "dev": true, + "peer": true }, "@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3" } @@ -48246,6 +48684,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "peer": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -48258,6 +48697,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -48280,6 +48720,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -48303,6 +48744,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -48526,7 +48968,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "peer": true, "requires": { "@types/mdx": "^2.0.0" } @@ -48620,8 +49061,7 @@ "@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "peer": true + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" }, "@noble/curves": { "version": "1.8.1", @@ -48800,8 +49240,7 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "peer": true + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, "@opentelemetry/api-logs": { "version": "0.203.0", @@ -48876,7 +49315,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", - "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -50094,7 +50532,6 @@ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, - "peer": true, "requires": { "@prisma/client-runtime-utils": "7.2.0" } @@ -50396,13 +50833,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -50413,6 +50852,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -50466,6 +50906,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50481,6 +50922,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50497,6 +50939,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, + "peer": true, "requires": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -50511,13 +50954,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true + "dev": true, + "peer": true }, "@react-native/dev-middleware": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -50538,6 +50983,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50548,6 +50994,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50558,13 +51005,15 @@ "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true + "dev": true, + "peer": true }, "@react-native/debugger-shell": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -50575,6 +51024,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -50594,6 +51044,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50604,6 +51055,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50614,19 +51066,22 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/js-polyfills": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/normalize-colors": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true + "dev": true, + "peer": true }, "@react-stately/utils": { "version": "3.10.4", @@ -50687,6 +51142,7 @@ "@rocicorp/zero-sqlite3": "^1.0.15", "@standard-schema/spec": "^1.0.0", "@types/basic-auth": "^1.1.8", + "@types/ws": "^8.5.12", "@vitest/runner": "4.0.15", "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", @@ -50738,6 +51194,7 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -50810,6 +51267,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50822,6 +51280,7 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, + "peer": true, "requires": { "chalk": "^4.1.2" }, @@ -50831,6 +51290,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50843,6 +51303,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -50872,6 +51333,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50884,6 +51346,7 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -50902,6 +51365,7 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, + "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -50916,6 +51380,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50931,6 +51396,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -50941,6 +51407,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50955,6 +51422,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -50964,6 +51432,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -50975,6 +51444,7 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -50984,13 +51454,15 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "babel-preset-expo": { "version": "54.0.4", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -51021,6 +51493,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -51050,13 +51523,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true + "dev": true, + "peer": true }, "expo": { "version": "54.0.13", @@ -51093,6 +51568,7 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, + "peer": true, "requires": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -51103,6 +51579,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -51113,6 +51590,7 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, + "peer": true, "requires": {} }, "expo-font": { @@ -51130,6 +51608,7 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, + "peer": true, "requires": {} }, "expo-modules-core": { @@ -51137,6 +51616,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4" } @@ -51168,13 +51648,15 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -51184,6 +51666,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "peer": true, "requires": { "minipass": "^7.1.2" } @@ -51197,13 +51680,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true + "dev": true, + "peer": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -51214,7 +51699,8 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -51223,6 +51709,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -51233,7 +51720,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -51248,7 +51736,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true }, "react-native": { "version": "0.82.0", @@ -51298,13 +51787,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -51314,6 +51805,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51324,6 +51816,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51338,6 +51831,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51347,6 +51841,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51356,6 +51851,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51371,19 +51867,22 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true + "dev": true, + "peer": true }, "tar": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, + "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -51402,7 +51901,8 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true + "dev": true, + "peer": true }, "vite": { "version": "7.2.7", @@ -51448,7 +51948,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -51642,7 +52143,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -51818,6 +52318,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "peer": true, "requires": { "type-detect": "4.0.8" } @@ -51827,6 +52328,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "peer": true, "requires": { "@sinonjs/commons": "^3.0.0" } @@ -52478,7 +52980,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "requires": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -52561,7 +53062,6 @@ "version": "3.13.19", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", - "peer": true, "requires": { "@tanstack/virtual-core": "3.13.19" } @@ -52569,8 +53069,7 @@ "@tanstack/virtual-core": { "version": "3.13.19", "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", - "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", - "peer": true + "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==" }, "@tantaman/api-extractor": { "version": "7.52.13", @@ -52639,7 +53138,6 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -52984,6 +53482,7 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -53110,7 +53609,6 @@ "version": "22.18.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", - "peer": true, "requires": { "undici-types": "~6.21.0" }, @@ -53142,7 +53640,6 @@ "version": "8.15.4", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", - "peer": true, "requires": { "@types/node": "*", "pg-protocol": "*", @@ -53193,7 +53690,6 @@ "version": "18.3.23", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", - "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -53332,7 +53828,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "peer": true }, "@types/strip-ansi": { "version": "3.0.0", @@ -53395,6 +53892,7 @@ "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -53405,6 +53903,7 @@ "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, + "peer": true, "requires": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -53612,7 +54111,6 @@ "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, - "peer": true, "requires": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -53637,7 +54135,6 @@ "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, - "peer": true, "requires": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -53895,7 +54392,8 @@ "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true + "dev": true, + "peer": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -53984,8 +54482,7 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "peer": true + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" }, "acorn-import-attributes": { "version": "1.9.5", @@ -54038,7 +54535,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -54082,7 +54578,6 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", - "peer": true, "requires": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -54136,7 +54631,8 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true + "dev": true, + "peer": true }, "ansi-align": { "version": "3.0.1", @@ -54337,7 +54833,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "dev": true, + "peer": true }, "asn1": { "version": "0.2.6", @@ -54429,7 +54926,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "dev": true, + "peer": true }, "async-listen": { "version": "3.0.0", @@ -54513,6 +55011,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "peer": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -54545,6 +55044,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -54558,6 +55058,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -54572,6 +55073,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "peer": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -54585,6 +55087,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -54662,6 +55165,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, + "peer": true, "requires": { "@babel/types": "^7.26.0" } @@ -54670,13 +55174,15 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.29.1" } @@ -54686,6 +55192,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, + "peer": true, "requires": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -54695,6 +55202,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, + "peer": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -54718,6 +55226,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "peer": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -54867,6 +55376,7 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, + "peer": true, "requires": { "open": "^8.0.4" } @@ -54875,7 +55385,8 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true + "dev": true, + "peer": true }, "big.js": { "version": "5.2.2", @@ -55055,6 +55566,7 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, + "peer": true, "requires": { "stream-buffers": "2.2.x" } @@ -55064,6 +55576,7 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, + "peer": true, "requires": { "big-integer": "1.6.x" } @@ -55095,7 +55608,6 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "peer": true, "requires": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -55109,6 +55621,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "peer": true, "requires": { "node-int64": "^0.4.0" } @@ -55219,6 +55732,7 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, + "peer": true, "requires": { "callsites": "^2.0.0" }, @@ -55227,7 +55741,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -55236,6 +55751,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, + "peer": true, "requires": { "caller-callsite": "^2.0.0" } @@ -55395,6 +55911,7 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55412,6 +55929,7 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55480,6 +55998,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -55488,7 +56007,8 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true + "dev": true, + "peer": true }, "cli-table3": { "version": "0.6.5", @@ -55531,7 +56051,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true + "dev": true, + "peer": true }, "clone-deep": { "version": "4.0.1", @@ -56331,8 +56852,7 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "peer": true + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-timer": { "version": "3.0.1", @@ -56502,6 +57022,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "peer": true, "requires": { "clone": "^1.0.2" } @@ -56787,6 +57308,7 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, + "peer": true, "requires": { "dotenv": "^16.4.5" } @@ -56972,7 +57494,8 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true + "dev": true, + "peer": true }, "error-ex": { "version": "1.3.2", @@ -56987,6 +57510,7 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, + "peer": true, "requires": { "stackframe": "^1.3.4" } @@ -57040,7 +57564,6 @@ "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "peer": true, "requires": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", @@ -57413,7 +57936,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true + "dev": true, + "peer": true }, "execa": { "version": "5.1.1", @@ -57447,6 +57971,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -57460,7 +57985,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -57468,13 +57994,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true + "dev": true, + "peer": true }, "exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true + "dev": true, + "peer": true }, "express": { "version": "4.22.1", @@ -57744,13 +58272,15 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true + "dev": true, + "peer": true }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "peer": true, "requires": { "bser": "2.1.1" } @@ -57939,7 +58469,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true + "dev": true, + "peer": true }, "follow-redirects": { "version": "1.15.11", @@ -57950,7 +58481,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true + "dev": true, + "peer": true }, "for-each": { "version": "0.3.5", @@ -58007,7 +58539,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true + "dev": true, + "peer": true }, "fresh": { "version": "0.5.2", @@ -58160,7 +58693,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "peer": true }, "get-port": { "version": "7.1.0", @@ -58210,7 +58744,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true + "dev": true, + "peer": true }, "giget": { "version": "2.0.0", @@ -58653,19 +59188,22 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true + "dev": true, + "peer": true }, "hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true + "dev": true, + "peer": true }, "hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.29.1" } @@ -58702,8 +59240,7 @@ "version": "4.10.6", "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true, - "peer": true + "dev": true }, "hpack.js": { "version": "2.1.6", @@ -58997,6 +59534,7 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, + "peer": true, "requires": { "queue": "6.0.2" } @@ -59157,7 +59695,8 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true + "dev": true, + "peer": true }, "is-docker": { "version": "2.2.1", @@ -59374,6 +59913,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -59386,7 +59926,8 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59443,6 +59984,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -59456,13 +59998,15 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true + "dev": true, + "peer": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -59483,6 +60027,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -59499,13 +60044,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59516,7 +60063,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59525,6 +60073,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -59535,7 +60084,8 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true + "dev": true, + "peer": true }, "jest-util": { "version": "29.7.0", @@ -59555,6 +60105,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -59568,13 +60119,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59585,7 +60138,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59614,7 +60168,8 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true + "dev": true, + "peer": true }, "jiti": { "version": "1.21.0", @@ -59678,7 +60233,8 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true + "dev": true, + "peer": true }, "jsdom": { "version": "26.1.0", @@ -59771,7 +60327,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "peer": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -59854,7 +60411,8 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true + "dev": true, + "peer": true }, "latest-version": { "version": "7.0.0", @@ -59947,6 +60505,7 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, + "peer": true, "requires": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -59957,6 +60516,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "requires": { "ms": "2.0.0" } @@ -59965,7 +60525,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59994,78 +60555,78 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-freebsd-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-x64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-x64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-win32-arm64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-win32-x64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "dev": true, - "optional": true + "optional": true, + "peer": true }, "lilconfig": { "version": "2.1.0", @@ -60152,7 +60713,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true + "dev": true, + "peer": true }, "lodash.uniq": { "version": "4.5.0", @@ -60164,6 +60726,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, + "peer": true, "requires": { "chalk": "^2.0.1" }, @@ -60173,6 +60736,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -60182,6 +60746,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -60193,6 +60758,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -60201,25 +60767,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -60309,7 +60879,6 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, - "peer": true, "requires": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -60335,6 +60904,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "peer": true, "requires": { "tmpl": "1.0.5" } @@ -60372,7 +60942,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true + "dev": true, + "peer": true }, "math-intrinsics": { "version": "1.1.0", @@ -60661,7 +61232,8 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true + "dev": true, + "peer": true }, "merge-anything": { "version": "5.1.7", @@ -60697,6 +61269,7 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -60744,19 +61317,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "peer": true, "requires": { "mime-db": "1.52.0" } @@ -60765,13 +61341,15 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -60781,6 +61359,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -60793,6 +61372,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, + "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -60805,6 +61385,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60814,6 +61395,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, + "peer": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -60830,6 +61412,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -60839,6 +61422,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, + "peer": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -60851,6 +61435,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, + "peer": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -60861,6 +61446,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -60871,6 +61457,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "peer": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -60880,7 +61467,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60889,6 +61477,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -60900,6 +61489,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, + "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -60917,6 +61507,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -60927,6 +61518,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60936,6 +61528,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -60946,6 +61539,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -60963,7 +61557,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60972,6 +61567,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -60985,7 +61581,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60994,6 +61591,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61008,6 +61606,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61642,8 +62241,7 @@ "version": "15.10.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true, - "peer": true + "dev": true }, "graphql-subscriptions": { "version": "1.2.1", @@ -61686,8 +62284,7 @@ "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "peer": true + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" }, "mri": { "version": "1.2.0", @@ -61718,7 +62315,6 @@ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, - "peer": true, "requires": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -61799,7 +62395,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true + "dev": true, + "peer": true }, "netmask": { "version": "2.0.2", @@ -61890,7 +62487,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "peer": true }, "node-releases": { "version": "2.0.27", @@ -61920,6 +62518,7 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, + "peer": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -61932,6 +62531,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, + "peer": true, "requires": { "lru-cache": "^10.0.1" } @@ -61940,7 +62540,8 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -62001,7 +62602,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true + "dev": true, + "peer": true }, "nwsapi": { "version": "2.2.22", @@ -62027,6 +62629,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -62146,6 +62749,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, + "peer": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -62159,13 +62763,15 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true + "dev": true, + "peer": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -62175,6 +62781,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -62186,6 +62793,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -62194,25 +62802,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -62222,6 +62834,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -62314,7 +62927,6 @@ "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.14.2.tgz", "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, - "peer": true, "requires": { "@oxlint-tsgolint/darwin-arm64": "0.14.2", "@oxlint-tsgolint/darwin-x64": "0.14.2", @@ -62339,6 +62951,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -62412,7 +63025,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "peer": true }, "pac-proxy-agent": { "version": "7.2.0", @@ -62549,6 +63163,7 @@ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, + "peer": true, "requires": { "pngjs": "^3.3.0" } @@ -62601,7 +63216,8 @@ "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 + "dev": true, + "peer": true }, "path-is-absolute": { "version": "1.0.1", @@ -62668,7 +63284,6 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -62831,7 +63446,6 @@ "version": "1.53.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", - "peer": true, "requires": { "fsevents": "2.3.2", "playwright-core": "1.53.2" @@ -62847,6 +63461,7 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, + "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -62857,7 +63472,8 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true + "dev": true, + "peer": true }, "portfinder": { "version": "1.0.38", @@ -62878,7 +63494,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -63506,7 +64121,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -63604,7 +64218,8 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true + "dev": true, + "peer": true }, "pretty-error": { "version": "4.0.0", @@ -63661,7 +64276,6 @@ "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", "dev": true, - "peer": true, "requires": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -63680,7 +64294,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true + "dev": true, + "peer": true }, "process": { "version": "0.11.10", @@ -63714,13 +64329,15 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "peer": true }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "peer": true, "requires": { "asap": "~2.0.6" } @@ -63890,7 +64507,8 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true + "dev": true, + "peer": true }, "qs": { "version": "6.14.0", @@ -63905,6 +64523,7 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, + "peer": true, "requires": { "inherits": "~2.0.3" } @@ -64004,7 +64623,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -64014,6 +64632,7 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, + "peer": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -64024,6 +64643,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -64032,7 +64652,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -64081,7 +64700,6 @@ "version": "npm:@docusaurus/react-loadable@6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "peer": true, "requires": { "@types/react": "*" } @@ -64128,7 +64746,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "peer": true, "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -64631,6 +65248,7 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -64702,6 +65320,7 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.3.3" } @@ -64711,6 +65330,7 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, + "peer": true, "requires": { "chalk": "^4.1.2" } @@ -64720,6 +65340,7 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -64739,6 +65360,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, + "peer": true, "requires": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -64761,6 +65383,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -64790,6 +65413,7 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -64808,6 +65432,7 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, + "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -64821,13 +65446,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true + "dev": true, + "peer": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -64838,6 +65465,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -64891,6 +65519,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -64906,6 +65535,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -64916,6 +65546,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -64930,6 +65561,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -64941,6 +65573,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, + "peer": true, "requires": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -64955,13 +65588,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true + "dev": true, + "peer": true }, "@react-native/dev-middleware": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -64982,6 +65617,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -64990,13 +65626,15 @@ "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true + "dev": true, + "peer": true }, "@react-native/debugger-shell": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -65007,6 +65645,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -65026,6 +65665,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -65036,25 +65676,29 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true + "dev": true, + "peer": true }, "@react-native/js-polyfills": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true + "dev": true, + "peer": true }, "@react-native/normalize-colors": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true + "dev": true, + "peer": true }, "@react-native/virtualized-lists": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -65064,19 +65708,22 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "babel-preset-expo": { "version": "54.0.10", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -65107,6 +65754,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -65115,13 +65763,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true }, "expo": { "version": "54.0.32", @@ -65158,6 +65808,7 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, + "peer": true, "requires": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -65168,6 +65819,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -65178,6 +65830,7 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, + "peer": true, "requires": {} }, "expo-font": { @@ -65195,6 +65848,7 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, + "peer": true, "requires": {} }, "expo-modules-autolinking": { @@ -65202,6 +65856,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -65215,6 +65870,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4" } @@ -65233,6 +65889,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -65244,6 +65901,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -65254,25 +65912,29 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true + "dev": true, + "peer": true }, "hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true + "dev": true, + "peer": true }, "lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -65320,13 +65982,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65336,6 +66000,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -65345,6 +66010,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -65357,6 +66023,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65368,6 +66035,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, + "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -65380,6 +66048,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65389,6 +66058,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, + "peer": true, "requires": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -65405,6 +66075,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -65416,6 +66087,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, + "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -65433,6 +66105,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -65443,6 +66116,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65452,6 +66126,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -65462,6 +66137,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -65480,6 +66156,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -65494,6 +66171,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65508,6 +66186,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65528,13 +66207,15 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "peer": true, "requires": { "mime-db": "1.52.0" } @@ -65544,6 +66225,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -65553,6 +66235,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "peer": true, "requires": { "minipass": "^7.1.2" } @@ -65562,6 +66245,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65571,6 +66255,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -65581,6 +66266,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -65590,13 +66276,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true + "dev": true, + "peer": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -65608,6 +66296,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -65625,7 +66314,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true }, "react-native": { "version": "0.83.1", @@ -65676,6 +66366,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -65690,13 +66381,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -65706,6 +66399,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -65715,13 +66409,15 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true + "dev": true, + "peer": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -65736,6 +66432,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65745,6 +66442,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65754,6 +66452,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -65762,25 +66461,29 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true + "dev": true, + "peer": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true }, "tar": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, + "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -65799,13 +66502,15 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true + "dev": true, + "peer": true }, "yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -65874,8 +66579,7 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "peer": true + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" }, "typescript": { "version": "5.9.3", @@ -65928,6 +66632,7 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, + "peer": true, "requires": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -65939,6 +66644,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, + "peer": true, "requires": { "path-parse": "^1.0.5" } @@ -65975,6 +66681,7 @@ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, + "peer": true, "requires": { "global-dirs": "^0.1.1" }, @@ -65984,6 +66691,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, + "peer": true, "requires": { "ini": "^1.3.4" } @@ -66004,13 +66712,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true + "dev": true, + "peer": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true + "dev": true, + "peer": true }, "responselike": { "version": "3.0.0", @@ -66025,6 +66735,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -66034,13 +66745,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "dev": true, + "peer": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -66094,7 +66807,6 @@ "version": "4.46.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", - "peer": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", @@ -66225,7 +66937,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -66360,7 +67071,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true + "dev": true, + "peer": true }, "serialize-javascript": { "version": "6.0.2", @@ -66374,8 +67086,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true, - "peer": true + "dev": true }, "seroval-plugins": { "version": "1.1.1", @@ -66673,6 +67384,7 @@ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, + "peer": true, "requires": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -66740,7 +67452,8 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true + "dev": true, + "peer": true }, "smart-buffer": { "version": "4.2.0", @@ -66804,7 +67517,6 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, - "peer": true, "requires": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -66967,6 +67679,7 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "peer": true, "requires": { "escape-string-regexp": "^2.0.0" }, @@ -66975,7 +67688,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -66989,13 +67703,15 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "dev": true, + "peer": true }, "stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, + "peer": true, "requires": { "type-fest": "^0.7.1" }, @@ -67004,7 +67720,8 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -67027,7 +67744,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true + "dev": true, + "peer": true }, "stream-shift": { "version": "1.0.3", @@ -67146,7 +67864,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true + "dev": true, + "peer": true }, "style-to-js": { "version": "1.1.21", @@ -67209,6 +67928,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -67285,7 +68005,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, - "peer": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -67394,13 +68113,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true + "dev": true, + "peer": true }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -67410,7 +68131,6 @@ "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", - "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -67558,7 +68278,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true + "dev": true, + "peer": true }, "throttleit": { "version": "2.1.0", @@ -67618,8 +68339,7 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "peer": true + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" } } }, @@ -67659,7 +68379,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "peer": true }, "to-regex-range": { "version": "5.0.1", @@ -67762,14 +68483,12 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "peer": true + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "peer": true, "requires": { "esbuild": "~0.27.0", "fsevents": "~2.3.3", @@ -68064,7 +68783,8 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "peer": true }, "type-fest": { "version": "4.41.0", @@ -68155,7 +68875,6 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, - "peer": true, "requires": {} }, "typescript": { @@ -68565,7 +69284,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true + "dev": true, + "peer": true }, "value-equal": { "version": "1.0.1", @@ -68631,7 +69351,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fsevents": "~2.3.3", @@ -68726,7 +69445,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true + "dev": true, + "peer": true }, "w3c-xmlserializer": { "version": "5.0.0", @@ -68742,6 +69462,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "peer": true, "requires": { "makeerror": "1.0.12" } @@ -68768,6 +69489,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "peer": true, "requires": { "defaults": "^1.0.3" } @@ -68781,7 +69503,6 @@ "version": "5.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", - "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -69045,7 +69766,8 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true + "dev": true, + "peer": true }, "whatwg-mimetype": { "version": "4.0.0", @@ -69067,6 +69789,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, + "peer": true, "requires": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -69077,7 +69800,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -69168,7 +69892,8 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true + "dev": true, + "peer": true }, "wordwrapjs": { "version": "5.1.0", @@ -69226,7 +69951,6 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "peer": true, "requires": {} }, "wsl-utils": { @@ -69257,6 +69981,7 @@ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, + "peer": true, "requires": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -69266,7 +69991,8 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -69294,6 +70020,7 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "peer": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -69303,7 +70030,8 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -69311,7 +70039,8 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true + "dev": true, + "peer": true }, "xmlchars": { "version": "2.2.0", @@ -69368,7 +70097,8 @@ "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 + "dev": true, + "peer": true }, "z2s": { "version": "file:packages/z2s", @@ -69492,8 +70222,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "peer": true + "dev": true }, "typescript": { "version": "5.9.3", @@ -69506,7 +70235,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -69801,6 +70529,7 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, + "peer": true, "requires": {} }, "zql": { @@ -69921,8 +70650,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "peer": true + "dev": true }, "typescript": { "version": "5.9.3", diff --git a/packages/zero/package.json b/packages/zero/package.json index a772dc210a..c2f92ef003 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -49,6 +49,7 @@ "@rocicorp/zero-sqlite3": "^1.0.15", "@standard-schema/spec": "^1.0.0", "@types/basic-auth": "^1.1.8", + "@types/ws": "^8.5.12", "basic-auth": "^2.0.1", "chalk": "^5.3.0", "chalk-template": "^1.1.0", From f21e1f9ae8aec2af2f89733ff7168ad2ce6e7f5b Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 10 Mar 2026 10:12:48 -0700 Subject: [PATCH 137/495] chore(zero-cache): fix backfill init to handle slow replication slot creation (#5649) Delay the start of the copy transaction until after the replication slot has been created. If the creation of a replication slot takes more than a few seconds (and it can take minutes in pathological busy-WAL scenarios), keepalives will fire in the TransactionPool and cause the transaction snapshot to fail with `SET TRANSACTION SNAPSHOT must be called before any query`. The new initialization logic creates the replication slot first, and then sets the snapshot via an initTask (the same way it is [done in initial-sync.ts](https://github.com/rocicorp/mono/blob/b9d349e207f13f3fb942bb2935d61b4a5fa4ec09/packages/zero-cache/src/services/change-source/pg/initial-sync.ts#L335)). Alert Reference: * https://app.slack.com/client/TMQQ9DWPQ/C0ABMK92H47 --- .../change-source/pg/backfill-stream.ts | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts index 34847f8ac7..902dbbd700 100644 --- a/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts +++ b/packages/zero-cache/src/services/change-source/pg/backfill-stream.ts @@ -10,8 +10,8 @@ import {READONLY} from '../../../db/mode-enum.ts'; import {TsvParser} from '../../../db/pg-copy.ts'; import {getTypeParsers, type TypeParser} from '../../../db/pg-type-parser.ts'; import type {PublishedTableSpec} from '../../../db/specs.ts'; -import {TransactionPool} from '../../../db/transaction-pool.ts'; -import {pgClient} from '../../../types/pg.ts'; +import {importSnapshot, TransactionPool} from '../../../db/transaction-pool.ts'; +import {pgClient, type PostgresDB} from '../../../types/pg.ts'; import {SchemaIncompatibilityError} from '../common/backfill-manager.ts'; import type { BackfillCompleted, @@ -70,9 +70,15 @@ export async function* streamBackfill( connection: {['application_name']: 'backfill-stream'}, ['max_lifetime']: 120 * 60, // set a long (2h) limit for COPY streaming }); - const tx = new TransactionPool(lc, READONLY).run(db); + let tx: TransactionPool | undefined; + let watermark: string; try { - const watermark = await setSnapshot(lc, upstreamURI, tx, slot); + ({tx, watermark} = await createSnapshotTransaction( + lc, + upstreamURI, + db, + slot, + )); const {tableSpec, backfill} = await validateSchema( tx, publications, @@ -110,9 +116,7 @@ export async function* streamBackfill( } throw e; } finally { - tx.setDone(); - // errors are already thrown and handled from processReadTask() - void tx.done().catch(() => {}); + tx?.setDone(); // Workaround postgres.js hanging at the end of some COPY commands: // https://github.com/porsager/postgres/issues/499 void db.end().catch(e => lc.warn?.(`error closing backfill connection`, e)); @@ -213,10 +217,10 @@ async function* stream( * transaction; this is the only way to get set a transaction at a specific * LSN.) */ -async function setSnapshot( +async function createSnapshotTransaction( lc: LogContext, upstreamURI: string, - tx: TransactionPool, + db: PostgresDB, slotNamePrefix: string, ) { const replicationSession = pgClient(lc, upstreamURI, { @@ -228,16 +232,14 @@ async function setSnapshot( const {snapshot_name: snapshot, consistent_point: lsn} = await createReplicationSlot(lc, replicationSession, tempSlot); - await tx.processReadTask(sql => - sql.unsafe(`SET TRANSACTION SNAPSHOT '${snapshot}'`), - ); - // Once the snapshot has been set, the replication session and slot can - // be closed / dropped. + const {init, imported} = importSnapshot(snapshot); + const tx = new TransactionPool(lc, READONLY, init).run(db); + await imported; await replicationSession.unsafe(`DROP_REPLICATION_SLOT "${tempSlot}"`); const watermark = toStateVersionString(lsn); lc.info?.(`Opened snapshot transaction at LSN ${lsn} (${watermark})`); - return watermark; + return {tx, watermark}; } catch (e) { // In the event of a failure, clean up the replication slot if created. await replicationSession.unsafe( From 091abe821d63672b0e78d457d54434525a2b15cd Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 10 Mar 2026 21:03:10 -0700 Subject: [PATCH 138/495] chore(zero-cache): remove a table-wide write from schema-change replication (#5650) Avoid updating the `_0_version` row version column for all rows in a table on schema changes. This was done to force the redownload of affected rows (by being newer than whatever is in existing CVRs) after a schema change. However, for large tables this can block the process for an arbitrarily long time (e.g. 44 minutes for a 40GB table), as well as explode storage usage as the resulting replica WAL writes can't get checkpointed by litestream. Instead, a `minRowVersion` column is introduced to the `_zero.tableMetadata` table and overlayed onto the rows produced by the pipelines during hydration. For the incident in question, this cuts the time it takes to backfill a table by over 50%, and improves the speed of other schema changes as well (with the improvement scaling with the size of the table). **Other read paths** The overlay is not needed in incremental catchup (with reasoning documented in the snapshotter implementation), and currently the `_0_version` column is not otherwise queried in any other places. If such a new read path arise, the overlay will have to be applied there too. Reference Incident: * https://www.notion.so/replicache/31e3bed8954580169dd9c9309cbe7ea7?source=copy_link#31f3bed8954580548219c5257d76369b --- packages/analyze-query/src/run-ast.test.ts | 28 ++- packages/analyze-query/src/run-ast.ts | 13 +- .../src/auth/read-authorizer.query.test.ts | 2 + .../src/auth/write-authorizer.test.ts | 6 +- packages/zero-cache/src/db/create.pg.test.ts | 7 + .../zero-cache/src/db/lite-tables.test.ts | 107 ++++++++ packages/zero-cache/src/db/lite-tables.ts | 11 +- packages/zero-cache/src/db/specs.ts | 14 +- .../common/replica-schema.test.ts | 38 ++- .../change-source/common/replica-schema.ts | 30 ++- .../change-source/pg/sync-schema.pg.test.ts | 4 +- .../services/mutagen/mutagen.authz.pg.test.ts | 2 + .../replicator/change-processor.test.ts | 231 +++++++++++++----- .../services/replicator/change-processor.ts | 29 +-- .../replicator/incremental-sync.test.ts | 14 +- .../replicator/replication-status.test.ts | 10 +- .../replicator/schema/table-metadata.test.ts | 73 +++++- .../replicator/schema/table-metadata.ts | 105 +++++--- packages/zero-cache/src/services/run-ast.ts | 4 +- .../view-syncer/client-schema.test.ts | 2 + .../view-syncer/pipeline-driver.test.ts | 22 +- .../services/view-syncer/pipeline-driver.ts | 47 +++- .../src/services/view-syncer/snapshotter.ts | 27 +- .../zero-cache/src/workers/syncer.test.ts | 3 + .../src/helpers/planner-exec.ts | 3 + packages/zqlite/src/sqlite-cost-model.test.ts | 3 + 26 files changed, 674 insertions(+), 161 deletions(-) diff --git a/packages/analyze-query/src/run-ast.test.ts b/packages/analyze-query/src/run-ast.test.ts index 0c7123ddc4..4b31790a37 100644 --- a/packages/analyze-query/src/run-ast.test.ts +++ b/packages/analyze-query/src/run-ast.test.ts @@ -1,12 +1,13 @@ import {beforeEach, expect, test, vi} from 'vitest'; import {createSilentLogContext} from '../../shared/src/logging-test-utils.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../../zero-cache/src/services/replicator/schema/table-metadata.ts'; import {hydrate} from '../../zero-cache/src/services/view-syncer/pipeline-driver.ts'; import type {AST} from '../../zero-protocol/src/ast.ts'; +import type {ClientSchema} from '../../zero-protocol/src/client-schema.ts'; import type {BuilderDelegate} from '../../zql/src/builder/builder.ts'; import {Debug} from '../../zql/src/builder/debug-delegate.ts'; import {Database} from '../../zqlite/src/db.ts'; import {runAst, type RunAstOptions} from './run-ast.ts'; -import type {ClientSchema} from '../../zero-protocol/src/client-schema.ts'; const minimalClientSchema: ClientSchema = {tables: {}}; @@ -71,6 +72,7 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as }; const isTransformed = true; const db = new Database(lc, ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); const host = createMockHost(true); @@ -92,7 +94,7 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as expect(result1).toMatchInlineSnapshot(` { "afterPermissions": undefined, - "end": 1003, + "end": 1017, "readRowCount": 2, "readRowCountsByQuery": { "users": { @@ -100,7 +102,7 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as }, }, "readRows": undefined, - "start": 1002, + "start": 1004, "syncedRowCount": 0, "syncedRows": undefined, "warnings": [], @@ -125,7 +127,7 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as expect(result2).toMatchInlineSnapshot(` { "afterPermissions": undefined, - "end": 1005, + "end": 1031, "readRowCount": 2, "readRowCountsByQuery": { "users": { @@ -146,7 +148,7 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as ], }, }, - "start": 1004, + "start": 1018, "syncedRowCount": 0, "syncedRows": undefined, "warnings": [], @@ -171,7 +173,7 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as expect(result3).toMatchInlineSnapshot(` { "afterPermissions": undefined, - "end": 1007, + "end": 1045, "readRowCount": 2, "readRowCountsByQuery": { "users": { @@ -179,7 +181,7 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as }, }, "readRows": undefined, - "start": 1006, + "start": 1032, "syncedRowCount": 0, "syncedRows": undefined, "warnings": [], @@ -194,6 +196,7 @@ test('runAst returns empty object for vendedRowCounts when no debug tracking', a }; const isTransformed = true; const db = new Database(lc, ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); const host = createMockHost(false); // No debug @@ -214,11 +217,11 @@ test('runAst returns empty object for vendedRowCounts when no debug tracking', a expect(result).toMatchInlineSnapshot(` { "afterPermissions": undefined, - "end": 1003, + "end": 1017, "readRowCount": 0, "readRowCountsByQuery": {}, "readRows": undefined, - "start": 1002, + "start": 1004, "syncedRowCount": 0, "syncedRows": undefined, "warnings": [], @@ -233,6 +236,7 @@ test('runAst basic structure and functionality', async () => { }; const isTransformed = true; const db = new Database(lc, ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); const host = createMockHost(true); @@ -253,7 +257,7 @@ test('runAst basic structure and functionality', async () => { expect(result).toMatchInlineSnapshot(` { "afterPermissions": undefined, - "end": 1003, + "end": 1017, "readRowCount": 2, "readRowCountsByQuery": { "users": { @@ -261,7 +265,7 @@ test('runAst basic structure and functionality', async () => { }, }, "readRows": undefined, - "start": 1002, + "start": 1004, "syncedRowCount": 0, "syncedRows": undefined, "warnings": [], @@ -333,6 +337,7 @@ test('runAst counts only unique synced rows, skips duplicates', async () => { }; const isTransformed = true; const db = new Database(lc, ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); const host = createMockHost(false); const options: RunAstOptions = { @@ -402,6 +407,7 @@ test('runAst handles case where all synced rows are duplicates', async () => { }; const isTransformed = true; const db = new Database(lc, ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); const host = createMockHost(false); const options: RunAstOptions = { diff --git a/packages/analyze-query/src/run-ast.ts b/packages/analyze-query/src/run-ast.ts index 377d5e034d..ecf7641b99 100644 --- a/packages/analyze-query/src/run-ast.ts +++ b/packages/analyze-query/src/run-ast.ts @@ -5,6 +5,7 @@ import {assert} from '../../shared/src/asserts.ts'; import {must} from '../../shared/src/must.ts'; import type {JWTAuth} from '../../zero-cache/src/auth/auth.ts'; import {transformAndHashQuery} from '../../zero-cache/src/auth/read-authorizer.ts'; +import {computeZqlSpecs} from '../../zero-cache/src/db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../../zero-cache/src/db/specs.ts'; import {hydrate} from '../../zero-cache/src/services/view-syncer/pipeline-driver.ts'; import type {AnalyzeQueryResult} from '../../zero-protocol/src/analyze-query-result.ts'; @@ -40,7 +41,7 @@ export async function runAst( isTransformed: boolean, options: RunAstOptions, ): Promise { - const {clientToServerMapper, permissions, host} = options; + const {clientToServerMapper, permissions, host, db} = options; const result: AnalyzeQueryResult = { warnings: [], syncedRows: undefined, @@ -89,7 +90,15 @@ export async function runAst( let syncedRowCount = 0; const rowsByTable: Record = {}; const seenByTable: Set = new Set(); - for (const rowChange of hydrate(pipeline, hashOfAST(ast), clientSchema)) { + const tableSpecs = computeZqlSpecs(lc, db, { + includeBackfillingColumns: false, + }); + for (const rowChange of hydrate( + pipeline, + hashOfAST(ast), + clientSchema, + tableSpecs, + )) { if (rowChange === 'yield') { continue; } diff --git a/packages/zero-cache/src/auth/read-authorizer.query.test.ts b/packages/zero-cache/src/auth/read-authorizer.query.test.ts index a6071a3e07..d3f10b4b63 100644 --- a/packages/zero-cache/src/auth/read-authorizer.query.test.ts +++ b/packages/zero-cache/src/auth/read-authorizer.query.test.ts @@ -45,6 +45,7 @@ import { import {Database} from '../../../zqlite/src/db.ts'; import {TableSource} from '../../../zqlite/src/table-source.ts'; import type {ZeroConfig} from '../config/zero-config.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../services/replicator/schema/table-metadata.ts'; import {transformQuery} from './read-authorizer.ts'; import {WriteAuthorizerImpl} from './write-authorizer.ts'; @@ -521,6 +522,7 @@ beforeEach(() => { replica.exec(` CREATE TABLE "app.permissions" (permissions JSON, hash TEXT); `); + replica.exec(CREATE_TABLE_METADATA_TABLE); const permsJSON = JSON.stringify(permissions); replica .prepare(`INSERT INTO "app.permissions" (permissions, hash) VALUES (?, ?)`) diff --git a/packages/zero-cache/src/auth/write-authorizer.test.ts b/packages/zero-cache/src/auth/write-authorizer.test.ts index 93e900ccf0..6e4b735272 100644 --- a/packages/zero-cache/src/auth/write-authorizer.test.ts +++ b/packages/zero-cache/src/auth/write-authorizer.test.ts @@ -1,4 +1,5 @@ import {beforeEach, describe, expect, test} from 'vitest'; +import {testLogConfig} from '../../../otel/src/test-log-config.ts'; import {h128} from '../../../shared/src/hash.ts'; import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; import type { @@ -10,14 +11,14 @@ import type { PermissionsConfig, Rule, } from '../../../zero-schema/src/compiled-permissions.ts'; -import {Database} from '../../../zqlite/src/db.ts'; import { CREATE_STORAGE_TABLE, DatabaseStorage, } from '../../../zqlite/src/database-storage.ts'; +import {Database} from '../../../zqlite/src/db.ts'; import type {ZeroConfig} from '../config/zero-config.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../services/replicator/schema/table-metadata.ts'; import {WriteAuthorizerImpl} from './write-authorizer.ts'; -import {testLogConfig} from '../../../otel/src/test-log-config.ts'; const lc = createSilentLogContext(); const zeroConfig = { @@ -61,6 +62,7 @@ beforeEach(() => { CREATE TABLE "the_app.permissions" (permissions JSON, hash TEXT); INSERT INTO "the_app.permissions" (permissions) VALUES (NULL); `); + replica.exec(CREATE_TABLE_METADATA_TABLE); const storageDb = new Database(lc, ':memory:'); storageDb.prepare(CREATE_STORAGE_TABLE).run(); writeAuthzStorage = new DatabaseStorage(storageDb); diff --git a/packages/zero-cache/src/db/create.pg.test.ts b/packages/zero-cache/src/db/create.pg.test.ts index 6009efac88..c3d3401f7a 100644 --- a/packages/zero-cache/src/db/create.pg.test.ts +++ b/packages/zero-cache/src/db/create.pg.test.ts @@ -1,6 +1,7 @@ import {beforeEach, describe, expect} from 'vitest'; import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; import {Database} from '../../../zqlite/src/db.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../services/replicator/schema/table-metadata.ts'; import {test} from '../test/db.ts'; import {createLiteTableStatement} from './create.ts'; import { @@ -80,6 +81,7 @@ describe('tables/create', () => { }, }, backfilling: [], + minRowVersion: null, }, }, { @@ -142,6 +144,7 @@ describe('tables/create', () => { }, }, backfilling: [], + minRowVersion: null, }, }, { @@ -273,6 +276,7 @@ describe('tables/create', () => { }, }, backfilling: [], + minRowVersion: null, }, }, { @@ -369,6 +373,7 @@ describe('tables/create', () => { }, }, backfilling: [], + minRowVersion: null, }, }, { @@ -465,6 +470,7 @@ describe('tables/create', () => { }, }, backfilling: [], + minRowVersion: null, }, }, ]; @@ -474,6 +480,7 @@ describe('tables/create', () => { beforeEach(() => { db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); }); test.each(cases)('$name', c => { diff --git a/packages/zero-cache/src/db/lite-tables.test.ts b/packages/zero-cache/src/db/lite-tables.test.ts index aa3c29183f..f4f5ec9332 100644 --- a/packages/zero-cache/src/db/lite-tables.test.ts +++ b/packages/zero-cache/src/db/lite-tables.test.ts @@ -6,6 +6,7 @@ import { ColumnMetadataStore, CREATE_COLUMN_METADATA_TABLE, } from '../services/replicator/schema/column-metadata.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../services/replicator/schema/table-metadata.ts'; import { computeZqlSpecs, listIndexes, @@ -58,6 +59,7 @@ describe('lite/tables', () => { }, primaryKey: ['clientID'], backfilling: [], + minRowVersion: null, }, ], }, @@ -164,6 +166,7 @@ describe('lite/tables', () => { }, primaryKey: ['user_id'], backfilling: [], + minRowVersion: null, }, ], }, @@ -217,6 +220,7 @@ describe('lite/tables', () => { }, primaryKey: ['org_id', 'component_id', 'issue_id'], backfilling: [], + minRowVersion: null, }, ], }, @@ -225,6 +229,7 @@ describe('lite/tables', () => { for (const c of cases) { test(c.name, () => { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); db.exec(c.setupQuery); const tables = listTables(db); @@ -321,6 +326,7 @@ describe('lite/indexes', () => { for (const c of cases) { test(c.name, () => { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); db.exec(c.setupQuery); const tables = listIndexes(db); @@ -332,6 +338,7 @@ describe('lite/indexes', () => { describe('computeZqlSpec', () => { function t(setup: string) { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); db.exec(setup); return [ ...computeZqlSpecs(createSilentLogContext(), db, { @@ -391,6 +398,90 @@ describe('computeZqlSpec', () => { "pos": 4, }, }, + "minRowVersion": null, + "name": "foo", + "primaryKey": [ + "b", + ], + "uniqueKeys": [ + [ + "b", + ], + ], + }, + "zqlSpec": { + "a": { + "type": "number", + }, + "b": { + "type": "number", + }, + "c": { + "type": "number", + }, + "d": { + "type": "number", + }, + }, + }, + ] + `); + }); + + test('min row version', () => { + expect( + t(` + CREATE TABLE nopk(a INT, b INT, c INT, d INT); + CREATE TABLE foo(a INT, b "INT|NOT_NULL", c INT, d INT); + CREATE UNIQUE INDEX foo_pkey ON foo(b ASC); + INSERT INTO "_zero.tableMetadata" ("schema", "table", "minRowVersion") + VALUES ('public', 'foo', '123'); + `), + ).toMatchInlineSnapshot(` + [ + { + "tableSpec": { + "allPotentialPrimaryKeys": [ + [ + "b", + ], + ], + "backfilling": [], + "columns": { + "a": { + "characterMaximumLength": null, + "dataType": "INT", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 1, + }, + "b": { + "characterMaximumLength": null, + "dataType": "INT|NOT_NULL", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 2, + }, + "c": { + "characterMaximumLength": null, + "dataType": "INT", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 3, + }, + "d": { + "characterMaximumLength": null, + "dataType": "INT", + "dflt": null, + "elemPgTypeClass": null, + "notNull": false, + "pos": 4, + }, + }, + "minRowVersion": "123", "name": "foo", "primaryKey": [ "b", @@ -454,6 +545,7 @@ describe('computeZqlSpec', () => { "pos": 2, }, }, + "minRowVersion": null, "name": "foo", "primaryKey": [ "b", @@ -522,6 +614,7 @@ describe('computeZqlSpec', () => { "pos": 4, }, }, + "minRowVersion": null, "name": "foo", "primaryKey": [ "a", @@ -609,6 +702,7 @@ describe('computeZqlSpec', () => { "pos": 4, }, }, + "minRowVersion": null, "name": "foo", "primaryKey": [ "a", @@ -698,6 +792,7 @@ describe('computeZqlSpec', () => { "pos": 4, }, }, + "minRowVersion": null, "name": "foo", "primaryKey": [ "a", @@ -786,6 +881,7 @@ describe('computeZqlSpec', () => { "pos": 4, }, }, + "minRowVersion": null, "name": "foo", "primaryKey": [ "b", @@ -874,6 +970,7 @@ describe('computeZqlSpec', () => { "pos": 4, }, }, + "minRowVersion": null, "name": "foo", "primaryKey": [ "c", @@ -990,6 +1087,7 @@ describe('computeZqlSpec', () => { "pos": 5, }, }, + "minRowVersion": null, "name": "funk", "primaryKey": [ "id", @@ -1042,6 +1140,7 @@ describe('computeZqlSpec', () => { describe('metadata table integration', () => { test('fallback: reads from column types when metadata table does not exist', () => { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); // Create table with pipe notation in column types db.exec(` @@ -1065,6 +1164,7 @@ describe('metadata table integration', () => { test('reads from metadata table when available', () => { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); // Create metadata table db.exec(CREATE_COLUMN_METADATA_TABLE); @@ -1121,6 +1221,7 @@ describe('metadata table integration', () => { test('exclude backfilling columns from zqlspecs', () => { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); // Create metadata table db.exec(CREATE_COLUMN_METADATA_TABLE); @@ -1193,6 +1294,7 @@ describe('metadata table integration', () => { "pos": 2, }, }, + "minRowVersion": null, "name": "users", "primaryKey": [ "id", @@ -1255,6 +1357,7 @@ describe('metadata table integration', () => { "pos": 2, }, }, + "minRowVersion": null, "name": "users", "primaryKey": [ "id", @@ -1282,6 +1385,7 @@ describe('metadata table integration', () => { test('exclude backfilling table from zqlspecs', () => { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); // Create metadata table db.exec(CREATE_COLUMN_METADATA_TABLE); @@ -1381,6 +1485,7 @@ describe('metadata table integration', () => { "pos": 2, }, }, + "minRowVersion": null, "name": "users", "primaryKey": [ "id", @@ -1408,6 +1513,7 @@ describe('metadata table integration', () => { test('partial metadata: reads from metadata table for some columns, fallback for others', () => { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); // Create metadata table db.exec(CREATE_COLUMN_METADATA_TABLE); @@ -1450,6 +1556,7 @@ describe('metadata table integration', () => { test('enum arrays with metadata table', () => { const db = new Database(createSilentLogContext(), ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); // Create metadata table db.exec(CREATE_COLUMN_METADATA_TABLE); diff --git a/packages/zero-cache/src/db/lite-tables.ts b/packages/zero-cache/src/db/lite-tables.ts index 05837df55b..9b7f9145d8 100644 --- a/packages/zero-cache/src/db/lite-tables.ts +++ b/packages/zero-cache/src/db/lite-tables.ts @@ -8,6 +8,7 @@ import { ColumnMetadataStore, metadataToLiteTypeString, } from '../services/replicator/schema/column-metadata.ts'; +import {TableMetadataTracker} from '../services/replicator/schema/table-metadata.ts'; import { isArray, isEnum, @@ -35,15 +36,18 @@ type ColumnInfo = { export type LiteTableSpecWithReplicationStatus = LiteTableSpec & { readonly backfilling?: string[]; + readonly minRowVersion?: string | null; }; type MutableLiteTableSpecWithReplicationStatus = MutableLiteTableSpec & { backfilling: string[]; + minRowVersion: string | null; }; export function listTables( db: Database, useColumnMetadata = true, + useTableMetadata = true, ): LiteTableSpecWithReplicationStatus[] { const columns = db .prepare( @@ -65,7 +69,10 @@ export function listTables( ) .all() as ColumnInfo[]; - const tables: LiteTableSpec[] = []; + const minRowVersions = useTableMetadata + ? new TableMetadataTracker(db).getMinRowVersions() + : new Map(); + const tables: LiteTableSpecWithReplicationStatus[] = []; let table: MutableLiteTableSpecWithReplicationStatus | undefined; columns.forEach(col => { @@ -75,6 +82,7 @@ export function listTables( name: col.table, columns: {}, backfilling: [], + minRowVersion: minRowVersions.get(col.table) ?? null, }; tables.push(table); } @@ -287,6 +295,7 @@ export function computeZqlSpecsFromLiteSpecs( allPotentialPrimaryKeys: keys.map(key => v.parse(key.sort(), primaryKeySchema), ), + minRowVersion: fullTable.minRowVersion ?? null, }; tableSpecs.set(tableSpec.name, { diff --git a/packages/zero-cache/src/db/specs.ts b/packages/zero-cache/src/db/specs.ts index 529ae94e7c..a083147c12 100644 --- a/packages/zero-cache/src/db/specs.ts +++ b/packages/zero-cache/src/db/specs.ts @@ -67,7 +67,10 @@ export type MutableLiteTableSpec = v.Infer; export type LiteTableSpec = Readonly; -export type LiteTableSpecWithKeys = Omit & { +export type LiteTableSpecWithKeysAndVersion = Omit< + LiteTableSpec, + 'primaryKey' +> & { /** * All keys associated with a unique index. Includes indexes with * nullable columns. @@ -86,10 +89,17 @@ export type LiteTableSpecWithKeys = Omit & { * columns, i.e. suitable as a primary key. */ allPotentialPrimaryKeys: PrimaryKey[]; + + /** + * The minimum `_0_version` value for every row in the table. If this is + * present, `_0_version` value in the row itself should only be used if + * it is greater (i.e. later) than the `minRowVersion`. + */ + minRowVersion: string | null; }; export type LiteAndZqlSpec = { - tableSpec: LiteTableSpecWithKeys; + tableSpec: LiteTableSpecWithKeysAndVersion; zqlSpec: Record; }; diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts index b1fe7116a4..6ba4750103 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts @@ -10,13 +10,14 @@ import {initReplicationState} from '../../replicator/schema/replication-state.ts import { CREATE_V6_COLUMN_METADATA_TABLE, CREATE_V7_CHANGE_LOG, + CREATE_V9_TABLE_METADATA_TABLE, initReplica, } from './replica-schema.ts'; // Update as necessary. -const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 10, - schemaVersion: 10, +export const CURRENT_SCHEMA_VERSIONS = { + dataVersion: 11, + schemaVersion: 11, minSafeVersion: 1, lock: 1, // Internal column, always 1 }; @@ -277,6 +278,37 @@ describe('replica-schema-migrations', () => { ['_zero.tableMetadata']: [], }, }, + { + fromVersion: 9, + desc: 'add table metadata', + replicaSetup: + ` + CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); + ` + + CREATE_V1_REPLICATION_CONFIG_TABLE + + CREATE_V6_COLUMN_METADATA_TABLE + + CREATE_V7_CHANGE_LOG + + CREATE_V9_TABLE_METADATA_TABLE, + replicaPreState: { + ['_zero.tableMetadata']: [ + { + schema: 'foo', + table: 'bar', + metadata: '{"foo":"bar"}', + }, + ], + }, + replicaPostState: { + ['_zero.tableMetadata']: [ + { + schema: 'foo', + table: 'bar', + minRowVersion: '00', + upstreamMetadata: '{"foo":"bar"}', + }, + ], + }, + }, ]; let replicaFile: DbFile; diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.ts index b49241d237..2bcdd9dc7b 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.ts @@ -13,7 +13,6 @@ import { CREATE_RUNTIME_EVENTS_TABLE, recordEvent, } from '../../replicator/schema/replication-state.ts'; -import {CREATE_TABLE_METADATA_TABLE} from '../../replicator/schema/table-metadata.ts'; export async function initReplica( log: LogContext, @@ -88,6 +87,15 @@ export const CREATE_V7_CHANGE_LOG = /*sql*/ ` ); `; +export const CREATE_V9_TABLE_METADATA_TABLE = /*sql*/ ` + CREATE TABLE "_zero.tableMetadata" ( + "schema" TEXT NOT NULL, + "table" TEXT NOT NULL, + "metadata" TEXT NOT NULL, + PRIMARY KEY ("schema", "table") + ); +`; + export const schemaVersionMigrationMap: IncrementalMigrationMap = { // There's no incremental migration from v1. Just reset the replica. 4: { @@ -138,7 +146,7 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { // versions but did not initialize the table for new replicas. db.exec(/*sql*/ `DELETE FROM "_zero.column_metadata"`); - const tables = listTables(db, false); + const tables = listTables(db, false, false); populateFromExistingTables(db, tables); }, }, @@ -151,7 +159,7 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { ADD COLUMN "backfillingColumnVersions" TEXT DEFAULT '{}'; ALTER TABLE "_zero.column_metadata" ADD COLUMN backfill TEXT; - ` + CREATE_TABLE_METADATA_TABLE, + ` + CREATE_V9_TABLE_METADATA_TABLE, ); }, }, @@ -164,4 +172,20 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { `); }, }, + + 11: { + migrateSchema: (_, db) => { + db.exec(/*sql*/ ` + ALTER TABLE "_zero.tableMetadata" + ADD COLUMN "minRowVersion" TEXT NOT NULL DEFAULT '00'; + + -- Removing the NOT NULL constraint from "metadata" requires copying + -- the column. We piggyback the rename to "upstreamMetadata" here. + ALTER TABLE "_zero.tableMetadata" + ADD COLUMN "upstreamMetadata" TEXT; + UPDATE "_zero.tableMetadata" SET "upstreamMetadata" = "metadata"; + ALTER TABLE "_zero.tableMetadata" DROP "metadata"; + `); + }, + }, }; diff --git a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts index 3c5a2acf68..5fabb5d441 100644 --- a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts @@ -23,8 +23,8 @@ const SHARD_NUM = 9; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 10, - schemaVersion: 10, + dataVersion: 11, + schemaVersion: 11, minSafeVersion: 1, lock: 1, // Internal column, always 1 }; diff --git a/packages/zero-cache/src/services/mutagen/mutagen.authz.pg.test.ts b/packages/zero-cache/src/services/mutagen/mutagen.authz.pg.test.ts index 3e57d40a4c..e1a3201995 100644 --- a/packages/zero-cache/src/services/mutagen/mutagen.authz.pg.test.ts +++ b/packages/zero-cache/src/services/mutagen/mutagen.authz.pg.test.ts @@ -28,6 +28,7 @@ import {WriteAuthorizerImpl} from '../../auth/write-authorizer.ts'; import type {ZeroConfig} from '../../config/zero-config.ts'; import {type PgTest, test} from '../../test/db.ts'; import type {PostgresDB} from '../../types/pg.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../replicator/schema/table-metadata.ts'; import {zeroSchema} from './mutagen-test-shared.ts'; import {processMutation} from './mutagen.ts'; @@ -145,6 +146,7 @@ async function createUpstreamTables(db: PostgresDB) { } function createReplicaTables(db: Database) { + db.exec(CREATE_TABLE_METADATA_TABLE); db.exec(sqlSchema); } diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index 345859f74d..861e1567e5 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -1085,7 +1085,9 @@ describe('replicator/change-processor', () => { { schema: 'public', table: 'foo', - metadata: '{"rowKey":{"type":"index","columns":["id","serial"]}}', + upstreamMetadata: + '{"rowKey":{"type":"index","columns":["id","serial"]}}', + minRowVersion: '00', }, ], ['_zero.column_metadata']: [ @@ -1178,6 +1180,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: ['serial'], + minRowVersion: '00', }, ], indexSpecs: [], @@ -1190,7 +1193,7 @@ describe('replicator/change-processor', () => { INSERT INTO foo(id, _0_version) VALUES (2, '00'); INSERT INTO foo(id, _0_version) VALUES (3, '00'); - INSERT INTO "_zero.tableMetadata" ("schema", "table", "metadata") + INSERT INTO "_zero.tableMetadata" ("schema", "table", "upstreamMetadata") VALUES ('public', 'foo', '{"rowKey":{"columns":["id"]}}'); `, downstream: [ @@ -1201,9 +1204,9 @@ describe('replicator/change-processor', () => { ], data: { bar: [ - {id: 1n, ['_0_version']: '0e'}, - {id: 2n, ['_0_version']: '0e'}, - {id: 3n, ['_0_version']: '0e'}, + {id: 1n, ['_0_version']: '00'}, + {id: 2n, ['_0_version']: '00'}, + {id: 3n, ['_0_version']: '00'}, {id: 4n, ['_0_version']: '0e'}, ], ['_zero.changeLog2']: [ @@ -1228,7 +1231,8 @@ describe('replicator/change-processor', () => { { schema: 'public', table: 'bar', - metadata: '{"rowKey":{"columns":["id"]}}', + upstreamMetadata: '{"rowKey":{"columns":["id"]}}', + minRowVersion: '0e', }, ], }, @@ -1254,6 +1258,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [], @@ -1317,21 +1322,21 @@ describe('replicator/change-processor', () => { newInt: 123n, newBool: 1n, newJSON: null, - ['_0_version']: '0e', + ['_0_version']: '00', }, { id: 2n, newInt: 123n, newBool: 1n, newJSON: null, - ['_0_version']: '0e', + ['_0_version']: '00', }, { id: 3n, newInt: 123n, newBool: 1n, newJSON: null, - ['_0_version']: '0e', + ['_0_version']: '00', }, { id: 4n, @@ -1363,7 +1368,8 @@ describe('replicator/change-processor', () => { { schema: 'public', table: 'foo', - metadata: '{"rowKey":{"columns":["id"]}}', + upstreamMetadata: '{"rowKey":{"columns":["id"]}}', + minRowVersion: '0e', }, ], ['_zero.column_metadata']: [ @@ -1446,6 +1452,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: ['newJSON'], + minRowVersion: '0e', }, ], indexSpecs: [], @@ -1467,8 +1474,8 @@ describe('replicator/change-processor', () => { ], data: { foo: [ - {id: 1n, ['_0_version']: '0e'}, - {id: 2n, ['_0_version']: '0e'}, + {id: 1n, ['_0_version']: '00'}, + {id: 2n, ['_0_version']: '00'}, {id: 3n, ['_0_version']: '0e'}, {id: 4n, ['_0_version']: '0e'}, ], @@ -1498,6 +1505,14 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + minRowVersion: '0e', + upstreamMetadata: null, + }, + ], }, tableSpecs: [ { @@ -1521,6 +1536,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [], @@ -1550,8 +1566,8 @@ describe('replicator/change-processor', () => { ], data: { foo: [ - {id: 1n, newName: 'hel', ['_0_version']: '0e'}, - {id: 2n, newName: 'low', ['_0_version']: '0e'}, + {id: 1n, newName: 'hel', ['_0_version']: '00'}, + {id: 2n, newName: 'low', ['_0_version']: '00'}, {id: 3n, newName: 'olrd', ['_0_version']: '0e'}, {id: 4n, newName: 'yay', ['_0_version']: '0e'}, ], @@ -1581,6 +1597,14 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + minRowVersion: '0e', + upstreamMetadata: null, + }, + ], }, tableSpecs: [ { @@ -1612,6 +1636,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [ @@ -1648,8 +1673,8 @@ describe('replicator/change-processor', () => { ], data: { foo: [ - {id: 1n, nolz: 'hel', ['_0_version']: '0e'}, - {id: 2n, nolz: 'low', ['_0_version']: '0e'}, + {id: 1n, nolz: 'hel', ['_0_version']: '00'}, + {id: 2n, nolz: 'low', ['_0_version']: '00'}, {id: 3n, nolz: 'olrd', ['_0_version']: '0e'}, {id: 4n, nolz: 'yay', ['_0_version']: '0e'}, ], @@ -1679,6 +1704,14 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + minRowVersion: '0e', + upstreamMetadata: null, + }, + ], }, tableSpecs: [ { @@ -1710,6 +1743,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [ @@ -1749,8 +1783,8 @@ describe('replicator/change-processor', () => { ], data: { foo: [ - {id: 1n, nolz: 'hel', ['_0_version']: '0e'}, - {id: 2n, nolz: 'low', ['_0_version']: '0e'}, + {id: 1n, nolz: 'hel', ['_0_version']: '00'}, + {id: 2n, nolz: 'low', ['_0_version']: '00'}, {id: 3n, nolz: 'olrd', ['_0_version']: '0e'}, {id: 4n, nolz: 'yay', ['_0_version']: '0e'}, ], @@ -1780,6 +1814,14 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + minRowVersion: '0e', + upstreamMetadata: null, + }, + ], }, tableSpecs: [ { @@ -1811,6 +1853,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [ @@ -1848,8 +1891,8 @@ describe('replicator/change-processor', () => { ], data: { foo: [ - {id: 1n, newName: 'hel', ['_0_version']: '0e'}, - {id: 2n, newName: 'low', ['_0_version']: '0e'}, + {id: 1n, newName: 'hel', ['_0_version']: '00'}, + {id: 2n, newName: 'low', ['_0_version']: '00'}, {id: 3n, newName: 'olrd', ['_0_version']: '0e'}, {id: 4n, newName: 'yay', ['_0_version']: '0e'}, ], @@ -1879,6 +1922,14 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + minRowVersion: '0e', + upstreamMetadata: null, + }, + ], }, tableSpecs: [ { @@ -1910,6 +1961,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [ @@ -1952,8 +2004,8 @@ describe('replicator/change-processor', () => { ], data: { foo: [ - {id: 1n, num: 3n, ['_0_version']: '0e'}, - {id: 2n, num: 2n, ['_0_version']: '0e'}, + {id: 1n, num: 3n, ['_0_version']: '00'}, + {id: 2n, num: 2n, ['_0_version']: '00'}, {id: 3n, num: 1n, ['_0_version']: '0e'}, {id: 4n, num: 23n, ['_0_version']: '0e'}, ], @@ -1983,6 +2035,14 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + minRowVersion: '0e', + upstreamMetadata: null, + }, + ], }, tableSpecs: [ { @@ -2014,6 +2074,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [ @@ -2052,8 +2113,8 @@ describe('replicator/change-processor', () => { ], data: { foo: [ - {id: 1n, num: 3n, ['_0_version']: '0e'}, - {id: 2n, num: 2n, ['_0_version']: '0e'}, + {id: 1n, num: 3n, ['_0_version']: '00'}, + {id: 2n, num: 2n, ['_0_version']: '00'}, {id: 3n, num: 1n, ['_0_version']: '0e'}, {id: 4n, num: 23n, ['_0_version']: '0e'}, ], @@ -2083,6 +2144,14 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + minRowVersion: '0e', + upstreamMetadata: null, + }, + ], }, tableSpecs: [ { @@ -2114,6 +2183,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [ @@ -2162,8 +2232,8 @@ describe('replicator/change-processor', () => { ], data: { foo: [ - {id: 1n, number: 3n, ['_0_version']: '0e'}, - {id: 2n, number: 2n, ['_0_version']: '0e'}, + {id: 1n, number: 3n, ['_0_version']: '00'}, + {id: 2n, number: 2n, ['_0_version']: '00'}, {id: 3n, number: 1n, ['_0_version']: '0e'}, {id: 4n, number: 23n, ['_0_version']: '0e'}, ], @@ -2193,6 +2263,14 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'foo', + minRowVersion: '0e', + upstreamMetadata: null, + }, + ], }, tableSpecs: [ { @@ -2224,6 +2302,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '0e', }, ], indexSpecs: [ @@ -2243,7 +2322,7 @@ describe('replicator/change-processor', () => { INSERT INTO foo(id, _0_version) VALUES (2, '00'); INSERT INTO foo(id, _0_version) VALUES (3, '00'); - INSERT INTO "_zero.tableMetadata" ("schema", "table", "metadata") VALUES + INSERT INTO "_zero.tableMetadata" ("schema", "table", "upstreamMetadata") VALUES ('public', 'foo', '{"rowKey":{"columns":["id"]}}'), ('public', 'bar', '{"rowKey":{"columns":["id"]}}'); `, @@ -2276,7 +2355,8 @@ describe('replicator/change-processor', () => { { schema: 'public', table: 'bar', - metadata: '{"rowKey":{"columns":["id"]}}', + upstreamMetadata: '{"rowKey":{"columns":["id"]}}', + minRowVersion: '00', }, ], }, @@ -2288,7 +2368,7 @@ describe('replicator/change-processor', () => { setup: ` CREATE TABLE foo(id INT8, id2 INT8, _0_version TEXT); - INSERT INTO "_zero.tableMetadata" ("schema", "table", "metadata") VALUES + INSERT INTO "_zero.tableMetadata" ("schema", "table", "upstreamMetadata") VALUES ('public', 'foo', '{"rowKey":{"columns":["id"]}}'), ('public', 'bar', '{"rowKey":{"columns":["id"]}}'); `, @@ -2310,12 +2390,14 @@ describe('replicator/change-processor', () => { { schema: 'public', table: 'foo', - metadata: '{"rowKey":{"type":"index","columns":["id2"]}}', + upstreamMetadata: '{"rowKey":{"type":"index","columns":["id2"]}}', + minRowVersion: '00', }, { schema: 'public', table: 'bar', - metadata: '{"rowKey":{"columns":["id"]}}', + upstreamMetadata: '{"rowKey":{"columns":["id"]}}', + minRowVersion: '00', }, ], }, @@ -2349,6 +2431,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '00', }, ], indexSpecs: [], @@ -2489,6 +2572,15 @@ describe('replicator/change-processor', () => { backfillingColumnVersions: '{}', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'transaction', + upstreamMetadata: + '{"rowKey":{"columns":["not-mocked-for-the-test"]}}', + minRowVersion: '07', + }, + ], }, tableSpecs: [ { @@ -2520,6 +2612,7 @@ describe('replicator/change-processor', () => { }, }, backfilling: [], + minRowVersion: '07', }, ], }, @@ -3067,7 +3160,7 @@ describe('replicator/change-processor', () => { data: { bff: [ { - _0_version: '123.02', + _0_version: '101', a: 1n, b: 2n, c: 3n, @@ -3075,7 +3168,7 @@ describe('replicator/change-processor', () => { e: 701n, }, { - _0_version: '123.02', + _0_version: '123', a: 23n, b: 45n, c: 67n, @@ -3083,7 +3176,7 @@ describe('replicator/change-processor', () => { e: 77n, // 77@123 not overwritten by backfill 4000 }, { - _0_version: '123.02', + _0_version: '123', a: 32n, b: 54n, c: 76n, @@ -3091,21 +3184,21 @@ describe('replicator/change-processor', () => { e: 2000n, // 87@101 not overwritten by backfill 2000 }, { - _0_version: '123.02', - a: 10n, - b: 20n, - c: 30n, - d: 5000n, - e: 6000n, - }, - { - _0_version: '123.02', + _0_version: '123', a: 1000n, b: 2000n, c: 3000n, d: 4n, // 4@123 not overwritten by backfill -1 e: 5n, // 5@123 not overwritten by backfill -2 }, + { + _0_version: '115', + a: 10n, + b: 20n, + c: 30n, + d: 5000n, + e: 6000n, + }, ], ['_zero.changeLog2']: [ { @@ -3169,6 +3262,14 @@ describe('replicator/change-processor', () => { table: 'bff', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'bff', + minRowVersion: '123.02', + upstreamMetadata: '{"rowKey":{"columns":["b","a","c"]}}', + }, + ], }, expectedTablesInBackupReplicatorChangeLog: ['bff'], }, @@ -3272,7 +3373,7 @@ describe('replicator/change-processor', () => { data: { bff: [ { - _0_version: '123.02', + _0_version: '03', a: 1n, b: 2n, c: 3n, @@ -3280,7 +3381,7 @@ describe('replicator/change-processor', () => { e: 5n, }, { - _0_version: '123.02', + _0_version: '123', a: 23n, b: 45n, c: 67n, @@ -3288,7 +3389,7 @@ describe('replicator/change-processor', () => { e: 77n, // 77@123 not overwritten by backfill 4000 }, { - _0_version: '123.02', + _0_version: '123', a: 32n, b: 54n, c: 76n, @@ -3296,21 +3397,21 @@ describe('replicator/change-processor', () => { e: 2000n, // 87@101 not overwritten by backfill 2000 }, { - _0_version: '123.02', - a: 10n, - b: 20n, - c: 30n, - d: 5000n, - e: 6000n, - }, - { - _0_version: '123.02', + _0_version: '123', a: 1000n, b: 2000n, c: 3000n, d: 4n, // 4@123 not overwritten by backfill -1 e: 5n, // 5@123 not overwritten by backfill -2 }, + { + _0_version: '115', + a: 10n, + b: 20n, + c: 30n, + d: 5000n, + e: 6000n, + }, ], ['_zero.changeLog2']: [ { @@ -3362,6 +3463,14 @@ describe('replicator/change-processor', () => { table: 'bff', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'bff', + minRowVersion: '123.02', + upstreamMetadata: '{"rowKey":{"columns":["b","a","c"]}}', + }, + ], }, expectedTablesInBackupReplicatorChangeLog: ['bff'], }, @@ -3436,8 +3545,8 @@ describe('replicator/change-processor', () => { ], data: { bff: [ - {id: 2n, _0_version: '123.01'}, - {id: 83n, _0_version: '123.01'}, + {id: 2n, _0_version: '115'}, + {id: 83n, _0_version: '115'}, ], ['_zero.changeLog2']: [ { @@ -3449,6 +3558,14 @@ describe('replicator/change-processor', () => { table: 'bff', }, ], + ['_zero.tableMetadata']: [ + { + schema: 'public', + table: 'bff', + minRowVersion: '123.01', + upstreamMetadata: '{"rowKey":{"columns":["id"]}}', + }, + ], }, expectedTablesInBackupReplicatorChangeLog: ['bff'], }, diff --git a/packages/zero-cache/src/services/replicator/change-processor.ts b/packages/zero-cache/src/services/replicator/change-processor.ts index 35a9367de1..282e9737a4 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.ts @@ -21,7 +21,6 @@ import { mapPostgresToLiteColumn, mapPostgresToLiteIndex, } from '../../db/pg-to-lite.ts'; -import type {LiteTableSpec} from '../../db/specs.ts'; import type {StatementRunner} from '../../db/statements.ts'; import type {LexiVersion} from '../../types/lexi-version.ts'; import { @@ -40,6 +39,7 @@ import type { ColumnAdd, ColumnDrop, ColumnUpdate, + Identifier, IndexCreate, IndexDrop, MessageBackfill, @@ -94,7 +94,7 @@ export class ChangeProcessor { // The TransactionProcessor lazily loads table specs into this Map, // and reloads them after a schema change. It is cached here to avoid // reading them from the DB on every transaction. - readonly #tableSpecs = new Map(); + readonly #tableSpecs = new Map(); #currentTx: TransactionProcessor | null = null; @@ -548,7 +548,7 @@ class TransactionProcessor { processCreateTable(create: TableCreate) { if (create.metadata) { - this.#tableMetadata.set(create.spec, create.metadata); + this.#tableMetadata.setUpstreamMetadata(create.spec, create.metadata); } const table = mapPostgresToLite(create.spec); this.#db.db.exec(createLiteTableStatement(table)); @@ -578,7 +578,7 @@ class TransactionProcessor { } processTableMetadata(msg: TableUpdateMetadata) { - this.#tableMetadata.set(msg.table, msg.new); + this.#tableMetadata.setUpstreamMetadata(msg.table, msg.new); } processRenameTable(rename: TableRename) { @@ -591,14 +591,14 @@ class TransactionProcessor { // Rename in metadata table this.#columnMetadata.renameTable(oldName, newName); - this.#bumpVersions(newName); + this.#bumpVersions(rename.new); this.#logResetOp(oldName); this.#lc.info?.(rename.tag, oldName, newName); } processAddColumn(msg: ColumnAdd) { if (msg.tableMetadata) { - this.#tableMetadata.set(msg.table, msg.tableMetadata); + this.#tableMetadata.setUpstreamMetadata(msg.table, msg.tableMetadata); } const table = liteTableName(msg.table); const {name} = msg.column; @@ -615,7 +615,7 @@ class TransactionProcessor { } else { // Make the new column visible immediately if it's not being backfilled. // Otherwise, the version bump will happen with the backfill is complete. - this.#bumpVersions(table); + this.#bumpVersions(msg.table); } this.#lc.info?.(msg.tag, table, msg.column); } @@ -680,7 +680,7 @@ class TransactionProcessor { msg.new.spec, ); - this.#bumpVersions(table); + this.#bumpVersions(msg.table); this.#lc.info?.(msg.tag, table, msg.new); } @@ -692,7 +692,7 @@ class TransactionProcessor { // Delete from metadata table this.#columnMetadata.deleteColumn(table, column); - this.#bumpVersions(table); + this.#bumpVersions(msg.table); this.#lc.info?.(msg.tag, table, column); } @@ -735,12 +735,9 @@ class TransactionProcessor { this.#lc.info?.(drop.tag, name); } - #bumpVersions(table: string) { - this.#db.run( - `UPDATE ${id(table)} SET ${id(ZERO_VERSION_COLUMN_NAME)} = ?`, - this.#version, - ); - this.#logResetOp(table); + #bumpVersions(table: Identifier) { + this.#tableMetadata.setMinRowVersion(table, this.#version); + this.#logResetOp(liteTableName(table)); } /** @@ -859,7 +856,7 @@ class TransactionProcessor { } // Given that new columns are being exposed for every row in the table, bump the // row version for all rows. - this.#bumpVersions(tableName); + this.#bumpVersions(relation); if (status) { this.#completedBackfill = {table: tableName, columns: cols, ...status}; } diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index bf0cf75df4..b20b9e0e87 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -650,16 +650,24 @@ describe('replicator/incremental-sync', () => { await orTimeoutWith(next, 5000, new Error('timed-out')), ).not.toBeInstanceOf(Error); - // And row versions should be bumped. + // The row version in the table metadata should be bumped. + expect( + replica.prepare(/*sql*/ `SELECT * FROM "_zero.tableMetadata"`).get(), + ).toMatchObject({ + minRowVersion: '110.02', + schema: 'public', + table: 'issues', + }); + // (The row columns themselves are not updated ... too costly) expect(issuesDump.all()).toEqual([ { - _0_version: '110.02', + _0_version: '100', big: 2, issueID: 1, new_column: 'hello', }, { - _0_version: '110.02', + _0_version: '100', big: 3, issueID: 2, new_column: 'world', diff --git a/packages/zero-cache/src/services/replicator/replication-status.test.ts b/packages/zero-cache/src/services/replicator/replication-status.test.ts index 785d1c1f51..bcce38811a 100644 --- a/packages/zero-cache/src/services/replicator/replication-status.test.ts +++ b/packages/zero-cache/src/services/replicator/replication-status.test.ts @@ -7,6 +7,7 @@ import { replicationStatusEvent, ReplicationStatusPublisher, } from './replication-status.ts'; +import {CREATE_TABLE_METADATA_TABLE} from './schema/table-metadata.ts'; describe('replicator/replication-status', () => { let lc: LogContext; @@ -15,6 +16,7 @@ describe('replicator/replication-status', () => { beforeEach(() => { lc = createSilentLogContext(); replica = new Database(createSilentLogContext(), ':memory:'); + replica.exec(CREATE_TABLE_METADATA_TABLE); }); test('initializing', () => { @@ -67,7 +69,7 @@ describe('replicator/replication-status', () => { "unique": true, }, ], - "replicaSize": 20480, + "replicaSize": 28672, "tables": [ { "columns": [ @@ -158,7 +160,7 @@ describe('replicator/replication-status', () => { "unique": true, }, ], - "replicaSize": 20480, + "replicaSize": 28672, "tables": [ { "columns": [ @@ -232,7 +234,7 @@ describe('replicator/replication-status', () => { "unique": true, }, ], - "replicaSize": 12288, + "replicaSize": 20480, "tables": [ { "columns": [ @@ -332,7 +334,7 @@ describe('replicator/replication-status', () => { }, ], "indexes": [], - "replicaSize": 0, + "replicaSize": 12288, "tables": [], }, "status": "OK", diff --git a/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts b/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts index bda89acadc..7fe7ec0acf 100644 --- a/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts @@ -26,27 +26,70 @@ describe('table-metadata', () => { } test('set, rename, drop', () => { - tracker.set({schema: 'public', name: 'foo'}, {rowKey: {columns: ['id']}}); - tracker.set( + expect(tracker.getMinRowVersions()).toMatchInlineSnapshot(`Map {}`); + + tracker.setUpstreamMetadata( + {schema: 'public', name: 'foo'}, + {rowKey: {columns: ['id']}}, + ); + tracker.setMinRowVersion({schema: 'internal', name: 'bar'}, '123'); + + // Rows are inserted with defaults for the other columns. + expect(dumpTable()).toMatchInlineSnapshot(` + [ + { + "minRowVersion": "123", + "schema": "internal", + "table": "bar", + "upstreamMetadata": null, + }, + { + "minRowVersion": "00", + "schema": "public", + "table": "foo", + "upstreamMetadata": "{"rowKey":{"columns":["id"]}}", + }, + ] + `); + + expect(tracker.getMinRowVersions()).toMatchInlineSnapshot(` + Map { + "foo" => "00", + "internal.bar" => "123", + } + `); + + tracker.setMinRowVersion({schema: 'public', name: 'foo'}, '2b8a'); + tracker.setUpstreamMetadata( {schema: 'internal', name: 'bar'}, {rowKey: {columns: ['a', 'b']}}, ); + // Rows are updated, preserving the other columns. expect(dumpTable()).toMatchInlineSnapshot(` [ { - "metadata": "{"rowKey":{"columns":["a","b"]}}", + "minRowVersion": "123", "schema": "internal", "table": "bar", + "upstreamMetadata": "{"rowKey":{"columns":["a","b"]}}", }, { - "metadata": "{"rowKey":{"columns":["id"]}}", + "minRowVersion": "2b8a", "schema": "public", "table": "foo", + "upstreamMetadata": "{"rowKey":{"columns":["id"]}}", }, ] `); + expect(tracker.getMinRowVersions()).toMatchInlineSnapshot(` + Map { + "foo" => "2b8a", + "internal.bar" => "123", + } + `); + tracker.rename( {schema: 'internal', name: 'bar'}, {schema: 'public', name: 'boo'}, @@ -54,27 +97,43 @@ describe('table-metadata', () => { expect(dumpTable()).toMatchInlineSnapshot(` [ { - "metadata": "{"rowKey":{"columns":["a","b"]}}", + "minRowVersion": "123", "schema": "public", "table": "boo", + "upstreamMetadata": "{"rowKey":{"columns":["a","b"]}}", }, { - "metadata": "{"rowKey":{"columns":["id"]}}", + "minRowVersion": "2b8a", "schema": "public", "table": "foo", + "upstreamMetadata": "{"rowKey":{"columns":["id"]}}", }, ] `); + expect(tracker.getMinRowVersions()).toMatchInlineSnapshot(` + Map { + "foo" => "2b8a", + "boo" => "123", + } + `); + tracker.drop({schema: 'public', name: 'foo'}); expect(dumpTable()).toMatchInlineSnapshot(` [ { - "metadata": "{"rowKey":{"columns":["a","b"]}}", + "minRowVersion": "123", "schema": "public", "table": "boo", + "upstreamMetadata": "{"rowKey":{"columns":["a","b"]}}", }, ] `); + + expect(tracker.getMinRowVersions()).toMatchInlineSnapshot(` + Map { + "boo" => "123", + } + `); }); }); diff --git a/packages/zero-cache/src/services/replicator/schema/table-metadata.ts b/packages/zero-cache/src/services/replicator/schema/table-metadata.ts index f247fa807c..57044e2f53 100644 --- a/packages/zero-cache/src/services/replicator/schema/table-metadata.ts +++ b/packages/zero-cache/src/services/replicator/schema/table-metadata.ts @@ -1,15 +1,32 @@ import type {Database, Statement} from '../../../../../zqlite/src/db.ts'; +import {liteTableName} from '../../../types/names.ts'; import type { Identifier, TableMetadata, } from '../../change-source/protocol/current.ts'; /** - * Replica-level analog of tableMetadata in change-streamer/schema. - * Per the requirement of the backfill protocol, backfill metadata - * must be tracked outside of the change source (otherwise the change - * source would have to be able to compute the state of the metadata at - * arbitrary points in the past). + * Table-level controls for handling replicated data. + * + * ### Columns + * + * `minRowVersion`: the minimum `_0_version` value to apply to + * all rows in the table. This overrides any per-row + * `_0_version` value that is smaller (i.e. earlier). + * The `minRowVersion` column is used to force a re-download + * of all rows after a table-wide schema change (by giving + * each row a version that's newer than what's in any CVR). + * The naive, brute-force method of updating all of the rows + * requires re-writing the entire table into the WAL as one + * SQLite operation, which is too costly from both latency + * and storage space. + * + * `upstreamMetadata`: the replica-level analog of tableMetadata in + * change-streamer/schema. Per the requirement of the backfill + * protocol, backfill metadata must be tracked outside of the + * change source (otherwise the change source would have to be + * able to compute the state of the metadata at arbitrary points + * in the past). * * This tracking is done: * 1. at the Change DB level, by the change-streamer @@ -19,46 +36,72 @@ import type { */ export const CREATE_TABLE_METADATA_TABLE = /*sql*/ ` CREATE TABLE "_zero.tableMetadata" ( - "schema" TEXT NOT NULL, - "table" TEXT NOT NULL, - "metadata" TEXT NOT NULL, + "schema" TEXT NOT NULL, + "table" TEXT NOT NULL, + "minRowVersion" TEXT NOT NULL DEFAULT "00", + "upstreamMetadata" TEXT, PRIMARY KEY ("schema", "table") ); `; export class TableMetadataTracker { - readonly #set: Statement; - readonly #rename: Statement; - readonly #drop: Statement; + readonly #db: Database; + + // All statements are lazily created. + #setUpstreamMetadata: Statement | undefined; + #setMinRowVersion: Statement | undefined; + #getMinRowVersions: Statement | undefined; + #rename: Statement | undefined; + #drop: Statement | undefined; constructor(db: Database) { - this.#set = db.prepare(/*sql*/ ` - INSERT OR REPLACE INTO "_zero.tableMetadata" - ("schema", "table", "metadata") VALUES (?, ?, ?); - `); - this.#rename = db.prepare(/*sql*/ ` - UPDATE "_zero.tableMetadata" SET "schema" = ?, "table" = ? - WHERE "schema" = ? AND "table" = ? - `); - this.#drop = db.prepare(/*sql*/ ` - DELETE FROM "_zero.tableMetadata" WHERE "schema" = ? AND "table" = ? - `); + this.#db = db; } - set({schema, name}: Identifier, metadata: TableMetadata) { - this.#set.run(schema, name, JSON.stringify(metadata)); + setUpstreamMetadata({schema, name}: Identifier, metadata: TableMetadata) { + (this.#setUpstreamMetadata ??= this.#db.prepare(/*sql*/ ` + INSERT INTO "_zero.tableMetadata" ("schema", "table", "upstreamMetadata") + VALUES (@schema, @name, @metadata) + ON CONFLICT ("schema", "table") + DO UPDATE SET "upstreamMetadata" = @metadata + `)).run({ + schema, + name, + metadata: JSON.stringify(metadata), + }); } - rename(oldTable: Identifier, newTable: Identifier) { - this.#rename.run( - newTable.schema, - newTable.name, - oldTable.schema, - oldTable.name, + setMinRowVersion({schema, name}: Identifier, version: string) { + (this.#setMinRowVersion ??= this.#db.prepare(/*sql*/ ` + INSERT INTO "_zero.tableMetadata" ("schema", "table", "minRowVersion") + VALUES (@schema, @name, @version) + ON CONFLICT ("schema", "table") + DO UPDATE SET "minRowVersion" = @version; + `)).run({schema, name, version}); + } + + getMinRowVersions(): Map { + const results = (this.#getMinRowVersions ??= this.#db.prepare(/*sql*/ ` + SELECT "schema", "table" as "name", "minRowVersion" FROM "_zero.tableMetadata" + `)).all<{schema: string; name: string; minRowVersion: string}>(); + return new Map( + results.map(({schema, name, minRowVersion}) => [ + liteTableName({schema, name}), + minRowVersion, + ]), ); } + rename(oldTable: Identifier, newTable: Identifier) { + (this.#rename ??= this.#db.prepare(/*sql*/ ` + UPDATE "_zero.tableMetadata" SET "schema" = ?, "table" = ? + WHERE "schema" = ? AND "table" = ? + `)).run(newTable.schema, newTable.name, oldTable.schema, oldTable.name); + } + drop({schema, name}: Identifier) { - this.#drop.run(schema, name); + (this.#drop ??= this.#db.prepare(/*sql*/ ` + DELETE FROM "_zero.tableMetadata" WHERE "schema" = ? AND "table" = ? + `)).run(schema, name); } } diff --git a/packages/zero-cache/src/services/run-ast.ts b/packages/zero-cache/src/services/run-ast.ts index 890b5659fc..e25f7e6ae5 100644 --- a/packages/zero-cache/src/services/run-ast.ts +++ b/packages/zero-cache/src/services/run-ast.ts @@ -26,6 +26,7 @@ import type {Database} from '../../../zqlite/src/db.ts'; import {resolveSimpleScalarSubqueries} from '../../../zqlite/src/resolve-scalar-subqueries.ts'; import type {JWTAuth} from '../auth/auth.ts'; import {transformAndHashQuery} from '../auth/read-authorizer.ts'; +import {computeZqlSpecs} from '../db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../db/specs.ts'; import {hydrate} from './view-syncer/pipeline-driver.ts'; @@ -51,7 +52,7 @@ export async function runAst( options: RunAstOptions, yieldProcess: () => Promise, ): Promise { - const {clientToServerMapper, permissions, host} = options; + const {clientToServerMapper, permissions, host, db} = options; const result: AnalyzeQueryResult = { warnings: [], syncedRows: undefined, @@ -131,6 +132,7 @@ export async function runAst( pipeline, hashOfAST(resolvedAst), clientSchema, + computeZqlSpecs(lc, db, {includeBackfillingColumns: false}), )) { if (rowChange === 'yield') { await yieldProcess(); diff --git a/packages/zero-cache/src/services/view-syncer/client-schema.test.ts b/packages/zero-cache/src/services/view-syncer/client-schema.test.ts index ab0b395742..c2862a4cfe 100644 --- a/packages/zero-cache/src/services/view-syncer/client-schema.test.ts +++ b/packages/zero-cache/src/services/view-syncer/client-schema.test.ts @@ -8,6 +8,7 @@ import {Database} from '../../../../zqlite/src/db.ts'; import {computeZqlSpecs} from '../../db/lite-tables.ts'; import type {LiteAndZqlSpec, LiteTableSpec} from '../../db/specs.ts'; import type {ShardID} from '../../types/shards.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../replicator/schema/table-metadata.ts'; import {checkClientSchema} from './client-schema.ts'; describe('client schemas', () => { @@ -19,6 +20,7 @@ describe('client schemas', () => { beforeAll(() => { const lc = createSilentLogContext(); const db = new Database(lc, ':memory:'); + db.exec(CREATE_TABLE_METADATA_TABLE); db.exec(/* sql */ ` CREATE TABLE foo( id "text|NOT_NULL", diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts index b297e644cb..508c14bb7a 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts @@ -947,12 +947,30 @@ describe('view-syncer/pipeline-driver', () => { messages.addColumn('issues', 'newColumn', {dataType: 'TEXT', pos: 0}), ); + // Update one of the rows after the schema change. + replicator.processTransaction('135', messages.update('issues', {id: '2'})); + pipelines.advanceWithoutDiff(); pipelines.reset(clientSchema); expect(pipelines.queries()).toEqual(new Map()); - // The newColumn should be reflected after a reset. + // Under the hood, the row versions are the same but the minRowVersion is + // bumped in the tableMetadata. + expect( + db.prepare(`SELECT id, _0_version FROM issues ORDER BY id`).all(), + ).toMatchObject([ + {id: '1', _0_version: '123'}, + {id: '2', _0_version: '135'}, + {id: '3', _0_version: '123'}, + ]); + + expect( + db.prepare(`SELECT minRowVersion FROM "_zero.tableMetadata"`).get(), + ).toMatchObject({minRowVersion: '134'}); + + // The newColumn should be reflected after a reset, with the bumped + // minRowVersion for older rows. expect([ ...pipelines.addQuery( 'hash1', @@ -979,7 +997,7 @@ describe('view-syncer/pipeline-driver', () => { { "queryID": "queryID1", "row": { - "_0_version": "134", + "_0_version": "135", "closed": true, "id": "2", "newColumn": null, diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index c447edb044..396920c99e 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -48,7 +48,10 @@ import { import type {InspectorDelegate} from '../../server/inspector-delegate.ts'; import {type RowKey} from '../../types/row-key.ts'; import {upstreamSchema, type ShardID} from '../../types/shards.ts'; -import {getSubscriptionState} from '../replicator/schema/replication-state.ts'; +import { + getSubscriptionState, + ZERO_VERSION_COLUMN_NAME, +} from '../replicator/schema/replication-state.ts'; import {checkClientSchema} from './client-schema.ts'; import type {Snapshotter} from './snapshotter.ts'; import {ResetPipelinesSignal, type SnapshotDiff} from './snapshotter.ts'; @@ -463,7 +466,12 @@ export class PipelineDriver { }, }); - yield* hydrateInternal(input, queryID, must(this.#primaryKeys)); + yield* hydrateInternal( + input, + queryID, + must(this.#primaryKeys), + this.#tableSpecs, + ); for (const {table, row} of companionRows) { const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table); @@ -805,7 +813,7 @@ export class PipelineDriver { #startAccumulating() { assert(this.#streamer === null, 'Streamer already started'); - this.#streamer = new Streamer(must(this.#primaryKeys)); + this.#streamer = new Streamer(must(this.#primaryKeys), this.#tableSpecs); } #stopAccumulating(): Streamer { @@ -818,9 +826,14 @@ export class PipelineDriver { class Streamer { readonly #primaryKeys: Map; + readonly #tableSpecs: Map; - constructor(primaryKeys: Map) { + constructor( + primaryKeys: Map, + tableSpecs: Map, + ) { this.#primaryKeys = primaryKeys; + this.#tableSpecs = tableSpecs; } readonly #changes: [ @@ -897,6 +910,7 @@ class Streamer { const {tableName: table, system} = schema; const primaryKey = must(this.#primaryKeys.get(table)); + const spec = must(this.#tableSpecs.get(table)).tableSpec; // We do not sync rows gathered by the permissions // system to the client. @@ -909,8 +923,18 @@ class Streamer { yield node; continue; } - const {relationships, row} = node; + const {relationships} = node; + let {row} = node; const rowKey = getRowKey(primaryKey, row); + if (op !== 'remove') { + const rowVersion = row[ZERO_VERSION_COLUMN_NAME]; + if ( + typeof rowVersion === 'string' && + rowVersion < (spec.minRowVersion ?? '00') + ) { + row = {...row, [ZERO_VERSION_COLUMN_NAME]: spec.minRowVersion}; + } + } yield { type: op, @@ -951,13 +975,13 @@ export function* hydrate( input: Input, hash: string, clientSchema: ClientSchema, + tableSpecs: Map, ): Iterable { const res = input.fetch({}); - const streamer = new Streamer(buildPrimaryKeys(clientSchema)).accumulate( - hash, - input.getSchema(), - toAdds(res), - ); + const streamer = new Streamer( + buildPrimaryKeys(clientSchema), + tableSpecs, + ).accumulate(hash, input.getSchema(), toAdds(res)); yield* streamer.stream(); } @@ -965,9 +989,10 @@ export function* hydrateInternal( input: Input, hash: string, primaryKeys: Map, + tableSpecs: Map, ): Iterable { const res = input.fetch({}); - const streamer = new Streamer(primaryKeys).accumulate( + const streamer = new Streamer(primaryKeys, tableSpecs).accumulate( hash, input.getSchema(), toAdds(res), diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.ts index eb72ceb4be..86067d10d8 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.ts @@ -6,7 +6,10 @@ import type {Row} from '../../../../zero-protocol/src/data.ts'; import type {PrimaryKey} from '../../../../zero-types/src/schema.ts'; import {Database} from '../../../../zqlite/src/db.ts'; import {fromSQLiteTypes} from '../../../../zqlite/src/table-source.ts'; -import type {LiteAndZqlSpec, LiteTableSpecWithKeys} from '../../db/specs.ts'; +import type { + LiteAndZqlSpec, + LiteTableSpecWithKeysAndVersion, +} from '../../db/specs.ts'; import {StatementRunner} from '../../db/statements.ts'; import { normalizedKeyOrder, @@ -324,7 +327,7 @@ class Snapshot { }; } - getRow(table: LiteTableSpecWithKeys, rowKey: JSONValue) { + getRow(table: LiteTableSpecWithKeysAndVersion, rowKey: JSONValue) { const key = normalizedKeyOrder(rowKey as RowKey); const conds = Object.keys(key).map(c => `${id(c)}=?`); const cols = Object.keys(table.columns); @@ -342,7 +345,11 @@ class Snapshot { } } - getRows(table: LiteTableSpecWithKeys, keys: PrimaryKey[], row: RowValue) { + getRows( + table: LiteTableSpecWithKeysAndVersion, + keys: PrimaryKey[], + row: RowValue, + ) { // Filter out keys where any column is NULL. This is both correct and // critical for performance: // 1. Correctness: NULL values can't violate uniqueness (NULL != NULL in SQL) @@ -446,6 +453,20 @@ class Diff implements SnapshotDiff { } const {tableSpec, zqlSpec} = specs; + // Sanity check: All change log ops should have a stateVersion + // greater than minRowVersion in the table metadata. This is a + // mini-proof that the overlay does not need to be applied to + // rows produced in incremental catchup, based on the invariant in + // change-processor's #bumpVersions(), whereby the setting of the + // minRowVersion is always followed by a RESET OP, meaning that + // subsequent change-log traversal happens at a later version. + assert( + (tableSpec.minRowVersion ?? '') < stateVersion, + () => + `unexpected change @${stateVersion} for table ${table} with ` + + `minRowVersion ${tableSpec.minRowVersion}: ${op}(${rowKey})`, + ); + assert(rowKey !== null, 'rowKey must be present for row changes'); const nextValue = op === SET_OP ? this.curr.getRow(tableSpec, rowKey) : null; diff --git a/packages/zero-cache/src/workers/syncer.test.ts b/packages/zero-cache/src/workers/syncer.test.ts index 36ca62ed06..08389a281a 100644 --- a/packages/zero-cache/src/workers/syncer.test.ts +++ b/packages/zero-cache/src/workers/syncer.test.ts @@ -49,6 +49,7 @@ import { } from '../server/anonymous-otel-start.ts'; import {MutagenService} from '../services/mutagen/mutagen.ts'; import {PusherService} from '../services/mutagen/pusher.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../services/replicator/schema/table-metadata.ts'; import type {ActivityBasedService} from '../services/service.ts'; import type {ViewSyncer} from '../services/view-syncer/view-syncer.ts'; import type {WebSocketReceiver} from '../types/websocket-handoff.ts'; @@ -65,6 +66,7 @@ sqlite.exec(` CREATE TABLE "test-app.permissions" (permissions, hash); INSERT INTO "test-app.permissions" (permissions, hash) VALUES (null, 'test-hash'); `); +sqlite.exec(CREATE_TABLE_METADATA_TABLE); // ------------------------------ // Test helpers @@ -82,6 +84,7 @@ function makeFactories( ) { const storageDb = new Database(lc, ':memory:'); storageDb.prepare(CREATE_STORAGE_TABLE).run(); + storageDb.exec(CREATE_TABLE_METADATA_TABLE); const writeAuthzStorage = new DatabaseStorage(storageDb); return { diff --git a/packages/zql-integration-tests/src/helpers/planner-exec.ts b/packages/zql-integration-tests/src/helpers/planner-exec.ts index a3f20e82a0..63b8785bff 100644 --- a/packages/zql-integration-tests/src/helpers/planner-exec.ts +++ b/packages/zql-integration-tests/src/helpers/planner-exec.ts @@ -570,6 +570,9 @@ export async function createPlannerInfrastructure(config: { pipeline, hashOfAST(astWithFlips), clientSchemaFrom(schema).clientSchema, + computeZqlSpecs(createSilentLogContext(), dbs.sqlite, { + includeBackfillingColumns: false, + }), )) { // Consume rows to execute the query } diff --git a/packages/zqlite/src/sqlite-cost-model.test.ts b/packages/zqlite/src/sqlite-cost-model.test.ts index 571fcad883..42c1e85b36 100644 --- a/packages/zqlite/src/sqlite-cost-model.test.ts +++ b/packages/zqlite/src/sqlite-cost-model.test.ts @@ -2,6 +2,7 @@ import {beforeEach, describe, expect, test} from 'vitest'; import {createSilentLogContext} from '../../shared/src/logging-test-utils.ts'; import {computeZqlSpecs} from '../../zero-cache/src/db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../../zero-cache/src/db/specs.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../../zero-cache/src/services/replicator/schema/table-metadata.ts'; import {Database} from './db.ts'; import {btreeCost, createSQLiteCostModel} from './sqlite-cost-model.ts'; @@ -20,6 +21,7 @@ describe('SQLite cost model', () => { CREATE TABLE foo (a INTEGER PRIMARY KEY, b INTEGER, c INTEGER); CREATE UNIQUE INDEX foo_a_unique ON foo(a); `); + db.exec(CREATE_TABLE_METADATA_TABLE); // Insert 2,000 rows const stmt = db.prepare('INSERT INTO foo (a, b, c) VALUES (?, ?, ?)'); @@ -244,6 +246,7 @@ describe('SQLite cost model with skewed data (STAT4 verification)', () => { CREATE UNIQUE INDEX skewed_id_unique ON skewed(id); CREATE INDEX idx_skewed_value ON skewed(value); `); + db.exec(CREATE_TABLE_METADATA_TABLE); // Insert SKEWED data: // - 1900 rows with value=1 (common) From 45746b7fc1b89644f54ecc63dfec80aed8a232bd Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 11 Mar 2026 09:11:42 -0700 Subject: [PATCH 139/495] chore(zero-cache): restore `metadata` column for back-compat (#5651) Restore the `_zero.tableMetadata` "metadata" column that was renamed and removed in https://github.com/rocicorp/mono/pull/5650. It is still needed for backwards compatibility. The new migration handles the case of a rollback and rollforward. --- .../common/replica-schema.test.ts | 104 +++++++++++++++--- .../change-source/common/replica-schema.ts | 25 +++++ .../change-source/pg/sync-schema.pg.test.ts | 7 +- .../replicator/change-processor.test.ts | 18 +++ .../replicator/schema/table-metadata.test.ts | 7 ++ .../replicator/schema/table-metadata.ts | 4 + 6 files changed, 148 insertions(+), 17 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts index 6ba4750103..a0107888fb 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts @@ -7,17 +7,18 @@ import { initDB as initLiteDB, } from '../../../test/lite.ts'; import {initReplicationState} from '../../replicator/schema/replication-state.ts'; +import {CREATE_TABLE_METADATA_TABLE} from '../../replicator/schema/table-metadata.ts'; import { CREATE_V6_COLUMN_METADATA_TABLE, CREATE_V7_CHANGE_LOG, CREATE_V9_TABLE_METADATA_TABLE, + CURRENT_SCHEMA_VERSION, initReplica, } from './replica-schema.ts'; -// Update as necessary. export const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 11, - schemaVersion: 11, + dataVersion: CURRENT_SCHEMA_VERSION, + schemaVersion: CURRENT_SCHEMA_VERSION, minSafeVersion: 1, lock: 1, // Internal column, always 1 }; @@ -39,9 +40,20 @@ const CREATE_V1_REPLICATION_CONFIG_TABLE = /*sql*/ ` ); `; +const CREATE_V11_TABLE_METADATA_TABLE = /*sql*/ ` + CREATE TABLE "_zero.tableMetadata" ( + "schema" TEXT NOT NULL, + "table" TEXT NOT NULL, + "minRowVersion" TEXT NOT NULL DEFAULT "00", + "upstreamMetadata" TEXT, + PRIMARY KEY ("schema", "table") + ); +`; + describe('replica-schema-migrations', () => { type Case = { - fromVersion: number; + fromSchemaVersion: number; + fromDataVersion?: number; desc: string; replicaSetup?: string; replicaPreState?: Record; @@ -50,7 +62,7 @@ describe('replica-schema-migrations', () => { const cases: Case[] = [ { - fromVersion: 0, + fromSchemaVersion: 0, desc: 'start from scratch', replicaPostState: { ['_zero.replicationConfig']: [ @@ -63,7 +75,7 @@ describe('replica-schema-migrations', () => { }, }, { - fromVersion: 6, + fromSchemaVersion: 6, desc: 're-populate column metadata', replicaSetup: ` @@ -137,7 +149,7 @@ describe('replica-schema-migrations', () => { }, }, { - fromVersion: 7, + fromSchemaVersion: 7, desc: 'create column metadata', replicaSetup: ` @@ -183,7 +195,7 @@ describe('replica-schema-migrations', () => { }, }, { - fromVersion: 8, + fromSchemaVersion: 8, desc: 'add backfill metadata', replicaSetup: ` @@ -279,8 +291,8 @@ describe('replica-schema-migrations', () => { }, }, { - fromVersion: 9, - desc: 'add table metadata', + fromSchemaVersion: 9, + desc: 'add minRowVersion', replicaSetup: ` CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); @@ -305,6 +317,72 @@ describe('replica-schema-migrations', () => { table: 'bar', minRowVersion: '00', upstreamMetadata: '{"foo":"bar"}', + metadata: null, + }, + ], + }, + }, + { + fromSchemaVersion: 11, + desc: 'restore deprecated metadata column', + replicaSetup: + ` + CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); + ` + + CREATE_V1_REPLICATION_CONFIG_TABLE + + CREATE_V6_COLUMN_METADATA_TABLE + + CREATE_V7_CHANGE_LOG + + CREATE_V11_TABLE_METADATA_TABLE, + replicaPreState: { + ['_zero.tableMetadata']: [ + { + schema: 'foo', + table: 'bar', + upstreamMetadata: '{"foo":"bar"}', + }, + ], + }, + replicaPostState: { + ['_zero.tableMetadata']: [ + { + schema: 'foo', + table: 'bar', + minRowVersion: '00', + upstreamMetadata: '{"foo":"bar"}', + metadata: null, + }, + ], + }, + }, + { + fromSchemaVersion: 12, + fromDataVersion: 9, + desc: 'migrate metadata from rollback/rollforward', + replicaSetup: + ` + CREATE TABLE users("userID" "INTEGER|NOT_NULL", password TEXT, handle TEXT); + ` + + CREATE_V1_REPLICATION_CONFIG_TABLE + + CREATE_V6_COLUMN_METADATA_TABLE + + CREATE_V7_CHANGE_LOG + + CREATE_TABLE_METADATA_TABLE, + replicaPreState: { + ['_zero.tableMetadata']: [ + { + schema: 'foo', + table: 'bar', + metadata: '{"foo":"bar"}', + }, + ], + }, + replicaPostState: { + ['_zero.tableMetadata']: [ + { + schema: 'foo', + table: 'bar', + minRowVersion: '00', + upstreamMetadata: '{"foo":"bar"}', + metadata: null, }, ], }, @@ -321,13 +399,13 @@ describe('replica-schema-migrations', () => { const lc = createSilentLogContext(); for (const c of cases) { - test(`from v${c.fromVersion}: ${c.desc}`, async () => { + test(`from v${c.fromSchemaVersion}: ${c.desc}`, async () => { const replica = replicaFile.connect(lc); initLiteDB(replica, (c.replicaSetup ?? '') + CREATE_VERSION_HISTORY, { ['_zero.versionHistory']: [ { - dataVersion: c.fromVersion, - schemaVersion: c.fromVersion, + schemaVersion: c.fromSchemaVersion, + dataVersion: c.fromDataVersion ?? c.fromSchemaVersion, minSafeVersion: 1, }, ], diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.ts index 2bcdd9dc7b..c2c4d158e3 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.ts @@ -188,4 +188,29 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { `); }, }, + + 12: { + migrateSchema: (_, db) => { + // Bring back the "metadata" column removed in v11, but as a NULL-able column. + // It is needed for backwards compatibility. + db.exec(/*sql*/ ` + ALTER TABLE "_zero.tableMetadata" + ADD COLUMN "metadata" TEXT; + `); + }, + + migrateData: (_, db) => { + // For rollback then roll forward, re-copy anything written to metadata. + db.exec(/*sql*/ ` + UPDATE "_zero.tableMetadata" + SET "upstreamMetadata" = COALESCE("metadata", "upstreamMetadata"), + "metadata" = NULL; + `); + }, + }, }; + +// Referenced in tests. +export const CURRENT_SCHEMA_VERSION = Object.keys( + schemaVersionMigrationMap, +).reduce((prev, curr) => Math.max(prev, parseInt(curr)), 0); diff --git a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts index 5fabb5d441..da1fa321e0 100644 --- a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts @@ -14,17 +14,16 @@ import { initDB as initLiteDB, } from '../../../test/lite.ts'; import type {PostgresDB} from '../../../types/pg.ts'; -import {initReplica} from '../common/replica-schema.ts'; +import {CURRENT_SCHEMA_VERSION, initReplica} from '../common/replica-schema.ts'; import {initialSync} from './initial-sync.ts'; import {replicationSlotExpression} from './schema/shard.ts'; const APP_ID = 'zeroz'; const SHARD_NUM = 9; -// Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 11, - schemaVersion: 11, + dataVersion: CURRENT_SCHEMA_VERSION, + schemaVersion: CURRENT_SCHEMA_VERSION, minSafeVersion: 1, lock: 1, // Internal column, always 1 }; diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index 861e1567e5..1ddab2eca5 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -1088,6 +1088,7 @@ describe('replicator/change-processor', () => { upstreamMetadata: '{"rowKey":{"type":"index","columns":["id","serial"]}}', minRowVersion: '00', + metadata: null, }, ], ['_zero.column_metadata']: [ @@ -1233,6 +1234,7 @@ describe('replicator/change-processor', () => { table: 'bar', upstreamMetadata: '{"rowKey":{"columns":["id"]}}', minRowVersion: '0e', + metadata: null, }, ], }, @@ -1370,6 +1372,7 @@ describe('replicator/change-processor', () => { table: 'foo', upstreamMetadata: '{"rowKey":{"columns":["id"]}}', minRowVersion: '0e', + metadata: null, }, ], ['_zero.column_metadata']: [ @@ -1510,6 +1513,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'foo', minRowVersion: '0e', + metadata: null, upstreamMetadata: null, }, ], @@ -1602,6 +1606,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'foo', minRowVersion: '0e', + metadata: null, upstreamMetadata: null, }, ], @@ -1709,6 +1714,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'foo', minRowVersion: '0e', + metadata: null, upstreamMetadata: null, }, ], @@ -1819,6 +1825,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'foo', minRowVersion: '0e', + metadata: null, upstreamMetadata: null, }, ], @@ -1927,6 +1934,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'foo', minRowVersion: '0e', + metadata: null, upstreamMetadata: null, }, ], @@ -2040,6 +2048,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'foo', minRowVersion: '0e', + metadata: null, upstreamMetadata: null, }, ], @@ -2149,6 +2158,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'foo', minRowVersion: '0e', + metadata: null, upstreamMetadata: null, }, ], @@ -2268,6 +2278,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'foo', minRowVersion: '0e', + metadata: null, upstreamMetadata: null, }, ], @@ -2356,6 +2367,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'bar', upstreamMetadata: '{"rowKey":{"columns":["id"]}}', + metadata: null, minRowVersion: '00', }, ], @@ -2392,12 +2404,14 @@ describe('replicator/change-processor', () => { table: 'foo', upstreamMetadata: '{"rowKey":{"type":"index","columns":["id2"]}}', minRowVersion: '00', + metadata: null, }, { schema: 'public', table: 'bar', upstreamMetadata: '{"rowKey":{"columns":["id"]}}', minRowVersion: '00', + metadata: null, }, ], }, @@ -2579,6 +2593,7 @@ describe('replicator/change-processor', () => { upstreamMetadata: '{"rowKey":{"columns":["not-mocked-for-the-test"]}}', minRowVersion: '07', + metadata: null, }, ], }, @@ -3267,6 +3282,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'bff', minRowVersion: '123.02', + metadata: null, upstreamMetadata: '{"rowKey":{"columns":["b","a","c"]}}', }, ], @@ -3468,6 +3484,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'bff', minRowVersion: '123.02', + metadata: null, upstreamMetadata: '{"rowKey":{"columns":["b","a","c"]}}', }, ], @@ -3563,6 +3580,7 @@ describe('replicator/change-processor', () => { schema: 'public', table: 'bff', minRowVersion: '123.01', + metadata: null, upstreamMetadata: '{"rowKey":{"columns":["id"]}}', }, ], diff --git a/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts b/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts index 7fe7ec0acf..f1842b209e 100644 --- a/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/table-metadata.test.ts @@ -38,12 +38,14 @@ describe('table-metadata', () => { expect(dumpTable()).toMatchInlineSnapshot(` [ { + "metadata": null, "minRowVersion": "123", "schema": "internal", "table": "bar", "upstreamMetadata": null, }, { + "metadata": null, "minRowVersion": "00", "schema": "public", "table": "foo", @@ -69,12 +71,14 @@ describe('table-metadata', () => { expect(dumpTable()).toMatchInlineSnapshot(` [ { + "metadata": null, "minRowVersion": "123", "schema": "internal", "table": "bar", "upstreamMetadata": "{"rowKey":{"columns":["a","b"]}}", }, { + "metadata": null, "minRowVersion": "2b8a", "schema": "public", "table": "foo", @@ -97,12 +101,14 @@ describe('table-metadata', () => { expect(dumpTable()).toMatchInlineSnapshot(` [ { + "metadata": null, "minRowVersion": "123", "schema": "public", "table": "boo", "upstreamMetadata": "{"rowKey":{"columns":["a","b"]}}", }, { + "metadata": null, "minRowVersion": "2b8a", "schema": "public", "table": "foo", @@ -122,6 +128,7 @@ describe('table-metadata', () => { expect(dumpTable()).toMatchInlineSnapshot(` [ { + "metadata": null, "minRowVersion": "123", "schema": "public", "table": "boo", diff --git a/packages/zero-cache/src/services/replicator/schema/table-metadata.ts b/packages/zero-cache/src/services/replicator/schema/table-metadata.ts index 57044e2f53..81aecc2f58 100644 --- a/packages/zero-cache/src/services/replicator/schema/table-metadata.ts +++ b/packages/zero-cache/src/services/replicator/schema/table-metadata.ts @@ -28,6 +28,9 @@ import type { * able to compute the state of the metadata at arbitrary points * in the past). * + * `metadata`: the previous name of the `upstreamMetadata` column, + * kept for backwards compatibility. + * * This tracking is done: * 1. at the Change DB level, by the change-streamer * 2. at the replica level, in order to support the eventual configuration @@ -40,6 +43,7 @@ export const CREATE_TABLE_METADATA_TABLE = /*sql*/ ` "table" TEXT NOT NULL, "minRowVersion" TEXT NOT NULL DEFAULT "00", "upstreamMetadata" TEXT, + "metadata" TEXT, -- deprecated PRIMARY KEY ("schema", "table") ); `; From 046359b568eda147bee32bf98fa0bee1aa5420d8 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Thu, 12 Mar 2026 23:58:55 -1000 Subject: [PATCH 140/495] bump zero to 0.26.2 --- apps/zbugs/package.json | 4 +- package-lock.json | 1623 ++++++++++++------------------------ packages/zero/package.json | 2 +- 3 files changed, 520 insertions(+), 1109 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index f773d8bd5c..c51a3df7c9 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -44,7 +44,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.1", + "@rocicorp/zero": "0.26.2", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", @@ -97,4 +97,4 @@ "vite-tsconfig-paths": "^5.1.4", "vitest": "4.0.15" } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b0e21d5383..4e98f709b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.1", + "@rocicorp/zero": "0.26.2", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", @@ -150,6 +150,48 @@ "pg-types": "^2.2.0" } }, + "apps/zbugs/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "apps/zbugs/node_modules/chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", + "license": "MIT", + "dependencies": { + "chalk": "^5.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "apps/zbugs/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "apps/zbugs/node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -207,6 +249,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -214,6 +257,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "apps/zbugs/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "apps/zbugs/node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -234,6 +290,7 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -393,6 +450,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -495,7 +553,6 @@ "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -711,6 +768,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -1774,6 +1832,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2127,7 +2186,6 @@ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -2144,7 +2202,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2158,7 +2215,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2174,7 +2230,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2184,8 +2239,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -2193,7 +2247,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -2204,7 +2257,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -2215,7 +2267,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2323,7 +2374,6 @@ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2342,7 +2392,6 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2371,7 +2420,6 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2385,7 +2433,6 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2399,7 +2446,6 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2413,7 +2459,6 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2430,7 +2475,6 @@ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2459,7 +2503,6 @@ "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2476,7 +2519,6 @@ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2523,7 +2565,6 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2537,7 +2578,6 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2566,7 +2606,6 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2580,7 +2619,6 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2594,7 +2632,6 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2608,7 +2645,6 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2622,7 +2658,6 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2636,7 +2671,6 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2650,7 +2684,6 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2667,7 +2700,6 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2986,7 +3018,6 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -3914,7 +3945,6 @@ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -4141,6 +4171,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -4163,6 +4194,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -6679,6 +6711,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6894,6 +6927,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7406,6 +7440,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7507,7 +7542,8 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.6", @@ -8421,7 +8457,6 @@ "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -8433,7 +8468,6 @@ "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -8456,7 +8490,6 @@ "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -8480,7 +8513,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8499,7 +8531,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -8510,7 +8541,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8527,7 +8557,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8544,8 +8573,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/config/node_modules/@babel/code-frame": { "version": "7.10.4", @@ -8553,7 +8581,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8564,7 +8591,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8583,7 +8609,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -8594,7 +8619,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8611,7 +8635,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8629,7 +8652,6 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8641,7 +8663,6 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8652,7 +8673,6 @@ "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8667,7 +8687,6 @@ "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -8690,8 +8709,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/fingerprint/node_modules/brace-expansion": { "version": "2.0.2", @@ -8699,7 +8717,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8710,7 +8727,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8727,7 +8743,6 @@ "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8747,7 +8762,6 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8758,7 +8772,6 @@ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -8772,7 +8785,6 @@ "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -8784,7 +8796,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8795,7 +8806,6 @@ "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -8816,7 +8826,6 @@ "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -8838,7 +8847,6 @@ "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -8853,7 +8861,6 @@ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -8869,7 +8876,6 @@ "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -8881,16 +8887,14 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8898,7 +8902,6 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8911,16 +8914,14 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/xcpretty": { "version": "4.3.2", @@ -8928,7 +8929,6 @@ "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -8945,7 +8945,6 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8956,7 +8955,6 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8974,7 +8972,6 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8991,7 +8988,6 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9642,7 +9638,6 @@ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -9656,7 +9651,6 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -9667,7 +9661,6 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9685,7 +9678,6 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -9696,7 +9688,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9707,7 +9698,6 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9722,7 +9712,6 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9737,7 +9726,6 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9751,7 +9739,6 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9768,7 +9755,6 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9781,7 +9767,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -9792,7 +9777,6 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9806,7 +9790,6 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9823,7 +9806,6 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9854,7 +9836,6 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9882,7 +9863,6 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10211,6 +10191,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10333,6 +10314,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10566,6 +10548,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -10662,6 +10645,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12801,6 +12785,7 @@ "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.2.0" }, @@ -13188,7 +13173,6 @@ "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13199,7 +13183,6 @@ "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -13214,7 +13197,6 @@ "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -13275,7 +13257,6 @@ "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -13299,7 +13280,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13321,7 +13301,6 @@ "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -13353,7 +13332,6 @@ "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13364,7 +13342,6 @@ "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -13389,7 +13366,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13407,7 +13383,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13418,7 +13393,6 @@ "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13429,7 +13403,6 @@ "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -13444,7 +13417,6 @@ "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -13468,7 +13440,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13486,7 +13457,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13497,7 +13467,6 @@ "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13508,7 +13477,6 @@ "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13518,8 +13486,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-stately/utils": { "version": "3.10.4", @@ -13926,6 +13893,7 @@ "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -14148,7 +14116,6 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -14159,7 +14126,6 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -15156,6 +15122,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15289,6 +15256,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.19" }, @@ -15306,6 +15274,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -15407,6 +15376,7 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15806,7 +15776,6 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*" } @@ -15947,6 +15916,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15980,6 +15950,7 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -16037,6 +16008,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -16187,8 +16159,7 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -16260,7 +16231,6 @@ "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -16272,7 +16242,6 @@ "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -16552,6 +16521,7 @@ "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -16575,6 +16545,7 @@ "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -16930,7 +16901,6 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -17051,6 +17021,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -17136,6 +17107,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17197,6 +17169,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -17238,8 +17211,7 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", @@ -17532,8 +17504,7 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", @@ -17636,8 +17607,7 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/async-listen": { "version": "3.0.0", @@ -17779,7 +17749,6 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -17828,7 +17797,6 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -17847,7 +17815,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17869,7 +17836,6 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17885,7 +17851,6 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -17988,7 +17953,6 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -17998,8 +17962,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.29.1", @@ -18007,7 +17970,6 @@ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.29.1" } @@ -18018,7 +17980,6 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -18029,7 +17990,6 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -18057,7 +18017,6 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -18289,7 +18248,6 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -18303,7 +18261,6 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -18570,7 +18527,6 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -18581,7 +18537,6 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -18640,6 +18595,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -18660,7 +18616,6 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -18838,7 +18793,6 @@ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -18852,7 +18806,6 @@ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -18863,7 +18816,6 @@ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -19116,7 +19068,6 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19145,7 +19096,6 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19244,7 +19194,6 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -19257,7 +19206,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "peer": true, "engines": { "node": ">=6" }, @@ -19303,7 +19251,6 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -20564,6 +20511,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -20803,7 +20751,6 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -21227,7 +21174,6 @@ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "dotenv": "^16.4.5" }, @@ -21606,7 +21552,6 @@ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -21625,7 +21570,6 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -21704,6 +21648,7 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22403,8 +22348,7 @@ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/execa": { "version": "5.1.1", @@ -22453,7 +22397,6 @@ "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -22472,7 +22415,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -22483,7 +22425,6 @@ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=20.16.0" } @@ -22493,8 +22434,7 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/express": { "version": "4.22.1", @@ -22853,7 +22793,6 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", - "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -22867,7 +22806,6 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bser": "2.1.1" } @@ -23151,8 +23089,7 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -23179,8 +23116,7 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/for-each": { "version": "0.3.5", @@ -23277,7 +23213,6 @@ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -23496,7 +23431,6 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -23578,7 +23512,6 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -24214,16 +24147,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.29.1", @@ -24231,7 +24162,6 @@ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.29.1" } @@ -24271,6 +24201,7 @@ "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -24716,7 +24647,6 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -24962,7 +24892,6 @@ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -25337,7 +25266,6 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -25355,7 +25283,6 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -25431,7 +25358,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -25450,7 +25376,6 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25461,7 +25386,6 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -25488,7 +25412,6 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -25510,7 +25433,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25524,7 +25446,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25539,8 +25460,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-mock": { "version": "29.7.0", @@ -25548,7 +25468,6 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -25564,7 +25483,6 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25592,7 +25510,6 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -25611,7 +25528,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25625,7 +25541,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25640,8 +25555,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-worker": { "version": "29.7.0", @@ -25678,8 +25592,7 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jiti": { "version": "1.21.0", @@ -25758,8 +25671,7 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/jsdom": { "version": "26.1.0", @@ -25888,8 +25800,7 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -25993,7 +25904,6 @@ "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -26117,7 +26027,6 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -26129,7 +26038,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -26139,8 +26047,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lightningcss": { "version": "1.30.2", @@ -26180,12 +26087,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26201,12 +26108,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26222,12 +26129,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26243,12 +26150,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26264,12 +26171,12 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26285,12 +26192,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26306,12 +26213,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26327,12 +26234,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26348,12 +26255,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26369,12 +26276,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26390,12 +26297,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26498,8 +26405,7 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -26513,7 +26419,6 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -26527,7 +26432,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -26541,7 +26445,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26557,7 +26460,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -26567,8 +26469,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -26576,7 +26477,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -26587,7 +26487,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -26598,7 +26497,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -26735,6 +26633,7 @@ "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -26768,7 +26667,6 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -26829,8 +26727,7 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -27219,8 +27116,7 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge-anything": { "version": "5.1.7", @@ -27276,7 +27172,6 @@ "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -27332,7 +27227,6 @@ "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -27349,7 +27243,6 @@ "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -27366,7 +27259,6 @@ "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27380,7 +27272,6 @@ "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -27401,7 +27292,6 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -27412,7 +27302,6 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -27429,7 +27318,6 @@ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -27444,7 +27332,6 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -27459,7 +27346,6 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -27474,7 +27360,6 @@ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -27485,7 +27370,6 @@ "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27501,7 +27385,6 @@ "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27523,7 +27406,6 @@ "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27538,7 +27420,6 @@ "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27552,7 +27433,6 @@ "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27567,7 +27447,6 @@ "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27590,7 +27469,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27601,7 +27479,6 @@ "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27623,7 +27500,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27634,7 +27510,6 @@ "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27653,7 +27528,6 @@ "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27678,8 +27552,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", @@ -27687,7 +27560,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -27698,7 +27570,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -27712,7 +27583,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27723,7 +27593,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28740,6 +28609,7 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.x" } @@ -28797,7 +28667,8 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/mri": { "version": "1.2.0", @@ -28842,6 +28713,7 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -28955,8 +28827,7 @@ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", @@ -29087,8 +28958,7 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.27", @@ -29137,7 +29007,6 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -29154,7 +29023,6 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -29167,8 +29035,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -29256,8 +29123,7 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nwsapi": { "version": "2.2.22", @@ -29292,7 +29158,6 @@ "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29479,7 +29344,6 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -29498,7 +29362,6 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -29509,7 +29372,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -29523,7 +29385,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29539,7 +29400,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -29549,8 +29409,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -29558,7 +29417,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -29569,7 +29427,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -29580,7 +29437,6 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -29594,7 +29450,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -29700,6 +29555,7 @@ "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -29735,7 +29591,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -29860,7 +29715,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -30045,7 +29899,6 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -30117,7 +29970,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -30208,6 +30060,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -30438,6 +30291,7 @@ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "playwright-core": "1.53.2" }, @@ -30469,7 +30323,6 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -30485,7 +30338,6 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } @@ -30532,6 +30384,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31668,6 +31521,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31837,7 +31691,6 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -31927,6 +31780,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -31969,7 +31823,6 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -32017,7 +31870,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -32028,7 +31880,6 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -32262,7 +32113,6 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -32288,7 +32138,6 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -32438,6 +32287,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32451,7 +32301,6 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -32463,7 +32312,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -32485,6 +32333,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32559,6 +32408,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -32633,6 +32483,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -33349,7 +33200,6 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, - "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -33365,7 +33215,6 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-parse": "^1.0.5" } @@ -33417,7 +33266,6 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "global-dirs": "^0.1.1" }, @@ -33431,7 +33279,6 @@ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -33458,8 +33305,7 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/resolve.exports": { "version": "2.0.3", @@ -33467,7 +33313,6 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -33493,7 +33338,6 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -33508,7 +33352,6 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -33519,7 +33362,6 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -33598,6 +33440,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33806,6 +33649,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -34003,7 +33847,6 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -34022,6 +33865,7 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -34389,7 +34233,6 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -34479,7 +34322,6 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -34564,6 +34406,7 @@ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -34769,7 +34612,6 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -34783,7 +34625,6 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -34800,8 +34641,7 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -34809,7 +34649,6 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34823,7 +34662,6 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -34854,7 +34692,6 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -35026,8 +34863,7 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/style-to-js": { "version": "1.1.21", @@ -35113,7 +34949,6 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -35224,6 +35059,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35370,7 +35206,6 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -35381,7 +35216,6 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -35398,6 +35232,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -35604,8 +35439,7 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/throttleit": { "version": "2.1.0", @@ -35707,6 +35541,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -35768,8 +35603,7 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -35946,7 +35780,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.21.0", @@ -36583,7 +36418,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -36695,6 +36529,7 @@ "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 18" }, @@ -37399,7 +37234,6 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -37478,6 +37312,7 @@ "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -37723,8 +37558,7 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -37745,7 +37579,6 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -37778,7 +37611,6 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -37794,6 +37626,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -38212,8 +38045,7 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "4.0.0", @@ -38241,7 +38073,6 @@ "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -38257,7 +38088,6 @@ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=8" } @@ -38399,8 +38229,7 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/wordwrapjs": { "version": "5.1.0", @@ -38481,6 +38310,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -38541,7 +38371,6 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -38556,7 +38385,6 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -38601,7 +38429,6 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -38616,7 +38443,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" } @@ -38627,7 +38453,6 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -38716,7 +38541,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -38855,7 +38679,6 @@ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", - "peer": true, "peerDependencies": { "zod": "^3.24.1" } @@ -39182,6 +39005,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -39282,7 +39106,6 @@ "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -39371,7 +39194,6 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -39382,7 +39204,6 @@ "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -39405,7 +39226,6 @@ "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -39429,7 +39249,6 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -39453,7 +39272,6 @@ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -39492,7 +39310,6 @@ "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -39515,7 +39332,6 @@ "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -39542,7 +39358,6 @@ "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39553,7 +39368,6 @@ "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -39568,7 +39382,6 @@ "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -39629,7 +39442,6 @@ "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -39652,7 +39464,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -39665,7 +39476,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -39687,7 +39497,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39701,7 +39510,6 @@ "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -39733,7 +39541,6 @@ "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39744,7 +39551,6 @@ "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -39769,7 +39575,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39792,7 +39597,6 @@ "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39803,7 +39607,6 @@ "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -39818,7 +39621,6 @@ "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -39842,7 +39644,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -39853,7 +39654,6 @@ "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39864,7 +39664,6 @@ "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39874,8 +39673,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/@react-native/virtualized-lists": { "version": "0.83.1", @@ -39883,7 +39681,6 @@ "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -39908,7 +39705,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -39921,8 +39717,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/babel-preset-expo": { "version": "54.0.10", @@ -39930,7 +39725,6 @@ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -39975,7 +39769,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -39986,7 +39779,6 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -39997,7 +39789,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -40062,7 +39853,6 @@ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -40079,7 +39869,6 @@ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -40095,7 +39884,6 @@ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -40123,7 +39911,6 @@ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -40135,7 +39922,6 @@ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -40153,7 +39939,6 @@ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -40183,7 +39968,6 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -40202,7 +39986,6 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -40218,16 +40001,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/lru-cache": { "version": "11.2.4", @@ -40235,7 +40016,6 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -40246,7 +40026,6 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -40302,7 +40081,6 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -40319,7 +40097,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40330,7 +40107,6 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -40347,7 +40123,6 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40361,7 +40136,6 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -40382,7 +40156,6 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -40398,7 +40171,6 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -40420,7 +40192,6 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -40435,7 +40206,6 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40449,7 +40219,6 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -40464,7 +40233,6 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -40487,7 +40255,6 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -40509,7 +40276,6 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40528,7 +40294,6 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40553,8 +40318,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/metro/node_modules/hermes-parser": { "version": "0.32.0", @@ -40562,7 +40326,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40573,7 +40336,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40596,7 +40358,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -40607,7 +40368,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -40621,7 +40381,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -40638,7 +40397,6 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -40652,7 +40410,6 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40666,7 +40423,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -40684,7 +40440,6 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -40702,7 +40457,6 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -40730,7 +40484,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -40746,7 +40499,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -40772,8 +40524,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native": { "version": "0.83.1", @@ -40841,7 +40592,6 @@ "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -40863,8 +40613,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -40872,7 +40621,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -40883,7 +40631,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -40895,7 +40642,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -40907,7 +40653,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40929,7 +40674,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40940,7 +40684,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -40954,7 +40697,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40976,16 +40718,14 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/source-map": { "version": "0.5.7", @@ -40993,7 +40733,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -41004,7 +40743,6 @@ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -41036,7 +40774,6 @@ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -41047,7 +40784,6 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -41143,7 +40879,7 @@ }, "packages/zero": { "name": "@rocicorp/zero", - "version": "0.26.1", + "version": "0.26.2", "license": "Apache-2.0", "dependencies": { "@badrap/valita": "0.3.11", @@ -41564,7 +41300,6 @@ "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -41654,7 +41389,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41672,7 +41406,6 @@ "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -41695,7 +41428,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41713,7 +41445,6 @@ "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -41752,7 +41483,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41770,7 +41500,6 @@ "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -41793,7 +41522,6 @@ "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -41820,7 +41548,6 @@ "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -41843,7 +41570,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41856,7 +41582,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41878,7 +41603,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41889,7 +41613,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41903,7 +41626,6 @@ "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -41927,8 +41649,7 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/babel-preset-expo": { "version": "54.0.4", @@ -41936,7 +41657,6 @@ "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -41981,7 +41701,6 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -42032,7 +41751,6 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -42043,7 +41761,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -42108,7 +41825,6 @@ "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -42125,7 +41841,6 @@ "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -42141,7 +41856,6 @@ "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -42169,7 +41883,6 @@ "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -42181,7 +41894,6 @@ "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -42243,8 +41955,7 @@ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/minimatch": { "version": "9.0.5", @@ -42252,7 +41963,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -42269,7 +41979,6 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -42301,7 +42010,6 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -42329,7 +42037,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -42351,7 +42058,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -42365,7 +42071,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -42381,7 +42086,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -42405,8 +42109,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native": { "version": "0.82.0", @@ -42473,8 +42176,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -42482,7 +42184,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -42493,7 +42194,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -42506,7 +42206,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -42528,7 +42227,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -42539,7 +42237,6 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -42553,7 +42250,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -42575,16 +42271,14 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/tar": { "version": "7.5.1", @@ -42592,7 +42286,6 @@ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -42624,7 +42317,6 @@ "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -42771,7 +42463,6 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -43132,7 +42823,6 @@ "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, - "peer": true, "requires": {} }, "@ai-sdk/gateway": { @@ -43272,6 +42962,7 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", + "peer": true, "requires": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -44106,6 +43797,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -44347,7 +44039,6 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, - "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -44360,7 +44051,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -44370,7 +44060,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -44382,7 +44071,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -44391,29 +44079,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -44477,7 +44161,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, - "peer": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -44489,7 +44172,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44505,7 +44187,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44515,7 +44196,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44525,7 +44205,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -44535,7 +44214,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44545,7 +44223,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44563,7 +44240,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44573,7 +44249,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44599,7 +44274,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44609,7 +44283,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44627,7 +44300,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44637,7 +44309,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44647,7 +44318,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44657,7 +44327,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44667,7 +44336,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44677,7 +44345,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44687,7 +44354,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44697,7 +44363,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44876,7 +44541,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -45446,7 +45110,6 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -45571,12 +45234,14 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "peer": true }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -46610,6 +46275,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -46774,6 +46440,7 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", + "peer": true, "requires": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -47132,7 +46799,8 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "peer": true }, "which": { "version": "4.0.0", @@ -47193,7 +46861,8 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true + "dev": true, + "peer": true }, "@electric-sql/pglite-socket": { "version": "0.0.6", @@ -47604,7 +47273,6 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, - "peer": true, "requires": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -47615,7 +47283,6 @@ "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -47637,7 +47304,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47647,7 +47313,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47658,15 +47323,13 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47676,7 +47339,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47689,7 +47351,6 @@ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, - "peer": true, "requires": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -47712,7 +47373,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47723,15 +47383,13 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47741,7 +47399,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47753,15 +47410,13 @@ "version": "54.0.10", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true, - "peer": true + "dev": true }, "@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, - "peer": true, "requires": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -47772,7 +47427,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "peer": true, "requires": { "ms": "^2.1.1" } @@ -47784,7 +47438,6 @@ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, - "peer": true, "requires": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -47798,7 +47451,6 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -47817,15 +47469,13 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -47835,7 +47485,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -47847,7 +47496,6 @@ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -47865,15 +47513,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "peer": true + "dev": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, - "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -47885,7 +47531,6 @@ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -47896,7 +47541,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47908,7 +47552,6 @@ "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, - "peer": true, "requires": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -47920,7 +47563,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, - "peer": true, "requires": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -47941,7 +47583,6 @@ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -47952,7 +47593,6 @@ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, - "peer": true, "requires": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -47967,7 +47607,6 @@ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, - "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -47978,22 +47617,19 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true, - "peer": true + "dev": true }, "@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true, - "peer": true + "dev": true }, "@expo/spawn-async": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.3" } @@ -48002,22 +47638,19 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true, - "peer": true + "dev": true }, "@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true, - "peer": true + "dev": true }, "@expo/xcpretty": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -48030,7 +47663,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, - "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -48040,7 +47672,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -48051,7 +47682,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -48061,7 +47691,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -48565,7 +48194,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "peer": true, "requires": { "minipass": "^7.0.4" } @@ -48574,15 +48202,13 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true, - "peer": true + "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "peer": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -48596,7 +48222,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -48605,15 +48230,13 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true + "dev": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -48624,7 +48247,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -48635,7 +48257,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -48645,7 +48266,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "peer": true, "requires": { "p-try": "^2.0.0" } @@ -48655,7 +48275,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -48666,15 +48285,13 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "peer": true + "dev": true }, "@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3" } @@ -48684,7 +48301,6 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "peer": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -48697,7 +48313,6 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -48720,7 +48335,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -48744,7 +48358,6 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -48968,6 +48581,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "peer": true, "requires": { "@types/mdx": "^2.0.0" } @@ -49061,7 +48675,8 @@ "@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "peer": true }, "@noble/curves": { "version": "1.8.1", @@ -49240,7 +48855,8 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "peer": true }, "@opentelemetry/api-logs": { "version": "0.203.0", @@ -49315,6 +48931,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -50532,6 +50149,7 @@ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, + "peer": true, "requires": { "@prisma/client-runtime-utils": "7.2.0" } @@ -50833,15 +50451,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -50852,7 +50468,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -50906,7 +50521,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50922,7 +50536,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50939,7 +50552,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, - "peer": true, "requires": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -50954,15 +50566,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true, - "peer": true + "dev": true }, "@react-native/dev-middleware": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -50983,7 +50593,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50994,7 +50603,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51005,15 +50613,13 @@ "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true, - "peer": true + "dev": true }, "@react-native/debugger-shell": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -51024,7 +50630,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -51044,7 +50649,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -51055,7 +50659,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51066,22 +50669,19 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/js-polyfills": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true, - "peer": true + "dev": true }, "@react-native/normalize-colors": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true, - "peer": true + "dev": true }, "@react-stately/utils": { "version": "3.10.4", @@ -51194,7 +50794,6 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -51267,7 +50866,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -51280,7 +50878,6 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, - "peer": true, "requires": { "chalk": "^4.1.2" }, @@ -51290,7 +50887,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -51303,7 +50899,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -51333,7 +50928,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -51346,7 +50940,6 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -51365,7 +50958,6 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, - "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -51380,7 +50972,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -51396,7 +50987,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51407,7 +50997,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51422,7 +51011,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51432,7 +51020,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51444,7 +51031,6 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -51454,15 +51040,13 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "babel-preset-expo": { "version": "54.0.4", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, - "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -51493,7 +51077,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -51523,15 +51106,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true + "dev": true }, "commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true + "dev": true }, "expo": { "version": "54.0.13", @@ -51568,7 +51149,6 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, - "peer": true, "requires": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -51579,7 +51159,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -51590,7 +51169,6 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, - "peer": true, "requires": {} }, "expo-font": { @@ -51608,7 +51186,6 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, - "peer": true, "requires": {} }, "expo-modules-core": { @@ -51616,7 +51193,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4" } @@ -51648,15 +51224,13 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true + "dev": true }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -51666,7 +51240,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "peer": true, "requires": { "minipass": "^7.1.2" } @@ -51680,15 +51253,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true + "dev": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -51699,8 +51270,7 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51709,7 +51279,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -51720,8 +51289,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -51736,8 +51304,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true }, "react-native": { "version": "0.82.0", @@ -51787,15 +51354,13 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -51805,7 +51370,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51816,7 +51380,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51831,7 +51394,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51841,7 +51403,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51851,7 +51412,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51867,22 +51427,19 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true + "dev": true }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true, - "peer": true + "dev": true }, "tar": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, - "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -51901,8 +51458,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true, - "peer": true + "dev": true }, "vite": { "version": "7.2.7", @@ -51948,8 +51504,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -52143,6 +51698,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -52318,7 +51874,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "peer": true, "requires": { "type-detect": "4.0.8" } @@ -52328,7 +51883,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "peer": true, "requires": { "@sinonjs/commons": "^3.0.0" } @@ -52980,6 +52534,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "requires": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -53062,6 +52617,7 @@ "version": "3.13.19", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", + "peer": true, "requires": { "@tanstack/virtual-core": "3.13.19" } @@ -53069,7 +52625,8 @@ "@tanstack/virtual-core": { "version": "3.13.19", "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", - "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==" + "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", + "peer": true }, "@tantaman/api-extractor": { "version": "7.52.13", @@ -53138,6 +52695,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -53482,7 +53040,6 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "peer": true, "requires": { "@types/node": "*" } @@ -53609,6 +53166,7 @@ "version": "22.18.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "peer": true, "requires": { "undici-types": "~6.21.0" }, @@ -53640,6 +53198,7 @@ "version": "8.15.4", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", + "peer": true, "requires": { "@types/node": "*", "pg-protocol": "*", @@ -53690,6 +53249,7 @@ "version": "18.3.23", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -53828,8 +53388,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true + "dev": true }, "@types/strip-ansi": { "version": "3.0.0", @@ -53892,7 +53451,6 @@ "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -53903,7 +53461,6 @@ "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, - "peer": true, "requires": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -54111,6 +53668,7 @@ "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, + "peer": true, "requires": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -54135,6 +53693,7 @@ "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, + "peer": true, "requires": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -54392,8 +53951,7 @@ "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "peer": true + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -54482,7 +54040,8 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "peer": true }, "acorn-import-attributes": { "version": "1.9.5", @@ -54535,6 +54094,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -54578,6 +54138,7 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", + "peer": true, "requires": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -54631,8 +54192,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "peer": true + "dev": true }, "ansi-align": { "version": "3.0.1", @@ -54833,8 +54393,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true + "dev": true }, "asn1": { "version": "0.2.6", @@ -54926,8 +54485,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "peer": true + "dev": true }, "async-listen": { "version": "3.0.0", @@ -55011,7 +54569,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "peer": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -55044,7 +54601,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -55058,7 +54614,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -55073,7 +54628,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "peer": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -55087,7 +54641,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -55165,7 +54718,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, - "peer": true, "requires": { "@babel/types": "^7.26.0" } @@ -55174,15 +54726,13 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.29.1" } @@ -55192,7 +54742,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, - "peer": true, "requires": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -55202,7 +54751,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, - "peer": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -55226,7 +54774,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "peer": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -55376,7 +54923,6 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, - "peer": true, "requires": { "open": "^8.0.4" } @@ -55385,8 +54931,7 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "peer": true + "dev": true }, "big.js": { "version": "5.2.2", @@ -55566,7 +55111,6 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, - "peer": true, "requires": { "stream-buffers": "2.2.x" } @@ -55576,7 +55120,6 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, - "peer": true, "requires": { "big-integer": "1.6.x" } @@ -55608,6 +55151,7 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "peer": true, "requires": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -55621,7 +55165,6 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "peer": true, "requires": { "node-int64": "^0.4.0" } @@ -55732,7 +55275,6 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, - "peer": true, "requires": { "callsites": "^2.0.0" }, @@ -55741,8 +55283,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -55751,7 +55292,6 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, - "peer": true, "requires": { "caller-callsite": "^2.0.0" } @@ -55911,7 +55451,6 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, - "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55929,7 +55468,6 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, - "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55998,7 +55536,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, - "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -56007,8 +55544,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "peer": true + "dev": true }, "cli-table3": { "version": "0.6.5", @@ -56051,8 +55587,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "peer": true + "dev": true }, "clone-deep": { "version": "4.0.1", @@ -56852,7 +56387,8 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "peer": true }, "d3-timer": { "version": "3.0.1", @@ -57022,7 +56558,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "peer": true, "requires": { "clone": "^1.0.2" } @@ -57308,7 +56843,6 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, - "peer": true, "requires": { "dotenv": "^16.4.5" } @@ -57494,8 +57028,7 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true, - "peer": true + "dev": true }, "error-ex": { "version": "1.3.2", @@ -57510,7 +57043,6 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, - "peer": true, "requires": { "stackframe": "^1.3.4" } @@ -57564,6 +57096,7 @@ "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "peer": true, "requires": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", @@ -57936,8 +57469,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true, - "peer": true + "dev": true }, "execa": { "version": "5.1.1", @@ -57971,7 +57503,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -57985,8 +57516,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -57994,15 +57524,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true, - "peer": true + "dev": true }, "exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "peer": true + "dev": true }, "express": { "version": "4.22.1", @@ -58272,15 +57800,13 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true, - "peer": true + "dev": true }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "peer": true, "requires": { "bser": "2.1.1" } @@ -58469,8 +57995,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true, - "peer": true + "dev": true }, "follow-redirects": { "version": "1.15.11", @@ -58481,8 +58006,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true, - "peer": true + "dev": true }, "for-each": { "version": "0.3.5", @@ -58539,8 +58063,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true, - "peer": true + "dev": true }, "fresh": { "version": "0.5.2", @@ -58693,8 +58216,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "peer": true + "dev": true }, "get-port": { "version": "7.1.0", @@ -58744,8 +58266,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true, - "peer": true + "dev": true }, "giget": { "version": "2.0.0", @@ -59188,22 +58709,19 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true, - "peer": true + "dev": true }, "hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true, - "peer": true + "dev": true }, "hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.29.1" } @@ -59240,7 +58758,8 @@ "version": "4.10.6", "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true + "dev": true, + "peer": true }, "hpack.js": { "version": "2.1.6", @@ -59534,7 +59053,6 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, - "peer": true, "requires": { "queue": "6.0.2" } @@ -59695,8 +59213,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "peer": true + "dev": true }, "is-docker": { "version": "2.2.1", @@ -59913,7 +59430,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -59926,8 +59442,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -59984,7 +59499,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "peer": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -59998,15 +59512,13 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "peer": true + "dev": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -60027,7 +59539,6 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -60044,15 +59555,13 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -60063,8 +59572,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60073,7 +59581,6 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -60084,8 +59591,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "peer": true + "dev": true }, "jest-util": { "version": "29.7.0", @@ -60105,7 +59611,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "peer": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -60119,15 +59624,13 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -60138,8 +59641,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60168,8 +59670,7 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true, - "peer": true + "dev": true }, "jiti": { "version": "1.21.0", @@ -60233,8 +59734,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true, - "peer": true + "dev": true }, "jsdom": { "version": "26.1.0", @@ -60327,8 +59827,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "peer": true + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -60411,8 +59910,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true, - "peer": true + "dev": true }, "latest-version": { "version": "7.0.0", @@ -60505,7 +60003,6 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, - "peer": true, "requires": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -60516,7 +60013,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "requires": { "ms": "2.0.0" } @@ -60525,8 +60021,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true } } }, @@ -60555,78 +60050,78 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-freebsd-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-arm64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-arm64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-x64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-linux-x64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-win32-arm64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lightningcss-win32-x64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "optional": true, - "peer": true + "dev": true, + "optional": true }, "lilconfig": { "version": "2.1.0", @@ -60713,8 +60208,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "peer": true + "dev": true }, "lodash.uniq": { "version": "4.5.0", @@ -60726,7 +60220,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, - "peer": true, "requires": { "chalk": "^2.0.1" }, @@ -60736,7 +60229,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -60746,7 +60238,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -60758,7 +60249,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -60767,29 +60257,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -60879,6 +60365,7 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, + "peer": true, "requires": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -60904,7 +60391,6 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "peer": true, "requires": { "tmpl": "1.0.5" } @@ -60942,8 +60428,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true, - "peer": true + "dev": true }, "math-intrinsics": { "version": "1.1.0", @@ -61232,8 +60717,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true, - "peer": true + "dev": true }, "merge-anything": { "version": "5.1.7", @@ -61269,7 +60753,6 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -61317,22 +60800,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "peer": true, "requires": { "mime-db": "1.52.0" } @@ -61341,15 +60821,13 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -61359,7 +60837,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -61372,7 +60849,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, - "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -61385,7 +60861,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -61395,7 +60870,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, - "peer": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -61412,7 +60886,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -61422,7 +60895,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, - "peer": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -61435,7 +60907,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, - "peer": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -61446,7 +60917,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -61457,7 +60927,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "peer": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -61467,8 +60936,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -61477,7 +60945,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -61489,7 +60956,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, - "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -61507,7 +60973,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -61518,7 +60983,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -61528,7 +60992,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -61539,7 +61002,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -61557,8 +61019,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -61567,7 +61028,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -61581,8 +61041,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -61591,7 +61050,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61606,7 +61064,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -62241,7 +61698,8 @@ "version": "15.10.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true + "dev": true, + "peer": true }, "graphql-subscriptions": { "version": "1.2.1", @@ -62284,7 +61742,8 @@ "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "peer": true }, "mri": { "version": "1.2.0", @@ -62315,6 +61774,7 @@ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, + "peer": true, "requires": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -62395,8 +61855,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true, - "peer": true + "dev": true }, "netmask": { "version": "2.0.2", @@ -62487,8 +61946,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "peer": true + "dev": true }, "node-releases": { "version": "2.0.27", @@ -62518,7 +61976,6 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, - "peer": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -62531,7 +61988,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "peer": true, "requires": { "lru-cache": "^10.0.1" } @@ -62540,8 +61996,7 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "peer": true + "dev": true } } }, @@ -62602,8 +62057,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "peer": true + "dev": true }, "nwsapi": { "version": "2.2.22", @@ -62629,7 +62083,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -62749,7 +62202,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, - "peer": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -62763,15 +62215,13 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -62781,7 +62231,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -62793,7 +62242,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "requires": { "color-name": "1.1.3" } @@ -62802,29 +62250,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true + "dev": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -62834,7 +62278,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -62927,6 +62370,7 @@ "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.14.2.tgz", "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, + "peer": true, "requires": { "@oxlint-tsgolint/darwin-arm64": "0.14.2", "@oxlint-tsgolint/darwin-x64": "0.14.2", @@ -62951,7 +62395,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -63025,8 +62468,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true + "dev": true }, "pac-proxy-agent": { "version": "7.2.0", @@ -63163,7 +62605,6 @@ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, - "peer": true, "requires": { "pngjs": "^3.3.0" } @@ -63216,8 +62657,7 @@ "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, - "peer": true + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -63284,6 +62724,7 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -63446,6 +62887,7 @@ "version": "1.53.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", + "peer": true, "requires": { "fsevents": "2.3.2", "playwright-core": "1.53.2" @@ -63461,7 +62903,6 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, - "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -63472,8 +62913,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true, - "peer": true + "dev": true }, "portfinder": { "version": "1.0.38", @@ -63494,6 +62934,7 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -64121,6 +63562,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -64218,8 +63660,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "peer": true + "dev": true }, "pretty-error": { "version": "4.0.0", @@ -64276,6 +63717,7 @@ "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", "dev": true, + "peer": true, "requires": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -64294,8 +63736,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "peer": true + "dev": true }, "process": { "version": "0.11.10", @@ -64329,15 +63770,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "peer": true + "dev": true }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, - "peer": true, "requires": { "asap": "~2.0.6" } @@ -64507,8 +63946,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true, - "peer": true + "dev": true }, "qs": { "version": "6.14.0", @@ -64523,7 +63961,6 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, - "peer": true, "requires": { "inherits": "~2.0.3" } @@ -64623,6 +64060,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -64632,7 +64070,6 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, - "peer": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -64643,7 +64080,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -64652,6 +64088,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -64700,6 +64137,7 @@ "version": "npm:@docusaurus/react-loadable@6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "peer": true, "requires": { "@types/react": "*" } @@ -64746,6 +64184,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "peer": true, "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -65248,7 +64687,6 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, - "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -65320,7 +64758,6 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, - "peer": true, "requires": { "node-forge": "^1.3.3" } @@ -65330,7 +64767,6 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, - "peer": true, "requires": { "chalk": "^4.1.2" } @@ -65340,7 +64776,6 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -65360,7 +64795,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, - "peer": true, "requires": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -65383,7 +64817,6 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -65413,7 +64846,6 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -65432,7 +64864,6 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, - "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -65446,15 +64877,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true, - "peer": true + "dev": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -65465,7 +64894,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -65519,7 +64947,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -65535,7 +64962,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -65546,7 +64972,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -65561,7 +64986,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65573,7 +64997,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, - "peer": true, "requires": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -65588,15 +65011,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true, - "peer": true + "dev": true }, "@react-native/dev-middleware": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -65617,7 +65038,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -65626,15 +65046,13 @@ "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true, - "peer": true + "dev": true }, "@react-native/debugger-shell": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, - "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -65645,7 +65063,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, - "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -65665,7 +65082,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, - "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -65676,29 +65092,25 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true, - "peer": true + "dev": true }, "@react-native/js-polyfills": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true, - "peer": true + "dev": true }, "@react-native/normalize-colors": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true, - "peer": true + "dev": true }, "@react-native/virtualized-lists": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -65708,22 +65120,19 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true + "dev": true }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true + "dev": true }, "babel-preset-expo": { "version": "54.0.10", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, - "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -65754,7 +65163,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -65763,15 +65171,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true + "dev": true }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true + "dev": true }, "expo": { "version": "54.0.32", @@ -65808,7 +65214,6 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, - "peer": true, "requires": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -65819,7 +65224,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, - "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -65830,7 +65234,6 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, - "peer": true, "requires": {} }, "expo-font": { @@ -65848,7 +65251,6 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, - "peer": true, "requires": {} }, "expo-modules-autolinking": { @@ -65856,7 +65258,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, - "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -65870,7 +65271,6 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, - "peer": true, "requires": { "invariant": "^2.2.4" } @@ -65889,7 +65289,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -65901,7 +65300,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -65912,29 +65310,25 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true, - "peer": true + "dev": true }, "hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true + "dev": true }, "lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true + "dev": true }, "metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -65982,15 +65376,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": true }, "hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -66000,7 +65392,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -66010,7 +65401,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -66023,7 +65413,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -66035,7 +65424,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, - "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -66048,7 +65436,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -66058,7 +65445,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, - "peer": true, "requires": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -66075,7 +65461,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -66087,7 +65472,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, - "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -66105,7 +65489,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -66116,7 +65499,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -66126,7 +65508,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -66137,7 +65518,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, - "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -66156,7 +65536,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -66171,7 +65550,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -66186,7 +65564,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -66207,15 +65584,13 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "peer": true, "requires": { "mime-db": "1.52.0" } @@ -66225,7 +65600,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -66235,7 +65609,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "peer": true, "requires": { "minipass": "^7.1.2" } @@ -66245,7 +65618,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, - "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -66255,7 +65627,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -66266,7 +65637,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -66276,15 +65646,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true + "dev": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -66296,7 +65664,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -66314,8 +65681,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true + "dev": true }, "react-native": { "version": "0.83.1", @@ -66366,7 +65732,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, - "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -66381,15 +65746,13 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true, - "peer": true + "dev": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, - "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -66399,7 +65762,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -66409,15 +65771,13 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true + "dev": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -66432,7 +65792,6 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, - "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -66442,7 +65801,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -66452,7 +65810,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "peer": true, "requires": {} } } @@ -66461,29 +65818,25 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true + "dev": true }, "scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, - "peer": true + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true + "dev": true }, "tar": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, - "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -66502,15 +65855,13 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true, - "peer": true + "dev": true }, "yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true + "dev": true } } }, @@ -66579,7 +65930,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "peer": true }, "typescript": { "version": "5.9.3", @@ -66632,7 +65984,6 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, - "peer": true, "requires": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -66644,7 +65995,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, - "peer": true, "requires": { "path-parse": "^1.0.5" } @@ -66681,7 +66031,6 @@ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, - "peer": true, "requires": { "global-dirs": "^0.1.1" }, @@ -66691,7 +66040,6 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, - "peer": true, "requires": { "ini": "^1.3.4" } @@ -66712,15 +66060,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true, - "peer": true + "dev": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "peer": true + "dev": true }, "responselike": { "version": "3.0.0", @@ -66735,7 +66081,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, - "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -66745,15 +66090,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "peer": true + "dev": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, - "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -66807,6 +66150,7 @@ "version": "4.46.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "peer": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", @@ -66937,6 +66281,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -67071,8 +66416,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true, - "peer": true + "dev": true }, "serialize-javascript": { "version": "6.0.2", @@ -67086,7 +66430,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true + "dev": true, + "peer": true }, "seroval-plugins": { "version": "1.1.1", @@ -67384,7 +66729,6 @@ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, - "peer": true, "requires": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -67452,8 +66796,7 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true, - "peer": true + "dev": true }, "smart-buffer": { "version": "4.2.0", @@ -67517,6 +66860,7 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, + "peer": true, "requires": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -67679,7 +67023,6 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "peer": true, "requires": { "escape-string-regexp": "^2.0.0" }, @@ -67688,8 +67031,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "peer": true + "dev": true } } }, @@ -67703,15 +67045,13 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "peer": true + "dev": true }, "stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, - "peer": true, "requires": { "type-fest": "^0.7.1" }, @@ -67720,8 +67060,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -67744,8 +67083,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "peer": true + "dev": true }, "stream-shift": { "version": "1.0.3", @@ -67864,8 +67202,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true, - "peer": true + "dev": true }, "style-to-js": { "version": "1.1.21", @@ -67928,7 +67265,6 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, - "peer": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -68005,6 +67341,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, + "peer": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -68113,15 +67450,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "peer": true + "dev": true }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, - "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -68131,6 +67466,7 @@ "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -68278,8 +67614,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "peer": true + "dev": true }, "throttleit": { "version": "2.1.0", @@ -68339,7 +67674,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "peer": true } } }, @@ -68379,8 +67715,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "peer": true + "dev": true }, "to-regex-range": { "version": "5.0.1", @@ -68483,7 +67818,8 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "peer": true }, "tsx": { "version": "4.21.0", @@ -68783,8 +68119,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true + "dev": true }, "type-fest": { "version": "4.41.0", @@ -68875,6 +68210,7 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, + "peer": true, "requires": {} }, "typescript": { @@ -69284,8 +68620,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "peer": true + "dev": true }, "value-equal": { "version": "1.0.1", @@ -69351,6 +68686,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fsevents": "~2.3.3", @@ -69445,8 +68781,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "peer": true + "dev": true }, "w3c-xmlserializer": { "version": "5.0.0", @@ -69462,7 +68797,6 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "peer": true, "requires": { "makeerror": "1.0.12" } @@ -69489,7 +68823,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "peer": true, "requires": { "defaults": "^1.0.3" } @@ -69503,6 +68836,7 @@ "version": "5.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -69766,8 +69100,7 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true, - "peer": true + "dev": true }, "whatwg-mimetype": { "version": "4.0.0", @@ -69789,7 +69122,6 @@ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, - "peer": true, "requires": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -69800,8 +69132,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -69892,8 +69223,7 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true, - "peer": true + "dev": true }, "wordwrapjs": { "version": "5.1.0", @@ -69951,6 +69281,7 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "peer": true, "requires": {} }, "wsl-utils": { @@ -69981,7 +69312,6 @@ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, - "peer": true, "requires": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -69991,8 +69321,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -70020,7 +69349,6 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, - "peer": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -70030,8 +69358,7 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -70039,8 +69366,7 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "peer": true + "dev": true }, "xmlchars": { "version": "2.2.0", @@ -70097,8 +69423,7 @@ "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, - "peer": true + "dev": true }, "z2s": { "version": "file:packages/z2s", @@ -70130,7 +69455,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.1", + "@rocicorp/zero": "0.26.2", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tailwindcss/forms": "^0.5.0", @@ -70182,6 +69507,64 @@ "zod": "^4.1.11" }, "dependencies": { + "@rocicorp/zero": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/@rocicorp/zero/-/zero-0.26.1.tgz", + "integrity": "sha512-z3sAk2WLhQ95gdbDXljbO/W1l+xjCZGInh+cZ8KxWlkbX5DzjoJKPr5owmQ2cfrVKLG/kZnyAvDS9++Gsuc5iQ==", + "peer": true, + "requires": { + "@badrap/valita": "0.3.11", + "@databases/escape-identifier": "^1.0.3", + "@databases/sql": "^3.3.0", + "@dotenvx/dotenvx": "^1.39.0", + "@drdgvhbh/postgres-error-codes": "^0.0.6", + "@fastify/cors": "^10.0.0", + "@fastify/websocket": "^11.0.0", + "@google-cloud/precise-date": "^4.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.203.0", + "@opentelemetry/auto-instrumentations-node": "^0.62.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", + "@opentelemetry/resources": "^2.0.1", + "@opentelemetry/sdk-metrics": "^2.0.1", + "@opentelemetry/sdk-node": "^0.203.0", + "@opentelemetry/sdk-trace-node": "^2.0.1", + "@postgresql-typed/oids": "^0.2.0", + "@rocicorp/lock": "^1.0.4", + "@rocicorp/logger": "^5.4.0", + "@rocicorp/resolver": "^1.0.2", + "@rocicorp/zero-sqlite3": "^1.0.15", + "@standard-schema/spec": "^1.0.0", + "@types/basic-auth": "^1.1.8", + "@types/ws": "^8.5.12", + "basic-auth": "^2.0.1", + "chalk": "^5.3.0", + "chalk-template": "^1.1.0", + "chokidar": "^4.0.1", + "cloudevents": "^10.0.0", + "command-line-args": "^6.0.1", + "command-line-usage": "^7.0.3", + "compare-utf8": "^0.1.1", + "defu": "^6.1.4", + "eventemitter3": "^5.0.1", + "fastify": "^5.0.0", + "is-in-subnet": "^4.0.1", + "jose": "^5.9.3", + "js-xxhash": "^4.0.0", + "json-custom-numbers": "^3.1.1", + "kasi": "^1.1.0", + "nanoid": "^5.1.2", + "parse-prometheus-text-format": "^1.1.1", + "pg-format": "npm:pg-format-fix@^1.0.5", + "postgres": "3.4.7", + "prettier": "^3.5.3", + "semver": "^7.5.4", + "tsx": "^4.21.0", + "url-pattern": "^1.0.3", + "urlpattern-polyfill": "^10.1.0", + "ws": "^8.18.1" + } + }, "@rocicorp/zero-virtual": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@rocicorp/zero-virtual/-/zero-virtual-0.1.1.tgz", @@ -70199,6 +69582,27 @@ "pg-types": "^2.2.0" } }, + "chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" + }, + "chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", + "requires": { + "chalk": "^5.2.0" + } + }, + "chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "requires": { + "readdirp": "^4.0.1" + } + }, "fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -70222,7 +69626,13 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true + }, + "readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" }, "typescript": { "version": "5.9.3", @@ -70235,6 +69645,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -70529,7 +69940,6 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, - "peer": true, "requires": {} }, "zql": { @@ -70650,7 +70060,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "dev": true, + "peer": true }, "typescript": { "version": "5.9.3", diff --git a/packages/zero/package.json b/packages/zero/package.json index c2f92ef003..98e3bf6b1d 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero", - "version": "0.26.1", + "version": "0.26.2", "description": "Zero is a web framework for serverless web development.", "author": "Rocicorp, Inc.", "repository": { From 72b7e569a524bed2b0336e81178e9a528767e76d Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Fri, 13 Mar 2026 13:13:54 -0700 Subject: [PATCH 141/495] chore(zero-cache): improve info level logging for debugging (#5655) --- .gitignore | 2 + apps/zbugs/package.json | 2 +- package-lock.json | 141 +----------------- .../src/services/view-syncer/cvr-store.ts | 4 +- .../services/view-syncer/pipeline-driver.ts | 8 +- .../services/view-syncer/row-record-cache.ts | 11 +- 6 files changed, 20 insertions(+), 148 deletions(-) diff --git a/.gitignore b/.gitignore index 47a1e09de5..35b8c404b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +logs + # build outputs **/*.tgz diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index c51a3df7c9..d34f6b888e 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -97,4 +97,4 @@ "vite-tsconfig-paths": "^5.1.4", "vitest": "4.0.15" } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 4e98f709b3..94cd1e1ce1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -150,48 +150,6 @@ "pg-types": "^2.2.0" } }, - "apps/zbugs/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "apps/zbugs/node_modules/chalk-template": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", - "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "apps/zbugs/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "apps/zbugs/node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -257,19 +215,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "apps/zbugs/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "apps/zbugs/node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -35788,6 +35733,7 @@ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -67825,6 +67771,7 @@ "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "peer": true, "requires": { "esbuild": "~0.27.0", "fsevents": "~2.3.3", @@ -69507,64 +69454,6 @@ "zod": "^4.1.11" }, "dependencies": { - "@rocicorp/zero": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@rocicorp/zero/-/zero-0.26.1.tgz", - "integrity": "sha512-z3sAk2WLhQ95gdbDXljbO/W1l+xjCZGInh+cZ8KxWlkbX5DzjoJKPr5owmQ2cfrVKLG/kZnyAvDS9++Gsuc5iQ==", - "peer": true, - "requires": { - "@badrap/valita": "0.3.11", - "@databases/escape-identifier": "^1.0.3", - "@databases/sql": "^3.3.0", - "@dotenvx/dotenvx": "^1.39.0", - "@drdgvhbh/postgres-error-codes": "^0.0.6", - "@fastify/cors": "^10.0.0", - "@fastify/websocket": "^11.0.0", - "@google-cloud/precise-date": "^4.0.0", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/auto-instrumentations-node": "^0.62.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", - "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-metrics": "^2.0.1", - "@opentelemetry/sdk-node": "^0.203.0", - "@opentelemetry/sdk-trace-node": "^2.0.1", - "@postgresql-typed/oids": "^0.2.0", - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "@rocicorp/zero-sqlite3": "^1.0.15", - "@standard-schema/spec": "^1.0.0", - "@types/basic-auth": "^1.1.8", - "@types/ws": "^8.5.12", - "basic-auth": "^2.0.1", - "chalk": "^5.3.0", - "chalk-template": "^1.1.0", - "chokidar": "^4.0.1", - "cloudevents": "^10.0.0", - "command-line-args": "^6.0.1", - "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", - "defu": "^6.1.4", - "eventemitter3": "^5.0.1", - "fastify": "^5.0.0", - "is-in-subnet": "^4.0.1", - "jose": "^5.9.3", - "js-xxhash": "^4.0.0", - "json-custom-numbers": "^3.1.1", - "kasi": "^1.1.0", - "nanoid": "^5.1.2", - "parse-prometheus-text-format": "^1.1.1", - "pg-format": "npm:pg-format-fix@^1.0.5", - "postgres": "3.4.7", - "prettier": "^3.5.3", - "semver": "^7.5.4", - "tsx": "^4.21.0", - "url-pattern": "^1.0.3", - "urlpattern-polyfill": "^10.1.0", - "ws": "^8.18.1" - } - }, "@rocicorp/zero-virtual": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@rocicorp/zero-virtual/-/zero-virtual-0.1.1.tgz", @@ -69582,27 +69471,6 @@ "pg-types": "^2.2.0" } }, - "chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" - }, - "chalk-template": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", - "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", - "requires": { - "chalk": "^5.2.0" - } - }, - "chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "requires": { - "readdirp": "^4.0.1" - } - }, "fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -69629,11 +69497,6 @@ "dev": true, "peer": true }, - "readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" - }, "typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", diff --git a/packages/zero-cache/src/services/view-syncer/cvr-store.ts b/packages/zero-cache/src/services/view-syncer/cvr-store.ts index 434369bd46..8e3afbce68 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr-store.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr-store.ts @@ -440,7 +440,7 @@ export class CVRStore { } } - lc.debug?.( + lc.info?.( `loaded cvr@${versionString(cvr.version)} (${Date.now() - start} ms)`, ); @@ -1152,7 +1152,7 @@ export class CVRStore { ); if (stats) { const elapsed = performance.now() - start; - lc.debug?.( + lc.info?.( `flushed cvr@${versionString(cvr.version)} ` + `${JSON.stringify(stats)} in (${elapsed} ms)`, ); diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 396920c99e..75e9cabd31 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -632,12 +632,18 @@ export class PipelineDriver { this.#hydrateContext === null, 'Cannot advance while hydration is in progress', ); + const totalHydrationTimeMs = this.totalHydrationTimeMs(); this.#advanceContext = { timer, - totalHydrationTimeMs: this.totalHydrationTimeMs(), + totalHydrationTimeMs, numChanges, pos: 0, }; + this.#lc.info?.( + `starting pipeline advancement of ${numChanges} changes with an ` + + `advancement time limited based on total hydration time of ` + + `${totalHydrationTimeMs} ms.`, + ); try { for (const {table, prevValues, nextValue} of diff) { // Advance progress is checked each time a row is fetched diff --git a/packages/zero-cache/src/services/view-syncer/row-record-cache.ts b/packages/zero-cache/src/services/view-syncer/row-record-cache.ts index 6b13cc8979..338491c3dc 100644 --- a/packages/zero-cache/src/services/view-syncer/row-record-cache.ts +++ b/packages/zero-cache/src/services/view-syncer/row-record-cache.ts @@ -176,7 +176,7 @@ export class RowRecordCache { cache.set(rowRecord.id, rowRecord); } } - this.#lc.debug?.( + this.#lc.info?.( `Loaded ${cache.size} row records in ${Date.now() - start} ms`, ); r.resolve(cache); @@ -261,7 +261,7 @@ export class RowRecordCache { {mode: Mode.READ_COMMITTED}, ); const elapsed = performance.now() - start; - this.#lc.debug?.( + this.#lc.info?.( `flushed ${rows} rows@${versionString(rowsVersion)} (${elapsed} ms)`, ); this.#recordAsyncFlushStats(rows, elapsed); @@ -269,12 +269,13 @@ export class RowRecordCache { // Note: apply() may have called while the transaction was committing, // which will result in looping to commit the next #pendingRowsVersion. } - this.#lc.debug?.( + this.#lc.info?.( `up to date rows@${versionToNullableCookie(this.#flushedRowsVersion)}`, ); flushing.resolve(); this.#flushing = null; } catch (e) { + this.#lc.info?.(`row record flush failed`, e); flushing.reject(e); this.#failService(e); } @@ -355,7 +356,7 @@ export class RowRecordCache { } const totalMs = Date.now() - startMs; - lc.debug?.( + lc.info?.( `finished row catchup (flush: ${flushMs} ms, total: ${totalMs} ms)`, ); } @@ -423,7 +424,7 @@ export class RowRecordCache { "refCounts" = excluded."refCounts" `, ); - lc.debug?.( + lc.info?.( `flushing ${rowUpdates.size} rows (${rowRecordRows.length} inserts, ${ rowUpdates.size - rowRecordRows.length } deletes)`, From e7b004b05300f42fccae11215d237eb991a47389 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Fri, 13 Mar 2026 15:15:50 -1000 Subject: [PATCH 142/495] fix(zero): Dupe relationship causes "Node does not exist" in ArrayView (#5597) User report: https://discord.com/channels/830183651022471199/1472129097571373203 --- .../src/client/zero-poke-handler.test.ts | 77 ++++++ .../src/client/zero-poke-handler.ts | 6 +- packages/zero-client/src/client/zero.ts | 14 +- packages/zql/src/builder/builder.test.ts | 88 +++++++ packages/zql/src/builder/builder.ts | 5 + packages/zql/src/ivm/array-view.test.ts | 241 ++++++++++++++++++ 6 files changed, 424 insertions(+), 7 deletions(-) diff --git a/packages/zero-client/src/client/zero-poke-handler.test.ts b/packages/zero-client/src/client/zero-poke-handler.test.ts index db9159e5fb..d99922cf40 100644 --- a/packages/zero-client/src/client/zero-poke-handler.test.ts +++ b/packages/zero-client/src/client/zero-poke-handler.test.ts @@ -943,6 +943,7 @@ describe('poke handler', () => { expect(setTimeoutStub).toHaveBeenCalledTimes(2); expect(onPokeErrorStub).toHaveBeenCalledTimes(1); + expect(onPokeErrorStub).toHaveBeenCalledWith('error in poke'); const timeoutCallback1 = setTimeoutStub.mock .calls[1][0] as () => Promise; @@ -952,6 +953,82 @@ describe('poke handler', () => { expect(setTimeoutStub).toHaveBeenCalledTimes(2); }); + test('onPokeError receives the actual error for non-cookie errors', async () => { + const onPokeErrorStub = vi.fn(); + const replicachePokeStub = vi.fn(); + const clientID = 'c1'; + const logContext = new LogContext('error'); + const pokeHandler = new PokeHandler( + replicachePokeStub, + onPokeErrorStub, + clientID, + schema, + logContext, + new MutationTracker(logContext, ackMutationResponses, onFatalError), + ); + + pokeHandler.handlePokeStart({pokeID: 'poke1', baseCookie: '1'}); + pokeHandler.handlePokePart({ + pokeID: 'poke1', + rowsPatch: [ + { + op: 'put', + tableName: 'issues', + value: {issue_id: 'i1', title: 'test'}, + }, + ], + }); + pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); + + const ivmError = new Error('node does not exist'); + replicachePokeStub.mockRejectedValue(ivmError); + + const timeoutCallback = setTimeoutStub.mock + .calls[0][0] as () => Promise; + await timeoutCallback(); + + expect(onPokeErrorStub).toHaveBeenCalledTimes(1); + expect(onPokeErrorStub).toHaveBeenCalledWith(ivmError); + }); + + test('onPokeError receives the actual error for cookie mismatch errors', async () => { + const onPokeErrorStub = vi.fn(); + const replicachePokeStub = vi.fn(); + const clientID = 'c1'; + const logContext = new LogContext('error'); + const pokeHandler = new PokeHandler( + replicachePokeStub, + onPokeErrorStub, + clientID, + schema, + logContext, + new MutationTracker(logContext, ackMutationResponses, onFatalError), + ); + + pokeHandler.handlePokeStart({pokeID: 'poke1', baseCookie: '1'}); + pokeHandler.handlePokePart({ + pokeID: 'poke1', + rowsPatch: [ + { + op: 'put', + tableName: 'issues', + value: {issue_id: 'i1', title: 'test'}, + }, + ], + }); + pokeHandler.handlePokeEnd({pokeID: 'poke1', cookie: '2'}); + + const cookieError = new Error('unexpected base cookie for poke: {...}'); + replicachePokeStub.mockRejectedValue(cookieError); + + const timeoutCallback = setTimeoutStub.mock + .calls[0][0] as () => Promise; + await timeoutCallback(); + + expect(onPokeErrorStub).toHaveBeenCalledTimes(1); + expect(onPokeErrorStub).toHaveBeenCalledWith(cookieError); + }); + test('cookie gap during mergePoke calls onPokeError and clears', async () => { const onPokeErrorStub = vi.fn(); const replicachePokeStub = vi.fn(); diff --git a/packages/zero-client/src/client/zero-poke-handler.ts b/packages/zero-client/src/client/zero-poke-handler.ts index 9c2510f8af..b41c2e37cd 100644 --- a/packages/zero-client/src/client/zero-poke-handler.ts +++ b/packages/zero-client/src/client/zero-poke-handler.ts @@ -46,7 +46,7 @@ type PokeAccumulator = { */ export class PokeHandler { readonly #replicachePoke: (poke: PokeInternal) => Promise; - readonly #onPokeError: () => void; + readonly #onPokeError: (error: unknown) => void; readonly #clientID: ClientID; readonly #lc: LogContext; #receivingPoke: Omit | undefined = undefined; @@ -62,7 +62,7 @@ export class PokeHandler { constructor( replicachePoke: (poke: PokeInternal) => Promise, - onPokeError: () => void, + onPokeError: (error: unknown) => void, clientID: ClientID, schema: Schema, lc: LogContext, @@ -203,7 +203,7 @@ export class PokeHandler { this.#lc.error?.('clearing due to unexpected poke error', e); } this.#clear(); - this.#onPokeError(); + this.#onPokeError(e); } #clear() { diff --git a/packages/zero-client/src/client/zero.ts b/packages/zero-client/src/client/zero.ts index b280bf7b71..8b4d7a3397 100644 --- a/packages/zero-client/src/client/zero.ts +++ b/packages/zero-client/src/client/zero.ts @@ -779,7 +779,7 @@ export class Zero< this.#pokeHandler = new PokeHandler( poke => this.#rep.poke(poke), - () => this.#onPokeError(), + e => this.#onPokeError(e), rep.clientID, schema, this.#lc, @@ -1773,7 +1773,7 @@ export class Zero< this.#pokeHandler.handlePokeEnd(pokeMessage[1]); } - #onPokeError(): void { + #onPokeError(error: unknown): void { const lc = this.#lc; lc.info?.( 'poke error, disconnecting?', @@ -1784,11 +1784,17 @@ export class Zero< // async poke above. Only disconnect if we are not already // disconnected. if (!this.#connectionManager.is(ConnectionStatus.Disconnected)) { + const errorStr = String(error); + const isBaseCookieError = errorStr.includes('unexpected base cookie'); this.#disconnect( lc, new ClientError({ - kind: ClientErrorKind.UnexpectedBaseCookie, - message: 'Server returned unexpected base cookie during sync', + kind: isBaseCookieError + ? ClientErrorKind.UnexpectedBaseCookie + : ClientErrorKind.Internal, + message: isBaseCookieError + ? 'Server returned unexpected base cookie during sync' + : `Poke processing error: ${errorStr}`, }), ); } diff --git a/packages/zql/src/builder/builder.test.ts b/packages/zql/src/builder/builder.test.ts index 22f34331a3..48c9dd2496 100644 --- a/packages/zql/src/builder/builder.test.ts +++ b/packages/zql/src/builder/builder.test.ts @@ -2871,3 +2871,91 @@ test('graceful fallback when planner encounters too many joins', () => { const result = sink.fetch(); expect(result[0]).toBeDefined(); }); + +test('duplicate relationship alias uses last-writer-wins', () => { + const {sources, delegate} = testBuilderDelegate(); + + // Query with two related subqueries using the same alias. + // The second (filtered) one should win via LWW. + const sink = new Catch( + buildPipeline( + { + table: 'users', + orderBy: [['id', 'asc']], + related: [ + // First: unfiltered userStates - should be DROPPED + { + system: 'client', + correlation: {parentField: ['id'], childField: ['userID']}, + subquery: { + table: 'userStates', + alias: 'states', + orderBy: [['stateCode', 'asc']], + }, + }, + // Second: filtered userStates - should WIN + { + system: 'client', + correlation: {parentField: ['id'], childField: ['userID']}, + subquery: { + table: 'userStates', + alias: 'states', + orderBy: [['stateCode', 'asc']], + where: { + type: 'simple', + left: {type: 'column', name: 'stateCode'}, + op: '=', + right: {type: 'literal', value: 'CA'}, + }, + }, + }, + ], + }, + delegate, + 'query-id', + ), + ); + + const result = sink.fetch(); + + // User 1 (aaron) has userStates: HI - no CA, so filtered to empty + const user1 = result.find(n => n !== 'yield' && n.row.id === 1); + expect(user1 !== 'yield' && user1?.relationships.states).toEqual([]); + + // User 3 (greg) has userStates: AZ, CA - filtered to just CA + const user3 = result.find(n => n !== 'yield' && n.row.id === 3); + expect(user3 !== 'yield' && user3?.relationships.states.length).toBe(1); + const user3State = user3 !== 'yield' && user3?.relationships.states[0]; + expect(user3State !== 'yield' && user3State && user3State.row.stateCode).toBe( + 'CA', + ); + + // User 6 (darick) has userStates: CA - filtered to CA + const user6 = result.find(n => n !== 'yield' && n.row.id === 6); + expect(user6 !== 'yield' && user6?.relationships.states.length).toBe(1); + const user6State = user6 !== 'yield' && user6?.relationships.states[0]; + expect(user6State !== 'yield' && user6State && user6State.row.stateCode).toBe( + 'CA', + ); + + // Verify push also works correctly - only the filtered relationship exists + // Add a userState that doesn't match the filter - should not propagate + consume( + sources.userStates.push({ + type: 'add', + row: {userID: 1, stateCode: 'NY'}, + }), + ); + // No push should be received (filtered out) + expect(sink.pushes).toEqual([]); + + // Add a userState that matches the filter - should propagate + consume( + sources.userStates.push({ + type: 'add', + row: {userID: 1, stateCode: 'CA'}, + }), + ); + expect(sink.pushes.length).toBe(1); + expect(sink.pushes[0].type).toBe('child'); +}); diff --git a/packages/zql/src/builder/builder.ts b/packages/zql/src/builder/builder.ts index e655c7b853..f399ab95c0 100644 --- a/packages/zql/src/builder/builder.ts +++ b/packages/zql/src/builder/builder.ts @@ -345,7 +345,12 @@ function buildPipelineInternal( } if (ast.related) { + // Dedupe by alias - last one wins (LWW), like limit(5).limit(10) + const byAlias = new Map(); for (const csq of ast.related) { + byAlias.set(csq.subquery.alias ?? '', csq); + } + for (const csq of byAlias.values()) { end = applyCorrelatedSubQuery(csq, delegate, queryID, end, name, false); } } diff --git a/packages/zql/src/ivm/array-view.test.ts b/packages/zql/src/ivm/array-view.test.ts index e92dbf9ac5..9c07f14745 100644 --- a/packages/zql/src/ivm/array-view.test.ts +++ b/packages/zql/src/ivm/array-view.test.ts @@ -4,7 +4,10 @@ import {assertArray, unreachable} from '../../../shared/src/asserts.ts'; import type {ReadonlyJSONValue} from '../../../shared/src/json.ts'; import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; import {stringCompare} from '../../../shared/src/string-compare.ts'; +import type {AST} from '../../../zero-protocol/src/ast.ts'; import type {ErroredQuery} from '../../../zero-protocol/src/custom-queries.ts'; +import {buildPipeline} from '../builder/builder.ts'; +import {TestBuilderDelegate} from '../builder/test-builder-delegate.ts'; import type {ResultType} from '../query/typed-view.ts'; import {ArrayView} from './array-view.ts'; import type {Change} from './change.ts'; @@ -2086,3 +2089,241 @@ test('error state persists through flush operations', async () => { expect(lastResultType).toBe('error'); expect(callCount).toBeGreaterThan(callsAfterError); }); + +/** + * Tests that duplicate relationship aliases are handled via LWW (last writer wins). + * + * When the same alias is used for two related subqueries, only the last one + * is used - earlier ones are dropped. This is consistent with other LWW + * behaviors like limit(5).limit(10) where the second limit wins. + */ +test('duplicate relationship alias uses last-writer-wins', () => { + const users = createSource( + lc, + testLogConfig, + 'users', + {id: {type: 'string'}, name: {type: 'string'}}, + ['id'], + ); + + const candidateJobConnections = createSource( + lc, + testLogConfig, + 'candidate_job_connections', + { + id: {type: 'string'}, + candidate_id: {type: 'string'}, + job_id: {type: 'string'}, + }, + ['id'], + ); + + // Add user AND cjc BEFORE pipeline + // The cjc has job_id='other-job', which won't match the filter 'target-job' + consume(users.push({type: 'add', row: {id: 'user-1', name: 'Test User'}})); + consume( + candidateJobConnections.push({ + type: 'add', + row: {id: 'cjc-1', candidate_id: 'user-1', job_id: 'other-job'}, + }), + ); + + const sources = {users, candidate_job_connections: candidateJobConnections}; + const delegate = new TestBuilderDelegate(sources); + + // Build query with DUPLICATE alias "candidate_applications" + // The second (filtered) one should win via LWW + const ast: AST = { + table: 'users', + orderBy: [['id', 'asc']], + related: [ + // First: unfiltered - will be DROPPED due to LWW + { + system: 'client', + correlation: { + parentField: ['id'], + childField: ['candidate_id'], + }, + subquery: { + table: 'candidate_job_connections', + alias: 'candidate_applications', + orderBy: [['id', 'asc']], + }, + }, + // Second: filtered - WINS via LWW + { + system: 'client', + correlation: { + parentField: ['id'], + childField: ['candidate_id'], + }, + subquery: { + table: 'candidate_job_connections', + alias: 'candidate_applications', + orderBy: [['id', 'asc']], + where: { + type: 'simple', + left: {type: 'column', name: 'job_id'}, + right: {type: 'literal', value: 'target-job'}, + op: '=', + }, + }, + }, + ], + }; + + const pipeline = buildPipeline(ast, delegate, 'test-query'); + + const view = new ArrayView( + pipeline, + { + singular: false, + relationships: { + candidate_applications: {singular: false, relationships: {}}, + }, + }, + true, + () => {}, + ); + + let data: unknown[] = []; + view.addListener(entries => { + assertArray(entries); + data = [...entries]; + }); + + // Verify initial state - user exists with empty candidate_applications + // (cjc-1 doesn't match the filter, and only the filtered relationship exists) + expect(data).toHaveLength(1); + const user = data[0] as {id: string; candidate_applications: unknown[]}; + expect(user.id).toBe('user-1'); + expect(user.candidate_applications).toHaveLength(0); + + // Delete the cjc - should NOT throw because only the filtered Join exists, + // and the filtered source connection filters out the remove (predicate fails) + expect(() => { + consume( + candidateJobConnections.push({ + type: 'remove', + row: {id: 'cjc-1', candidate_id: 'user-1', job_id: 'other-job'}, + }), + ); + view.flush(); + }).not.toThrow(); +}); + +test('unique relationship aliases work correctly', () => { + const users = createSource( + lc, + testLogConfig, + 'users', + {id: {type: 'string'}, name: {type: 'string'}}, + ['id'], + ); + + const candidateJobConnections = createSource( + lc, + testLogConfig, + 'candidate_job_connections', + { + id: {type: 'string'}, + candidate_id: {type: 'string'}, + job_id: {type: 'string'}, + }, + ['id'], + ); + + consume(users.push({type: 'add', row: {id: 'user-1', name: 'Test User'}})); + consume( + candidateJobConnections.push({ + type: 'add', + row: {id: 'cjc-1', candidate_id: 'user-1', job_id: 'other-job'}, + }), + ); + + const sources = {users, candidate_job_connections: candidateJobConnections}; + const delegate = new TestBuilderDelegate(sources); + + // Build query with UNIQUE aliases + const ast: AST = { + table: 'users', + orderBy: [['id', 'asc']], + related: [ + { + system: 'client', + correlation: { + parentField: ['id'], + childField: ['candidate_id'], + }, + subquery: { + table: 'candidate_job_connections', + alias: 'all_applications', + orderBy: [['id', 'asc']], + }, + }, + { + system: 'client', + correlation: { + parentField: ['id'], + childField: ['candidate_id'], + }, + subquery: { + table: 'candidate_job_connections', + alias: 'this_job_application', + orderBy: [['id', 'asc']], + where: { + type: 'simple', + left: {type: 'column', name: 'job_id'}, + right: {type: 'literal', value: 'target-job'}, + op: '=', + }, + }, + }, + ], + }; + + const pipeline = buildPipeline(ast, delegate, 'test-query'); + + const view = new ArrayView( + pipeline, + { + singular: false, + relationships: { + all_applications: {singular: false, relationships: {}}, + this_job_application: {singular: false, relationships: {}}, + }, + }, + true, + () => {}, + ); + + let data: unknown[] = []; + view.addListener(entries => { + assertArray(entries); + data = [...entries]; + }); + + expect(data).toHaveLength(1); + const user = data[0] as { + id: string; + all_applications: unknown[]; + this_job_application: unknown[]; + }; + expect(user.id).toBe('user-1'); + expect(user.all_applications).toHaveLength(1); + expect(user.this_job_application).toHaveLength(0); + + // Delete should work fine with unique aliases + expect(() => { + consume( + candidateJobConnections.push({ + type: 'remove', + row: {id: 'cjc-1', candidate_id: 'user-1', job_id: 'other-job'}, + }), + ); + view.flush(); + }).not.toThrow(); + + const userAfter = data[0] as {all_applications: unknown[]}; + expect(userAfter.all_applications).toHaveLength(0); +}); From 01add6bf7eefb9ef0453e15cf180bcd207eb25f3 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Mon, 16 Mar 2026 18:25:08 +0100 Subject: [PATCH 143/495] chore: Format (#5658) The format had drifted. Most likely because turbo didn't rerun? --- package-lock.json | 1472 +++++++++++++---- package.json | 2 +- packages/replicache/src/scan-iterator.ts | 18 +- packages/shared/src/record-proxy.ts | 6 +- packages/zero-cache/src/workers/connection.ts | 6 +- packages/zero-client/src/client/custom.ts | 6 +- packages/zero-server/src/adapters/drizzle.ts | 10 +- packages/zero-server/src/adapters/pg.ts | 4 +- .../zero-server/src/adapters/postgresjs.ts | 12 +- packages/zero-server/src/adapters/prisma.ts | 12 +- packages/zero-server/src/custom.ts | 7 +- packages/zero-server/src/zql-database.ts | 7 +- packages/zql/src/mutate/custom.ts | 5 +- packages/zql/src/query/query-impl.ts | 8 +- packages/zql/src/query/query.ts | 6 +- packages/zql/src/query/runnable-query-impl.ts | 8 +- 16 files changed, 1169 insertions(+), 420 deletions(-) diff --git a/package-lock.json b/package-lock.json index 94cd1e1ce1..6794914342 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "baseline-browser-mapping": "^2.9.6", "oxlint": "^1.50.0", "oxlint-tsgolint": "^0.14.2", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "tsx": "^4.21.0", "turbo": "^2.4.4", "vitest": "4.0.15" @@ -207,7 +207,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -235,7 +234,6 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -395,7 +393,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -498,6 +495,7 @@ "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -713,7 +711,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -1777,7 +1774,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2131,6 +2127,7 @@ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -2147,6 +2144,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2160,6 +2158,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2175,6 +2174,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2184,7 +2184,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -2192,6 +2193,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -2202,6 +2204,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -2212,6 +2215,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2319,6 +2323,7 @@ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2337,6 +2342,7 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2365,6 +2371,7 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2378,6 +2385,7 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2391,6 +2399,7 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2404,6 +2413,7 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2420,6 +2430,7 @@ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2448,6 +2459,7 @@ "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2464,6 +2476,7 @@ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2510,6 +2523,7 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2523,6 +2537,7 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2551,6 +2566,7 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2564,6 +2580,7 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2577,6 +2594,7 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2590,6 +2608,7 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2603,6 +2622,7 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2616,6 +2636,7 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2629,6 +2650,7 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2645,6 +2667,7 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2963,6 +2986,7 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -3890,6 +3914,7 @@ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -4116,7 +4141,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -4139,7 +4163,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -6656,7 +6679,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6872,7 +6894,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7385,7 +7406,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7487,8 +7507,7 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.6", @@ -8402,6 +8421,7 @@ "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -8413,6 +8433,7 @@ "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -8435,6 +8456,7 @@ "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -8458,6 +8480,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8476,6 +8499,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -8486,6 +8510,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8502,6 +8527,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8518,7 +8544,8 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/config/node_modules/@babel/code-frame": { "version": "7.10.4", @@ -8526,6 +8553,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8536,6 +8564,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -8554,6 +8583,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -8564,6 +8594,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -8580,6 +8611,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -8597,6 +8629,7 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8608,6 +8641,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8618,6 +8652,7 @@ "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8632,6 +8667,7 @@ "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -8654,7 +8690,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/fingerprint/node_modules/brace-expansion": { "version": "2.0.2", @@ -8662,6 +8699,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8672,6 +8710,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8688,6 +8727,7 @@ "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8707,6 +8747,7 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8717,6 +8758,7 @@ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -8730,6 +8772,7 @@ "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -8741,6 +8784,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8751,6 +8795,7 @@ "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -8771,6 +8816,7 @@ "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -8792,6 +8838,7 @@ "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -8806,6 +8853,7 @@ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -8821,6 +8869,7 @@ "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -8832,14 +8881,16 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8847,6 +8898,7 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8859,14 +8911,16 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/xcpretty": { "version": "4.3.2", @@ -8874,6 +8928,7 @@ "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -8890,6 +8945,7 @@ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -8900,6 +8956,7 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8917,6 +8974,7 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8933,6 +8991,7 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9583,6 +9642,7 @@ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -9596,6 +9656,7 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -9606,6 +9667,7 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9623,6 +9685,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -9633,6 +9696,7 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9643,6 +9707,7 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9657,6 +9722,7 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9671,6 +9737,7 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9684,6 +9751,7 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9700,6 +9768,7 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9712,6 +9781,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -9722,6 +9792,7 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9735,6 +9806,7 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9751,6 +9823,7 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9781,6 +9854,7 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9808,6 +9882,7 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10136,7 +10211,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10259,7 +10333,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10493,7 +10566,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10590,7 +10662,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12730,7 +12801,6 @@ "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.2.0" }, @@ -13118,6 +13188,7 @@ "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13128,6 +13199,7 @@ "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -13142,6 +13214,7 @@ "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -13202,6 +13275,7 @@ "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -13225,6 +13299,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13246,6 +13321,7 @@ "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -13277,6 +13353,7 @@ "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13287,6 +13364,7 @@ "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -13311,6 +13389,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13328,6 +13407,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13338,6 +13418,7 @@ "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13348,6 +13429,7 @@ "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -13362,6 +13444,7 @@ "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -13385,6 +13468,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -13402,6 +13486,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13412,6 +13497,7 @@ "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13422,6 +13508,7 @@ "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13431,7 +13518,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@react-stately/utils": { "version": "3.10.4", @@ -13838,7 +13926,6 @@ "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -14061,6 +14148,7 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -14071,6 +14159,7 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -15067,7 +15156,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15201,7 +15289,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", "license": "MIT", - "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.19" }, @@ -15219,7 +15306,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -15321,7 +15407,6 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15721,6 +15806,7 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -15861,7 +15947,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15895,7 +15980,6 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -15953,7 +16037,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -16104,7 +16187,8 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -16176,6 +16260,7 @@ "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -16187,6 +16272,7 @@ "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -16466,7 +16552,6 @@ "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -16490,7 +16575,6 @@ "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -16846,6 +16930,7 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" } @@ -16966,7 +17051,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -17052,7 +17136,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17114,7 +17197,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -17156,7 +17238,8 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ansi-align": { "version": "3.0.1", @@ -17449,7 +17532,8 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/asn1": { "version": "0.2.6", @@ -17552,7 +17636,8 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/async-listen": { "version": "3.0.0", @@ -17694,6 +17779,7 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -17742,6 +17828,7 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -17760,6 +17847,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17781,6 +17869,7 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17796,6 +17885,7 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -17898,6 +17988,7 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -17907,7 +17998,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.29.1", @@ -17915,6 +18007,7 @@ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.29.1" } @@ -17925,6 +18018,7 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -17935,6 +18029,7 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -17962,6 +18057,7 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -18193,6 +18289,7 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -18206,6 +18303,7 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">=0.6" } @@ -18472,6 +18570,7 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -18482,6 +18581,7 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -18540,7 +18640,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -18561,6 +18660,7 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -18738,6 +18838,7 @@ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -18751,6 +18852,7 @@ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -18761,6 +18863,7 @@ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -19013,6 +19116,7 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19041,6 +19145,7 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19139,6 +19244,7 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -19151,6 +19257,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "peer": true, "engines": { "node": ">=6" }, @@ -19196,6 +19303,7 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8" } @@ -20456,7 +20564,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -20696,6 +20803,7 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -21119,6 +21227,7 @@ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "dotenv": "^16.4.5" }, @@ -21497,6 +21606,7 @@ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -21515,6 +21625,7 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -21593,7 +21704,6 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22293,7 +22403,8 @@ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/execa": { "version": "5.1.1", @@ -22342,6 +22453,7 @@ "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -22360,6 +22472,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -22370,6 +22483,7 @@ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.16.0" } @@ -22379,7 +22493,8 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/express": { "version": "4.22.1", @@ -22738,6 +22853,7 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", + "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -22751,6 +22867,7 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "bser": "2.1.1" } @@ -23034,7 +23151,8 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -23061,7 +23179,8 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/for-each": { "version": "0.3.5", @@ -23158,6 +23277,7 @@ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23376,6 +23496,7 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -23457,6 +23578,7 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -24092,14 +24214,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-parser": { "version": "0.29.1", @@ -24107,6 +24231,7 @@ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.29.1" } @@ -24146,7 +24271,6 @@ "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -24592,6 +24716,7 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -24837,6 +24962,7 @@ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -25211,6 +25337,7 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -25228,6 +25355,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -25303,6 +25431,7 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -25321,6 +25450,7 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25331,6 +25461,7 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -25357,6 +25488,7 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -25378,6 +25510,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25391,6 +25524,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25405,7 +25539,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-mock": { "version": "29.7.0", @@ -25413,6 +25548,7 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -25428,6 +25564,7 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -25455,6 +25592,7 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -25473,6 +25611,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25486,6 +25625,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -25500,7 +25640,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-worker": { "version": "29.7.0", @@ -25537,7 +25678,8 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jiti": { "version": "1.21.0", @@ -25616,7 +25758,8 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/jsdom": { "version": "26.1.0", @@ -25745,7 +25888,8 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -25849,6 +25993,7 @@ "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -25972,6 +26117,7 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -25983,6 +26129,7 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -25992,7 +26139,8 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lightningcss": { "version": "1.30.2", @@ -26038,6 +26186,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26059,6 +26208,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26080,6 +26230,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26101,6 +26252,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26122,6 +26274,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26143,6 +26296,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26164,6 +26318,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26185,6 +26340,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26206,6 +26362,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26227,6 +26384,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26248,6 +26406,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26350,7 +26509,8 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -26364,6 +26524,7 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -26377,6 +26538,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -26390,6 +26552,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26405,6 +26568,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -26414,7 +26578,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -26422,6 +26587,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -26432,6 +26598,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -26442,6 +26609,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -26578,7 +26746,6 @@ "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -26612,6 +26779,7 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -26672,7 +26840,8 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -27061,7 +27230,8 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/merge-anything": { "version": "5.1.7", @@ -27117,6 +27287,7 @@ "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -27172,6 +27343,7 @@ "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -27188,6 +27360,7 @@ "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -27204,6 +27377,7 @@ "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27217,6 +27391,7 @@ "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -27237,6 +27412,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -27247,6 +27423,7 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -27263,6 +27440,7 @@ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -27277,6 +27455,7 @@ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -27291,6 +27470,7 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -27305,6 +27485,7 @@ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -27315,6 +27496,7 @@ "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27330,6 +27512,7 @@ "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27351,6 +27534,7 @@ "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27365,6 +27549,7 @@ "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27378,6 +27563,7 @@ "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27392,6 +27578,7 @@ "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27414,6 +27601,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27424,6 +27612,7 @@ "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27445,6 +27634,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27455,6 +27645,7 @@ "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27473,6 +27664,7 @@ "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27497,7 +27689,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", @@ -27505,6 +27698,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -27515,6 +27709,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -27528,6 +27723,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27538,6 +27734,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28554,7 +28751,6 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10.x" } @@ -28612,8 +28808,7 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", @@ -28658,7 +28853,6 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -28772,7 +28966,8 @@ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/netmask": { "version": "2.0.2", @@ -28903,7 +29098,8 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/node-releases": { "version": "2.0.27", @@ -28952,6 +29148,7 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -28968,6 +29165,7 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -28980,7 +29178,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -29068,7 +29267,8 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/nwsapi": { "version": "2.2.22", @@ -29103,6 +29303,7 @@ "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29289,6 +29490,7 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -29307,6 +29509,7 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -29317,6 +29520,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -29330,6 +29534,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29345,6 +29550,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -29354,7 +29560,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -29362,6 +29569,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -29372,6 +29580,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -29382,6 +29591,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -29395,6 +29605,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -29500,7 +29711,6 @@ "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -29536,6 +29746,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -29660,6 +29871,7 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -29844,6 +30056,7 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -29915,6 +30128,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -30005,7 +30219,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -30236,7 +30449,6 @@ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright-core": "1.53.2" }, @@ -30268,6 +30480,7 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -30283,6 +30496,7 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0.0" } @@ -30329,7 +30543,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31466,7 +31679,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31616,9 +31828,9 @@ } }, "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -31636,6 +31848,7 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -31725,7 +31938,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -31768,6 +31980,7 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -31815,6 +32028,7 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.4.0" } @@ -31825,6 +32039,7 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -32058,6 +32273,7 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, + "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -32083,6 +32299,7 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -32232,7 +32449,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32246,6 +32462,7 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -32257,6 +32474,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -32278,7 +32496,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32353,7 +32570,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -32428,7 +32644,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -33145,6 +33360,7 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, + "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -33160,6 +33376,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "path-parse": "^1.0.5" } @@ -33211,6 +33428,7 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "global-dirs": "^0.1.1" }, @@ -33224,6 +33442,7 @@ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -33250,7 +33469,8 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/resolve.exports": { "version": "2.0.3", @@ -33258,6 +33478,7 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -33283,6 +33504,7 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -33297,6 +33519,7 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -33307,6 +33530,7 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -33385,7 +33609,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33594,7 +33817,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -33792,6 +34014,7 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -33810,7 +34033,6 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" } @@ -34178,6 +34400,7 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -34267,6 +34490,7 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -34351,7 +34575,6 @@ "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -34557,6 +34780,7 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -34570,6 +34794,7 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -34586,7 +34811,8 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -34594,6 +34820,7 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34607,6 +34834,7 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=8" } @@ -34637,6 +34865,7 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">= 0.10.0" } @@ -34808,7 +35037,8 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/style-to-js": { "version": "1.1.21", @@ -34894,6 +35124,7 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -35004,7 +35235,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35151,6 +35381,7 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -35161,6 +35392,7 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -35177,7 +35409,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -35384,7 +35615,8 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/throttleit": { "version": "2.1.0", @@ -35486,7 +35718,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -35548,7 +35779,8 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -35725,15 +35957,13 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -36364,6 +36594,7 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -36475,7 +36706,6 @@ "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 18" }, @@ -37180,6 +37410,7 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -37258,7 +37489,6 @@ "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -37504,7 +37734,8 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -37525,6 +37756,7 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -37557,6 +37789,7 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -37572,7 +37805,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -37991,7 +38223,8 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/whatwg-mimetype": { "version": "4.0.0", @@ -38019,6 +38252,7 @@ "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -38034,6 +38268,7 @@ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=8" } @@ -38175,7 +38410,8 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/wordwrapjs": { "version": "5.1.0", @@ -38256,7 +38492,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -38317,6 +38552,7 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -38331,6 +38567,7 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -38375,6 +38612,7 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -38389,6 +38627,7 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0" } @@ -38399,6 +38638,7 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0" } @@ -38487,6 +38727,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -38625,6 +38866,7 @@ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", + "peer": true, "peerDependencies": { "zod": "^3.24.1" } @@ -38951,7 +39193,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -39052,6 +39293,7 @@ "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -39140,6 +39382,7 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -39150,6 +39393,7 @@ "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -39172,6 +39416,7 @@ "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -39195,6 +39440,7 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -39218,6 +39464,7 @@ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -39256,6 +39503,7 @@ "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -39278,6 +39526,7 @@ "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -39304,6 +39553,7 @@ "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39314,6 +39564,7 @@ "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -39328,6 +39579,7 @@ "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -39388,6 +39640,7 @@ "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -39410,6 +39663,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -39422,6 +39676,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -39443,6 +39698,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39456,6 +39712,7 @@ "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -39487,6 +39744,7 @@ "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39497,6 +39755,7 @@ "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -39521,6 +39780,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39543,6 +39803,7 @@ "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39553,6 +39814,7 @@ "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -39567,6 +39829,7 @@ "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -39590,6 +39853,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -39600,6 +39864,7 @@ "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39610,6 +39875,7 @@ "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -39619,7 +39885,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/@react-native/virtualized-lists": { "version": "0.83.1", @@ -39627,6 +39894,7 @@ "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -39651,6 +39919,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -39663,7 +39932,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/babel-preset-expo": { "version": "54.0.10", @@ -39671,6 +39941,7 @@ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -39715,6 +39986,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -39725,6 +39997,7 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -39735,6 +40008,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -39799,6 +40073,7 @@ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -39815,6 +40090,7 @@ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -39830,6 +40106,7 @@ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -39857,6 +40134,7 @@ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -39868,6 +40146,7 @@ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -39885,6 +40164,7 @@ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -39914,6 +40194,7 @@ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -39932,6 +40213,7 @@ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -39947,14 +40229,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/lru-cache": { "version": "11.2.4", @@ -39962,6 +40246,7 @@ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -39972,6 +40257,7 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -40027,6 +40313,7 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -40043,6 +40330,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40053,6 +40341,7 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -40069,6 +40358,7 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40082,6 +40372,7 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -40102,6 +40393,7 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -40117,6 +40409,7 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -40138,6 +40431,7 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -40152,6 +40446,7 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40165,6 +40460,7 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -40179,6 +40475,7 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -40201,6 +40498,7 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -40222,6 +40520,7 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40240,6 +40539,7 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -40264,7 +40564,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/metro/node_modules/hermes-parser": { "version": "0.32.0", @@ -40272,6 +40573,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40282,6 +40584,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40304,6 +40607,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -40314,6 +40618,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -40327,6 +40632,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -40343,6 +40649,7 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -40356,6 +40663,7 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -40369,6 +40677,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -40386,6 +40695,7 @@ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -40403,6 +40713,7 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -40430,6 +40741,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -40445,6 +40757,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -40470,7 +40783,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native": { "version": "0.83.1", @@ -40538,6 +40852,7 @@ "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -40559,7 +40874,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -40567,6 +40883,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -40577,6 +40894,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -40588,6 +40906,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -40599,6 +40918,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40620,6 +40940,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -40630,6 +40951,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -40643,6 +40965,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -40664,14 +40987,16 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/source-map": { "version": "0.5.7", @@ -40679,6 +41004,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -40689,6 +41015,7 @@ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -40720,6 +41047,7 @@ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18.17" } @@ -40730,6 +41058,7 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -41246,6 +41575,7 @@ "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -41335,6 +41665,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41352,6 +41683,7 @@ "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -41374,6 +41706,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41391,6 +41724,7 @@ "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -41429,6 +41763,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41446,6 +41781,7 @@ "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -41468,6 +41804,7 @@ "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -41494,6 +41831,7 @@ "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -41516,6 +41854,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -41528,6 +41867,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -41549,6 +41889,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -41559,6 +41900,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -41572,6 +41914,7 @@ "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -41595,7 +41938,8 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/babel-preset-expo": { "version": "54.0.4", @@ -41603,6 +41947,7 @@ "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -41647,6 +41992,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -41697,6 +42043,7 @@ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -41707,6 +42054,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -41771,6 +42119,7 @@ "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -41787,6 +42136,7 @@ "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -41802,6 +42152,7 @@ "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -41829,6 +42180,7 @@ "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -41840,6 +42192,7 @@ "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -41901,7 +42254,8 @@ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/minimatch": { "version": "9.0.5", @@ -41909,6 +42263,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -41925,6 +42280,7 @@ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -41956,6 +42312,7 @@ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -41983,6 +42340,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -42004,6 +42362,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -42017,6 +42376,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -42032,6 +42392,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -42055,7 +42416,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native": { "version": "0.82.0", @@ -42122,7 +42484,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", @@ -42130,6 +42493,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -42140,6 +42504,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -42152,6 +42517,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -42173,6 +42539,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -42183,6 +42550,7 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -42196,6 +42564,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -42217,14 +42586,16 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/tar": { "version": "7.5.1", @@ -42232,6 +42603,7 @@ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -42263,6 +42635,7 @@ "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18.17" } @@ -42409,6 +42782,7 @@ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": ">=18" } @@ -42769,6 +43143,7 @@ "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", "dev": true, + "peer": true, "requires": {} }, "@ai-sdk/gateway": { @@ -42908,7 +43283,6 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", - "peer": true, "requires": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -43743,7 +44117,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -43985,6 +44358,7 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, + "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -43997,6 +44371,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -44006,6 +44381,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -44017,6 +44393,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -44025,25 +44402,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -44107,6 +44488,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", "dev": true, + "peer": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -44118,6 +44500,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44133,6 +44516,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44142,6 +44526,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44151,6 +44536,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -44160,6 +44546,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44169,6 +44556,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44186,6 +44574,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44195,6 +44584,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -44220,6 +44610,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44229,6 +44620,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44246,6 +44638,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44255,6 +44648,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44264,6 +44658,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -44273,6 +44668,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44282,6 +44678,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44291,6 +44688,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -44300,6 +44698,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44309,6 +44708,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -44487,6 +44887,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -45056,6 +45457,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -45180,14 +45582,12 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "peer": true + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -46221,7 +46621,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -46386,7 +46785,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "peer": true, "requires": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -46745,8 +47143,7 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "peer": true + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" }, "which": { "version": "4.0.0", @@ -46807,8 +47204,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true, - "peer": true + "dev": true }, "@electric-sql/pglite-socket": { "version": "0.0.6", @@ -47219,6 +47615,7 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" @@ -47229,6 +47626,7 @@ "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", @@ -47250,6 +47648,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47259,6 +47658,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47269,13 +47669,15 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47285,6 +47687,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47297,6 +47700,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "dev": true, + "peer": true, "requires": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", @@ -47319,6 +47723,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -47329,13 +47734,15 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -47345,6 +47752,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -47356,13 +47764,15 @@ "version": "54.0.10", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true + "dev": true, + "peer": true }, "@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, + "peer": true, "requires": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -47373,6 +47783,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "peer": true, "requires": { "ms": "^2.1.1" } @@ -47384,6 +47795,7 @@ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", "dev": true, + "peer": true, "requires": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -47397,6 +47809,7 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -47415,13 +47828,15 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -47431,6 +47846,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -47442,6 +47858,7 @@ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -47459,13 +47876,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true + "dev": true, + "peer": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -47477,6 +47896,7 @@ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" @@ -47487,6 +47907,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47498,6 +47919,7 @@ "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "dev": true, + "peer": true, "requires": { "ws": "^8.18.3", "zod": "^3.25.76", @@ -47509,6 +47931,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "dev": true, + "peer": true, "requires": { "metro": "0.83.1", "metro-babel-transformer": "0.83.1", @@ -47529,6 +47952,7 @@ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -47539,6 +47963,7 @@ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "dev": true, + "peer": true, "requires": { "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", @@ -47553,6 +47978,7 @@ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "dev": true, + "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", @@ -47563,19 +47989,22 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true + "dev": true, + "peer": true }, "@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true + "dev": true, + "peer": true }, "@expo/spawn-async": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.3" } @@ -47584,19 +48013,22 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true + "dev": true, + "peer": true }, "@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true + "dev": true, + "peer": true }, "@expo/xcpretty": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", @@ -47609,6 +48041,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "peer": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -47618,6 +48051,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -47628,6 +48062,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -47637,6 +48072,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -48140,6 +48576,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "peer": true, "requires": { "minipass": "^7.0.4" } @@ -48148,13 +48585,15 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true + "dev": true, + "peer": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "peer": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -48168,6 +48607,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -48176,13 +48616,15 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "peer": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -48193,6 +48635,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -48203,6 +48646,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -48212,6 +48656,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "requires": { "p-try": "^2.0.0" } @@ -48221,6 +48666,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -48231,13 +48677,15 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true + "dev": true, + "peer": true }, "@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3" } @@ -48247,6 +48695,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "peer": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -48259,6 +48708,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -48281,6 +48731,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -48304,6 +48755,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "peer": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -48527,7 +48979,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "peer": true, "requires": { "@types/mdx": "^2.0.0" } @@ -48621,8 +49072,7 @@ "@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "peer": true + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" }, "@noble/curves": { "version": "1.8.1", @@ -48801,8 +49251,7 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "peer": true + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, "@opentelemetry/api-logs": { "version": "0.203.0", @@ -48877,7 +49326,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", - "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -50095,7 +50543,6 @@ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", "dev": true, - "peer": true, "requires": { "@prisma/client-runtime-utils": "7.2.0" } @@ -50397,13 +50844,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.4" @@ -50414,6 +50863,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -50467,6 +50917,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50482,6 +50933,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50498,6 +50950,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", "dev": true, + "peer": true, "requires": { "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", @@ -50512,13 +50965,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true + "dev": true, + "peer": true }, "@react-native/dev-middleware": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.0", @@ -50539,6 +50994,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50549,6 +51005,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50559,13 +51016,15 @@ "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true + "dev": true, + "peer": true }, "@react-native/debugger-shell": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -50576,6 +51035,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.4", @@ -50595,6 +51055,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50605,6 +51066,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -50615,19 +51077,22 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/js-polyfills": { "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true + "dev": true, + "peer": true }, "@react-native/normalize-colors": { "version": "0.81.4", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true + "dev": true, + "peer": true }, "@react-stately/utils": { "version": "3.10.4", @@ -50740,6 +51205,7 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", @@ -50812,6 +51278,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50824,6 +51291,7 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", "dev": true, + "peer": true, "requires": { "chalk": "^4.1.2" }, @@ -50833,6 +51301,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50845,6 +51314,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -50874,6 +51344,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -50886,6 +51357,7 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", @@ -50904,6 +51376,7 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", "dev": true, + "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -50918,6 +51391,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -50933,6 +51407,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -50943,6 +51418,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -50957,6 +51433,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -50966,6 +51443,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -50977,6 +51455,7 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -50986,13 +51465,15 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "babel-preset-expo": { "version": "54.0.4", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -51023,6 +51504,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -51052,13 +51534,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true + "dev": true, + "peer": true }, "expo": { "version": "54.0.13", @@ -51095,6 +51579,7 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "dev": true, + "peer": true, "requires": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" @@ -51105,6 +51590,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.9", "@expo/env": "~2.0.7" @@ -51115,6 +51601,7 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", "dev": true, + "peer": true, "requires": {} }, "expo-font": { @@ -51132,6 +51619,7 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", "dev": true, + "peer": true, "requires": {} }, "expo-modules-core": { @@ -51139,6 +51627,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4" } @@ -51170,13 +51659,15 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true + "dev": true, + "peer": true }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -51186,6 +51677,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "peer": true, "requires": { "minipass": "^7.1.2" } @@ -51199,13 +51691,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true + "dev": true, + "peer": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -51216,7 +51710,8 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -51225,6 +51720,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -51235,7 +51731,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -51250,7 +51747,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true }, "react-native": { "version": "0.82.0", @@ -51300,13 +51798,15 @@ "version": "0.82.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -51316,6 +51816,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -51326,6 +51827,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -51340,6 +51842,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -51349,6 +51852,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -51358,6 +51862,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -51373,19 +51878,22 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true + "dev": true, + "peer": true }, "tar": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, + "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -51404,7 +51912,8 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true + "dev": true, + "peer": true }, "vite": { "version": "7.2.7", @@ -51450,7 +51959,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -51644,7 +52154,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -51820,6 +52329,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "peer": true, "requires": { "type-detect": "4.0.8" } @@ -51829,6 +52339,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "peer": true, "requires": { "@sinonjs/commons": "^3.0.0" } @@ -52480,7 +52991,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "requires": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -52563,7 +53073,6 @@ "version": "3.13.19", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", - "peer": true, "requires": { "@tanstack/virtual-core": "3.13.19" } @@ -52571,8 +53080,7 @@ "@tanstack/virtual-core": { "version": "3.13.19", "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", - "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", - "peer": true + "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==" }, "@tantaman/api-extractor": { "version": "7.52.13", @@ -52641,7 +53149,6 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, - "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -52986,6 +53493,7 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -53112,7 +53620,6 @@ "version": "22.18.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", - "peer": true, "requires": { "undici-types": "~6.21.0" }, @@ -53144,7 +53651,6 @@ "version": "8.15.4", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", - "peer": true, "requires": { "@types/node": "*", "pg-protocol": "*", @@ -53195,7 +53701,6 @@ "version": "18.3.23", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", - "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -53334,7 +53839,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "peer": true }, "@types/strip-ansi": { "version": "3.0.0", @@ -53397,6 +53903,7 @@ "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" @@ -53407,6 +53914,7 @@ "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "dev": true, + "peer": true, "requires": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" @@ -53614,7 +54122,6 @@ "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, - "peer": true, "requires": { "@vitest/mocker": "4.0.15", "@vitest/utils": "4.0.15", @@ -53639,7 +54146,6 @@ "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, - "peer": true, "requires": { "@vitest/browser": "4.0.15", "@vitest/mocker": "4.0.15", @@ -53897,7 +54403,8 @@ "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true + "dev": true, + "peer": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -53986,8 +54493,7 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "peer": true + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" }, "acorn-import-attributes": { "version": "1.9.5", @@ -54040,7 +54546,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -54084,7 +54589,6 @@ "version": "5.46.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", - "peer": true, "requires": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -54138,7 +54642,8 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true + "dev": true, + "peer": true }, "ansi-align": { "version": "3.0.1", @@ -54339,7 +54844,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "dev": true, + "peer": true }, "asn1": { "version": "0.2.6", @@ -54431,7 +54937,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "dev": true, + "peer": true }, "async-listen": { "version": "3.0.0", @@ -54515,6 +55022,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "peer": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -54547,6 +55055,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -54560,6 +55069,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -54574,6 +55084,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "peer": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -54587,6 +55098,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -54664,6 +55176,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, + "peer": true, "requires": { "@babel/types": "^7.26.0" } @@ -54672,13 +55185,15 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.29.1" } @@ -54688,6 +55203,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, + "peer": true, "requires": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -54697,6 +55213,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, + "peer": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -54720,6 +55237,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "peer": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -54869,6 +55387,7 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, + "peer": true, "requires": { "open": "^8.0.4" } @@ -54877,7 +55396,8 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true + "dev": true, + "peer": true }, "big.js": { "version": "5.2.2", @@ -55057,6 +55577,7 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, + "peer": true, "requires": { "stream-buffers": "2.2.x" } @@ -55066,6 +55587,7 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, + "peer": true, "requires": { "big-integer": "1.6.x" } @@ -55097,7 +55619,6 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "peer": true, "requires": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -55111,6 +55632,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "peer": true, "requires": { "node-int64": "^0.4.0" } @@ -55221,6 +55743,7 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, + "peer": true, "requires": { "callsites": "^2.0.0" }, @@ -55229,7 +55752,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -55238,6 +55762,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, + "peer": true, "requires": { "caller-callsite": "^2.0.0" } @@ -55397,6 +55922,7 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55414,6 +55940,7 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -55482,6 +56009,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -55490,7 +56018,8 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true + "dev": true, + "peer": true }, "cli-table3": { "version": "0.6.5", @@ -55533,7 +56062,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true + "dev": true, + "peer": true }, "clone-deep": { "version": "4.0.1", @@ -56333,8 +56863,7 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "peer": true + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-timer": { "version": "3.0.1", @@ -56504,6 +57033,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "peer": true, "requires": { "clone": "^1.0.2" } @@ -56789,6 +57319,7 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, + "peer": true, "requires": { "dotenv": "^16.4.5" } @@ -56974,7 +57505,8 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true + "dev": true, + "peer": true }, "error-ex": { "version": "1.3.2", @@ -56989,6 +57521,7 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, + "peer": true, "requires": { "stackframe": "^1.3.4" } @@ -57042,7 +57575,6 @@ "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "peer": true, "requires": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", @@ -57415,7 +57947,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true + "dev": true, + "peer": true }, "execa": { "version": "5.1.1", @@ -57449,6 +57982,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -57462,7 +57996,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -57470,13 +58005,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true + "dev": true, + "peer": true }, "exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true + "dev": true, + "peer": true }, "express": { "version": "4.22.1", @@ -57746,13 +58283,15 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true + "dev": true, + "peer": true }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "peer": true, "requires": { "bser": "2.1.1" } @@ -57941,7 +58480,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true + "dev": true, + "peer": true }, "follow-redirects": { "version": "1.15.11", @@ -57952,7 +58492,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true + "dev": true, + "peer": true }, "for-each": { "version": "0.3.5", @@ -58009,7 +58550,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true + "dev": true, + "peer": true }, "fresh": { "version": "0.5.2", @@ -58162,7 +58704,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "peer": true }, "get-port": { "version": "7.1.0", @@ -58212,7 +58755,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true + "dev": true, + "peer": true }, "giget": { "version": "2.0.0", @@ -58655,19 +59199,22 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true + "dev": true, + "peer": true }, "hermes-estree": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true + "dev": true, + "peer": true }, "hermes-parser": { "version": "0.29.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.29.1" } @@ -58704,8 +59251,7 @@ "version": "4.10.6", "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true, - "peer": true + "dev": true }, "hpack.js": { "version": "2.1.6", @@ -58999,6 +59545,7 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, + "peer": true, "requires": { "queue": "6.0.2" } @@ -59159,7 +59706,8 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true + "dev": true, + "peer": true }, "is-docker": { "version": "2.2.1", @@ -59376,6 +59924,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -59388,7 +59937,8 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59445,6 +59995,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -59458,13 +60009,15 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true + "dev": true, + "peer": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -59485,6 +60038,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -59501,13 +60055,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59518,7 +60074,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59527,6 +60084,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -59537,7 +60095,8 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true + "dev": true, + "peer": true }, "jest-util": { "version": "29.7.0", @@ -59557,6 +60116,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -59570,13 +60130,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -59587,7 +60149,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59616,7 +60179,8 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true + "dev": true, + "peer": true }, "jiti": { "version": "1.21.0", @@ -59680,7 +60244,8 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true + "dev": true, + "peer": true }, "jsdom": { "version": "26.1.0", @@ -59773,7 +60338,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "peer": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -59856,7 +60422,8 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true + "dev": true, + "peer": true }, "latest-version": { "version": "7.0.0", @@ -59949,6 +60516,7 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, + "peer": true, "requires": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -59959,6 +60527,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "requires": { "ms": "2.0.0" } @@ -59967,7 +60536,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true } } }, @@ -59997,77 +60567,88 @@ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-freebsd-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-arm64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-x64-gnu": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-linux-x64-musl": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-win32-arm64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lightningcss-win32-x64-msvc": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "lilconfig": { "version": "2.1.0", @@ -60154,7 +60735,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true + "dev": true, + "peer": true }, "lodash.uniq": { "version": "4.5.0", @@ -60166,6 +60748,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, + "peer": true, "requires": { "chalk": "^2.0.1" }, @@ -60175,6 +60758,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -60184,6 +60768,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -60195,6 +60780,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -60203,25 +60789,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -60311,7 +60901,6 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, - "peer": true, "requires": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", @@ -60337,6 +60926,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "peer": true, "requires": { "tmpl": "1.0.5" } @@ -60374,7 +60964,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true + "dev": true, + "peer": true }, "math-intrinsics": { "version": "1.1.0", @@ -60663,7 +61254,8 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true + "dev": true, + "peer": true }, "merge-anything": { "version": "5.1.7", @@ -60699,6 +61291,7 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -60746,19 +61339,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "peer": true, "requires": { "mime-db": "1.52.0" } @@ -60767,13 +61363,15 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -60783,6 +61381,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -60795,6 +61394,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", "dev": true, + "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -60807,6 +61407,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60816,6 +61417,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", "dev": true, + "peer": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -60832,6 +61434,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -60841,6 +61444,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, + "peer": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -60853,6 +61457,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, + "peer": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -60863,6 +61468,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -60873,6 +61479,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "peer": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -60882,7 +61489,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60891,6 +61499,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -60902,6 +61511,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", "dev": true, + "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -60919,6 +61529,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -60929,6 +61540,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -60938,6 +61550,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -60948,6 +61561,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -60965,7 +61579,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60974,6 +61589,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -60987,7 +61603,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60996,6 +61613,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61010,6 +61628,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -61644,8 +62263,7 @@ "version": "15.10.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true, - "peer": true + "dev": true }, "graphql-subscriptions": { "version": "1.2.1", @@ -61688,8 +62306,7 @@ "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "peer": true + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" }, "mri": { "version": "1.2.0", @@ -61720,7 +62337,6 @@ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, - "peer": true, "requires": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -61801,7 +62417,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true + "dev": true, + "peer": true }, "netmask": { "version": "2.0.2", @@ -61892,7 +62509,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "peer": true }, "node-releases": { "version": "2.0.27", @@ -61922,6 +62540,7 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, + "peer": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -61934,6 +62553,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, + "peer": true, "requires": { "lru-cache": "^10.0.1" } @@ -61942,7 +62562,8 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -62003,7 +62624,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true + "dev": true, + "peer": true }, "nwsapi": { "version": "2.2.22", @@ -62029,6 +62651,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -62148,6 +62771,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, + "peer": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -62161,13 +62785,15 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true + "dev": true, + "peer": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -62177,6 +62803,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -62188,6 +62815,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -62196,25 +62824,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -62224,6 +62856,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -62316,7 +62949,6 @@ "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.14.2.tgz", "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", "dev": true, - "peer": true, "requires": { "@oxlint-tsgolint/darwin-arm64": "0.14.2", "@oxlint-tsgolint/darwin-x64": "0.14.2", @@ -62341,6 +62973,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -62414,7 +63047,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "peer": true }, "pac-proxy-agent": { "version": "7.2.0", @@ -62551,6 +63185,7 @@ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, + "peer": true, "requires": { "pngjs": "^3.3.0" } @@ -62603,7 +63238,8 @@ "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 + "dev": true, + "peer": true }, "path-is-absolute": { "version": "1.0.1", @@ -62670,7 +63306,6 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -62833,7 +63468,6 @@ "version": "1.53.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", - "peer": true, "requires": { "fsevents": "2.3.2", "playwright-core": "1.53.2" @@ -62849,6 +63483,7 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, + "peer": true, "requires": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -62859,7 +63494,8 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true + "dev": true, + "peer": true }, "portfinder": { "version": "1.0.38", @@ -62880,7 +63516,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -63508,7 +64143,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -63598,15 +64232,16 @@ } }, "prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==" + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==" }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true + "dev": true, + "peer": true }, "pretty-error": { "version": "4.0.0", @@ -63663,7 +64298,6 @@ "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", "dev": true, - "peer": true, "requires": { "@prisma/config": "7.2.0", "@prisma/dev": "0.17.0", @@ -63682,7 +64316,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true + "dev": true, + "peer": true }, "process": { "version": "0.11.10", @@ -63716,13 +64351,15 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "peer": true }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "peer": true, "requires": { "asap": "~2.0.6" } @@ -63892,7 +64529,8 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true + "dev": true, + "peer": true }, "qs": { "version": "6.14.0", @@ -63907,6 +64545,7 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, + "peer": true, "requires": { "inherits": "~2.0.3" } @@ -64006,7 +64645,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -64016,6 +64654,7 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, + "peer": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -64026,6 +64665,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -64034,7 +64674,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -64083,7 +64722,6 @@ "version": "npm:@docusaurus/react-loadable@6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "peer": true, "requires": { "@types/react": "*" } @@ -64130,7 +64768,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "peer": true, "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -64633,6 +65270,7 @@ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", "dev": true, + "peer": true, "requires": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", @@ -64704,6 +65342,7 @@ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.3.3" } @@ -64713,6 +65352,7 @@ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", "dev": true, + "peer": true, "requires": { "chalk": "^4.1.2" } @@ -64722,6 +65362,7 @@ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", @@ -64741,6 +65382,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, + "peer": true, "requires": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -64763,6 +65405,7 @@ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -64792,6 +65435,7 @@ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", @@ -64810,6 +65454,7 @@ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", "dev": true, + "peer": true, "requires": {} }, "@op-engineering/op-sqlite": { @@ -64823,13 +65468,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true + "dev": true, + "peer": true }, "@react-native/babel-plugin-codegen": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" @@ -64840,6 +65487,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -64893,6 +65541,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -64908,6 +65557,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -64918,6 +65568,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -64932,6 +65583,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -64943,6 +65595,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", "dev": true, + "peer": true, "requires": { "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", @@ -64957,13 +65610,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true + "dev": true, + "peer": true }, "@react-native/dev-middleware": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.1", @@ -64984,6 +65639,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -64992,13 +65648,15 @@ "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true + "dev": true, + "peer": true }, "@react-native/debugger-shell": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", "dev": true, + "peer": true, "requires": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -65009,6 +65667,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", "dev": true, + "peer": true, "requires": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", @@ -65028,6 +65687,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "peer": true, "requires": { "async-limiter": "~1.0.0" } @@ -65038,25 +65698,29 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true + "dev": true, + "peer": true }, "@react-native/js-polyfills": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true + "dev": true, + "peer": true }, "@react-native/normalize-colors": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true + "dev": true, + "peer": true }, "@react-native/virtualized-lists": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -65066,19 +65730,22 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "peer": true }, "babel-preset-expo": { "version": "54.0.10", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", @@ -65109,6 +65776,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -65117,13 +65785,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true }, "expo": { "version": "54.0.32", @@ -65160,6 +65830,7 @@ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "dev": true, + "peer": true, "requires": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.12" @@ -65170,6 +65841,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "dev": true, + "peer": true, "requires": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -65180,6 +65852,7 @@ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "dev": true, + "peer": true, "requires": {} }, "expo-font": { @@ -65197,6 +65870,7 @@ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "dev": true, + "peer": true, "requires": {} }, "expo-modules-autolinking": { @@ -65204,6 +65878,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "dev": true, + "peer": true, "requires": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", @@ -65217,6 +65892,7 @@ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "dev": true, + "peer": true, "requires": { "invariant": "^2.2.4" } @@ -65235,6 +65911,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, + "peer": true, "requires": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -65246,6 +65923,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "peer": true, "requires": { "@isaacs/brace-expansion": "^5.0.0" } @@ -65256,25 +65934,29 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true + "dev": true, + "peer": true }, "hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true + "dev": true, + "peer": true }, "lru-cache": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true + "dev": true, + "peer": true }, "metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -65322,13 +66004,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65338,6 +66022,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -65347,6 +66032,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -65359,6 +66045,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65370,6 +66057,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, + "peer": true, "requires": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -65382,6 +66070,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65391,6 +66080,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, + "peer": true, "requires": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -65407,6 +66097,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -65418,6 +66109,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, + "peer": true, "requires": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -65435,6 +66127,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -65445,6 +66138,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65454,6 +66148,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -65464,6 +66159,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, + "peer": true, "requires": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -65482,6 +66178,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -65496,6 +66193,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65510,6 +66208,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -65530,13 +66229,15 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "peer": true, "requires": { "mime-db": "1.52.0" } @@ -65546,6 +66247,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -65555,6 +66257,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "peer": true, "requires": { "minipass": "^7.1.2" } @@ -65564,6 +66267,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, + "peer": true, "requires": { "flow-enums-runtime": "^0.0.6" } @@ -65573,6 +66277,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -65583,6 +66288,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, + "peer": true, "requires": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -65592,13 +66298,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true + "dev": true, + "peer": true }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -65610,6 +66318,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -65627,7 +66336,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "peer": true }, "react-native": { "version": "0.83.1", @@ -65678,6 +66388,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -65692,13 +66403,15 @@ "version": "0.83.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true + "dev": true, + "peer": true }, "babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, + "peer": true, "requires": { "hermes-parser": "0.32.0" } @@ -65708,6 +66421,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -65717,13 +66431,15 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true + "dev": true, + "peer": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -65738,6 +66454,7 @@ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, + "peer": true, "requires": { "hermes-estree": "0.32.0" } @@ -65747,6 +66464,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65756,6 +66474,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "peer": true, "requires": {} } } @@ -65764,25 +66483,29 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true + "dev": true, + "peer": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "dev": true, + "peer": true }, "tar": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, + "peer": true, "requires": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -65801,13 +66524,15 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true + "dev": true, + "peer": true }, "yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -65876,8 +66601,7 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "peer": true + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" }, "typescript": { "version": "5.9.3", @@ -65930,6 +66654,7 @@ "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, + "peer": true, "requires": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -65941,6 +66666,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, + "peer": true, "requires": { "path-parse": "^1.0.5" } @@ -65977,6 +66703,7 @@ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, + "peer": true, "requires": { "global-dirs": "^0.1.1" }, @@ -65986,6 +66713,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, + "peer": true, "requires": { "ini": "^1.3.4" } @@ -66006,13 +66734,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true + "dev": true, + "peer": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true + "dev": true, + "peer": true }, "responselike": { "version": "3.0.0", @@ -66027,6 +66757,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -66036,13 +66767,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "dev": true, + "peer": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -66096,7 +66829,6 @@ "version": "4.46.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", - "peer": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", @@ -66227,7 +66959,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -66362,7 +67093,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true + "dev": true, + "peer": true }, "serialize-javascript": { "version": "6.0.2", @@ -66376,8 +67108,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true, - "peer": true + "dev": true }, "seroval-plugins": { "version": "1.1.1", @@ -66675,6 +67406,7 @@ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, + "peer": true, "requires": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -66742,7 +67474,8 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true + "dev": true, + "peer": true }, "smart-buffer": { "version": "4.2.0", @@ -66806,7 +67539,6 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", "dev": true, - "peer": true, "requires": { "csstype": "^3.1.0", "seroval": "^1.1.0", @@ -66969,6 +67701,7 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "peer": true, "requires": { "escape-string-regexp": "^2.0.0" }, @@ -66977,7 +67710,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -66991,13 +67725,15 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "dev": true, + "peer": true }, "stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, + "peer": true, "requires": { "type-fest": "^0.7.1" }, @@ -67006,7 +67742,8 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -67029,7 +67766,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true + "dev": true, + "peer": true }, "stream-shift": { "version": "1.0.3", @@ -67148,7 +67886,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true + "dev": true, + "peer": true }, "style-to-js": { "version": "1.1.21", @@ -67211,6 +67950,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -67287,7 +68027,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, - "peer": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -67396,13 +68135,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true + "dev": true, + "peer": true }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -67412,7 +68153,6 @@ "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", - "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -67560,7 +68300,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true + "dev": true, + "peer": true }, "throttleit": { "version": "2.1.0", @@ -67620,8 +68361,7 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "peer": true + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" } } }, @@ -67661,7 +68401,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "peer": true }, "to-regex-range": { "version": "5.0.1", @@ -67764,14 +68505,12 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "peer": true + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "peer": true, "requires": { "esbuild": "~0.27.0", "fsevents": "~2.3.3", @@ -68066,7 +68805,8 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "peer": true }, "type-fest": { "version": "4.41.0", @@ -68157,7 +68897,6 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", "dev": true, - "peer": true, "requires": {} }, "typescript": { @@ -68567,7 +69306,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true + "dev": true, + "peer": true }, "value-equal": { "version": "1.0.1", @@ -68633,7 +69373,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fsevents": "~2.3.3", @@ -68728,7 +69467,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true + "dev": true, + "peer": true }, "w3c-xmlserializer": { "version": "5.0.0", @@ -68744,6 +69484,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "peer": true, "requires": { "makeerror": "1.0.12" } @@ -68770,6 +69511,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "peer": true, "requires": { "defaults": "^1.0.3" } @@ -68783,7 +69525,6 @@ "version": "5.97.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", - "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -69047,7 +69788,8 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true + "dev": true, + "peer": true }, "whatwg-mimetype": { "version": "4.0.0", @@ -69069,6 +69811,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "dev": true, + "peer": true, "requires": { "buffer": "^5.4.3", "punycode": "^2.1.1", @@ -69079,7 +69822,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -69170,7 +69914,8 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true + "dev": true, + "peer": true }, "wordwrapjs": { "version": "5.1.0", @@ -69228,7 +69973,6 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "peer": true, "requires": {} }, "wsl-utils": { @@ -69259,6 +70003,7 @@ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, + "peer": true, "requires": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -69268,7 +70013,8 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -69296,6 +70042,7 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "peer": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -69305,7 +70052,8 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -69313,7 +70061,8 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true + "dev": true, + "peer": true }, "xmlchars": { "version": "2.2.0", @@ -69370,7 +70119,8 @@ "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 + "dev": true, + "peer": true }, "z2s": { "version": "file:packages/z2s", @@ -69494,8 +70244,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "peer": true + "dev": true }, "typescript": { "version": "5.9.3", @@ -69508,7 +70257,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -69803,6 +70551,7 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, + "peer": true, "requires": {} }, "zql": { @@ -69923,8 +70672,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "peer": true + "dev": true }, "typescript": { "version": "5.9.3", diff --git a/package.json b/package.json index 65b5a31218..77f70f590c 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "baseline-browser-mapping": "^2.9.6", "oxlint": "^1.50.0", "oxlint-tsgolint": "^0.14.2", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "tsx": "^4.21.0", "turbo": "^2.4.4", "vitest": "4.0.15" diff --git a/packages/replicache/src/scan-iterator.ts b/packages/replicache/src/scan-iterator.ts index 24a2d6dc23..854074d064 100644 --- a/packages/replicache/src/scan-iterator.ts +++ b/packages/replicache/src/scan-iterator.ts @@ -26,9 +26,10 @@ type ToValue = ( * await` loop. There are also methods to iterate over the {@link keys}, * {@link entries} or {@link values}. */ -export class ScanResultImpl - implements ScanResult, V> -{ +export class ScanResultImpl< + Options extends ScanOptions, + V, +> implements ScanResult, V> { readonly #iter: AsyncIterable>; readonly #options: Options; readonly #dbDelegateOptions: Closed; @@ -137,14 +138,15 @@ export interface ScanResult extends AsyncIterable { * const keys: string[] = await rep.scan().keys().toArray(); * ``` */ -export interface AsyncIterableIteratorToArray - extends AsyncIterableIterator { +export interface AsyncIterableIteratorToArray< + V, +> extends AsyncIterableIterator { toArray(): Promise; } -class AsyncIterableIteratorToArrayWrapperImpl - implements AsyncIterableIterator -{ +class AsyncIterableIteratorToArrayWrapperImpl< + V, +> implements AsyncIterableIterator { readonly #it: AsyncIterableIterator; constructor(it: AsyncIterableIterator) { diff --git a/packages/shared/src/record-proxy.ts b/packages/shared/src/record-proxy.ts index 0805a20e7d..bde3f20e0f 100644 --- a/packages/shared/src/record-proxy.ts +++ b/packages/shared/src/record-proxy.ts @@ -10,9 +10,9 @@ const missing = Symbol(); * @template Source - The type of values in the source record * @template Dest - The type of transformed values */ -class RecordProxyHandler - implements ProxyHandler> -{ +class RecordProxyHandler implements ProxyHandler< + Record +> { readonly #toValue: (source: Source, prop: string) => Dest; readonly #onMissing: ((prop: string) => void) | undefined; readonly #cache: Map = new Map(); diff --git a/packages/zero-cache/src/workers/connection.ts b/packages/zero-cache/src/workers/connection.ts index 262e09a362..4fd7797d0f 100644 --- a/packages/zero-cache/src/workers/connection.ts +++ b/packages/zero-cache/src/workers/connection.ts @@ -415,9 +415,9 @@ export function findProtocolError(error: unknown): ProtocolError | undefined { function hasErrno(error: unknown): boolean { return Boolean( error && - typeof error === 'object' && - 'errno' in error && - typeof (error as {errno: unknown}).errno !== 'undefined', + typeof error === 'object' && + 'errno' in error && + typeof (error as {errno: unknown}).errno !== 'undefined', ); } diff --git a/packages/zero-client/src/client/custom.ts b/packages/zero-client/src/client/custom.ts index 91307fbe25..c5b11f791f 100644 --- a/packages/zero-client/src/client/custom.ts +++ b/packages/zero-client/src/client/custom.ts @@ -114,9 +114,9 @@ export type MakeCustomMutatorInterface = F extends ( ? (...args: Args) => MutatorResult : never; -export class TransactionImpl - implements ClientTransaction -{ +export class TransactionImpl< + TSchema extends Schema = DefaultSchema, +> implements ClientTransaction { readonly location = 'client'; readonly mutate: TransactionMutate; /** diff --git a/packages/zero-server/src/adapters/drizzle.ts b/packages/zero-server/src/adapters/drizzle.ts index 038e83427d..63b5d62bc5 100644 --- a/packages/zero-server/src/adapters/drizzle.ts +++ b/packages/zero-server/src/adapters/drizzle.ts @@ -45,10 +45,9 @@ export type DrizzleTransaction< export class DrizzleConnection< TDrizzle extends DrizzleDatabase, - TTransaction extends - DrizzleTransaction = DrizzleTransaction, -> implements DBConnection -{ + TTransaction extends DrizzleTransaction = + DrizzleTransaction, +> implements DBConnection { readonly #drizzle: TDrizzle; constructor(drizzle: TDrizzle) { @@ -70,8 +69,7 @@ export class DrizzleConnection< class DrizzleInternalTransaction< TTransaction extends DrizzleTransaction, -> implements DBTransaction -{ +> implements DBTransaction { readonly wrappedTransaction: TTransaction; constructor(drizzleTx: TTransaction) { diff --git a/packages/zero-server/src/adapters/pg.ts b/packages/zero-server/src/adapters/pg.ts index cc89e6e877..2a56d6d523 100644 --- a/packages/zero-server/src/adapters/pg.ts +++ b/packages/zero-server/src/adapters/pg.ts @@ -54,9 +54,7 @@ export class NodePgConnection implements DBConnection { } } -export class NodePgTransactionInternal - implements DBTransaction -{ +export class NodePgTransactionInternal implements DBTransaction { readonly wrappedTransaction: NodePgTransaction; constructor(client: NodePgTransaction) { diff --git a/packages/zero-server/src/adapters/postgresjs.ts b/packages/zero-server/src/adapters/postgresjs.ts index 21ba070ed2..7b4552be62 100644 --- a/packages/zero-server/src/adapters/postgresjs.ts +++ b/packages/zero-server/src/adapters/postgresjs.ts @@ -25,9 +25,9 @@ export type PostgresJsTransaction< T extends Record = Record, > = postgres.TransactionSql; -export class PostgresJSConnection> - implements DBConnection> -{ +export class PostgresJSConnection< + T extends Record, +> implements DBConnection> { readonly #pg: postgres.Sql; constructor(pg: postgres.Sql) { this.#pg = pg; @@ -42,9 +42,9 @@ export class PostgresJSConnection> } } -export class PostgresJsTransactionInternal> - implements DBTransaction> -{ +export class PostgresJsTransactionInternal< + T extends Record, +> implements DBTransaction> { readonly wrappedTransaction: PostgresJsTransaction; constructor(pgTx: PostgresJsTransaction) { this.wrappedTransaction = pgTx; diff --git a/packages/zero-server/src/adapters/prisma.ts b/packages/zero-server/src/adapters/prisma.ts index cbe8ab6d97..39b345523c 100644 --- a/packages/zero-server/src/adapters/prisma.ts +++ b/packages/zero-server/src/adapters/prisma.ts @@ -35,9 +35,9 @@ export type PrismaTransaction< ? TTransaction : PrismaTransactionLike; -export class PrismaConnection - implements DBConnection> -{ +export class PrismaConnection< + TClient extends PrismaClientLike, +> implements DBConnection> { readonly #client: TClient; constructor(client: TClient) { @@ -57,9 +57,9 @@ export class PrismaConnection } } -class PrismaInternalTransaction - implements DBTransaction -{ +class PrismaInternalTransaction< + TTransaction extends PrismaTransactionLike, +> implements DBTransaction { readonly wrappedTransaction: TTransaction; constructor(prismaTx: TTransaction) { diff --git a/packages/zero-server/src/custom.ts b/packages/zero-server/src/custom.ts index 91e2e18600..76aa736440 100644 --- a/packages/zero-server/src/custom.ts +++ b/packages/zero-server/src/custom.ts @@ -105,9 +105,10 @@ class ServerTransactionQueryDelegate extends QueryDelegateBase { } } -export class TransactionImpl - implements ServerTransaction -{ +export class TransactionImpl< + TSchema extends Schema, + TWrappedTransaction, +> implements ServerTransaction { readonly location = 'server'; readonly reason = 'authoritative'; readonly dbTransaction: DBTransaction; diff --git a/packages/zero-server/src/zql-database.ts b/packages/zero-server/src/zql-database.ts index d920d0dcfe..432ff352c1 100644 --- a/packages/zero-server/src/zql-database.ts +++ b/packages/zero-server/src/zql-database.ts @@ -22,9 +22,10 @@ import type { * writing data that the Zero client does, so that mutator functions can be * shared across client and server. */ -export class ZQLDatabase - implements Database> -{ +export class ZQLDatabase< + TSchema extends Schema, + TWrappedTransaction, +> implements Database> { readonly connection: DBConnection; readonly #crudFactory: CRUDMutatorFactory; diff --git a/packages/zql/src/mutate/custom.ts b/packages/zql/src/mutate/custom.ts index bd5aeb204b..b717827d1a 100644 --- a/packages/zql/src/mutate/custom.ts +++ b/packages/zql/src/mutate/custom.ts @@ -72,8 +72,9 @@ export interface ServerTransaction< * allows reading and writing to the database and IVM at the head at which the * mutator is being applied. */ -export interface ClientTransaction - extends TransactionBase { +export interface ClientTransaction< + S extends Schema = DefaultSchema, +> extends TransactionBase { readonly location: 'client'; readonly reason: 'optimistic' | 'rebase'; } diff --git a/packages/zql/src/query/query-impl.ts b/packages/zql/src/query/query-impl.ts index 0b8d917122..21ea557a73 100644 --- a/packages/zql/src/query/query-impl.ts +++ b/packages/zql/src/query/query-impl.ts @@ -91,10 +91,10 @@ export function newQueryImpl< } export class QueryImpl< - TTable extends keyof TSchema['tables'] & string, - TSchema extends Schema, - TReturn = PullRow, - > + TTable extends keyof TSchema['tables'] & string, + TSchema extends Schema, + TReturn = PullRow, +> implements Query, QueryInternals diff --git a/packages/zql/src/query/query.ts b/packages/zql/src/query/query.ts index 19eb1c5674..de85a1b70a 100644 --- a/packages/zql/src/query/query.ts +++ b/packages/zql/src/query/query.ts @@ -73,9 +73,9 @@ export type GetFilterType< TOperator extends SimpleOperator, > = TOperator extends 'IS' | 'IS NOT' ? // SchemaValueToTSType adds null if the type is optional, but we add null - // no matter what for dx reasons. See: - // https://github.com/rocicorp/mono/pull/3576#discussion_r1925792608 - SchemaValueToTSType | null | undefined + // no matter what for dx reasons. See: + // https://github.com/rocicorp/mono/pull/3576#discussion_r1925792608 + SchemaValueToTSType | null | undefined : TOperator extends 'IN' | 'NOT IN' ? // We don't want to compare to null in where clauses because it causes // confusing results: diff --git a/packages/zql/src/query/runnable-query-impl.ts b/packages/zql/src/query/runnable-query-impl.ts index 844e240f3b..6ae680ea84 100644 --- a/packages/zql/src/query/runnable-query-impl.ts +++ b/packages/zql/src/query/runnable-query-impl.ts @@ -35,10 +35,10 @@ export function newRunnableQuery< } export class RunnableQueryImpl< - TTable extends keyof TSchema['tables'] & string, - TSchema extends Schema, - TReturn = PullRow, - > + TTable extends keyof TSchema['tables'] & string, + TSchema extends Schema, + TReturn = PullRow, +> extends QueryImpl implements Query { From c5ab3eacc1b6237929e1ef1f6585c2073ff6fc2d Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Tue, 17 Mar 2026 02:28:46 +0100 Subject: [PATCH 144/495] fix(zero-cache): fixed timez support (#5660) Zero already parses Postgres `timetz` values as numbers, but schema introspection did not recognize the `timetz` alias. That caused `time with time zone` columns to be treated as unsupported and rejected during client schema validation. - map `timetz` to Zero's `number` type - add a regression test for the `timetz` alias - add a schema-level test proving `timetz|NOT_NULL` columns stay syncable --- apps/zbugs/package.json | 2 +- package-lock.json | 34 ++++--------------- packages/ast-to-zql/package.json | 2 +- .../zero-cache/src/db/lite-tables.test.ts | 12 +++++++ .../zero-cache/src/types/pg-data-type.test.ts | 1 + packages/zero-cache/src/types/pg-data-type.ts | 1 + packages/zero/package.json | 2 +- 7 files changed, 23 insertions(+), 31 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index d34f6b888e..13f917e5ad 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -84,7 +84,7 @@ "drizzle-kit": "^0.31.4", "drizzle-orm": "^0.44.2", "postcss-preset-env": "^7.4.3", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "rehype-video": "^2.3.0", "shared": "0.0.0", "tailwindcss": "^3.0.23", diff --git a/package-lock.json b/package-lock.json index 6794914342..91f8fd1a7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,7 +111,7 @@ "drizzle-kit": "^0.31.4", "drizzle-orm": "^0.44.2", "postcss-preset-env": "^7.4.3", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "rehype-video": "^2.3.0", "shared": "0.0.0", "tailwindcss": "^3.0.23", @@ -26180,7 +26180,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26202,7 +26201,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26224,7 +26222,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26246,7 +26243,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26268,7 +26264,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26290,7 +26285,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26312,7 +26306,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26334,7 +26327,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26356,7 +26348,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26378,7 +26369,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -26400,7 +26390,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -38982,7 +38971,7 @@ "packages/ast-to-zql": { "version": "0.0.0", "dependencies": { - "prettier": "^3.5.3" + "prettier": "^3.8.1" }, "devDependencies": { "@faker-js/faker": "^9.6.0", @@ -41201,7 +41190,7 @@ "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "semver": "^7.5.4", "tsx": "^4.21.0", "url-pattern": "^1.0.3", @@ -51178,7 +51167,7 @@ "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "replicache": "15.2.1", "semver": "^7.5.4", "shared": "0.0.0", @@ -54877,7 +54866,7 @@ "version": "file:packages/ast-to-zql", "requires": { "@faker-js/faker": "^9.6.0", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "shared": "0.0.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", @@ -60566,7 +60555,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "dev": true, "optional": true, "peer": true }, @@ -60574,7 +60562,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "dev": true, "optional": true, "peer": true }, @@ -60582,7 +60569,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "dev": true, "optional": true, "peer": true }, @@ -60590,7 +60576,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "dev": true, "optional": true, "peer": true }, @@ -60598,7 +60583,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "dev": true, "optional": true, "peer": true }, @@ -60606,7 +60590,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "dev": true, "optional": true, "peer": true }, @@ -60614,7 +60597,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "dev": true, "optional": true, "peer": true }, @@ -60622,7 +60604,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "dev": true, "optional": true, "peer": true }, @@ -60630,7 +60611,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "dev": true, "optional": true, "peer": true }, @@ -60638,7 +60618,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "dev": true, "optional": true, "peer": true }, @@ -60646,7 +60625,6 @@ "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "dev": true, "optional": true, "peer": true }, @@ -70177,7 +70155,7 @@ "pg": "^8.16.3", "postcss-preset-env": "^7.4.3", "postgres": "3.4.7", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-dropzone": "^14.3.8", diff --git a/packages/ast-to-zql/package.json b/packages/ast-to-zql/package.json index 5d91d71f38..8f430f68b9 100644 --- a/packages/ast-to-zql/package.json +++ b/packages/ast-to-zql/package.json @@ -13,7 +13,7 @@ "test:watch": "vitest" }, "dependencies": { - "prettier": "^3.5.3" + "prettier": "^3.8.1" }, "devDependencies": { "@faker-js/faker": "^9.6.0", diff --git a/packages/zero-cache/src/db/lite-tables.test.ts b/packages/zero-cache/src/db/lite-tables.test.ts index f4f5ec9332..525c7d74df 100644 --- a/packages/zero-cache/src/db/lite-tables.test.ts +++ b/packages/zero-cache/src/db/lite-tables.test.ts @@ -569,6 +569,18 @@ describe('computeZqlSpec', () => { `); }); + test('timetz columns are synced as numbers', () => { + const spec = must( + t(` + CREATE TABLE foo(id "TEXT|NOT_NULL", time_tz "timetz|NOT_NULL"); + CREATE UNIQUE INDEX foo_pkey ON foo(id ASC); + `)[0], + ); + + expect(spec.tableSpec.columns.time_tz?.dataType).toBe('timetz|NOT_NULL'); + expect(spec.zqlSpec.time_tz).toEqual({type: 'number'}); + }); + test('indexes with unsupported columns (MACADDR8) are excluded', () => { expect( t(` diff --git a/packages/zero-cache/src/types/pg-data-type.test.ts b/packages/zero-cache/src/types/pg-data-type.test.ts index 32a81ce8b6..4c63e72595 100644 --- a/packages/zero-cache/src/types/pg-data-type.test.ts +++ b/packages/zero-cache/src/types/pg-data-type.test.ts @@ -54,6 +54,7 @@ describe('dataTypeToZqlValueType', () => { ['float8', 'number'], ['date', 'number'], ['time', 'number'], + ['timetz', 'number'], ['timestamp', 'number'], ['timestamptz', 'number'], ['timestamp with time zone', 'number'], diff --git a/packages/zero-cache/src/types/pg-data-type.ts b/packages/zero-cache/src/types/pg-data-type.ts index 1db401137a..80dfa03bb4 100644 --- a/packages/zero-cache/src/types/pg-data-type.ts +++ b/packages/zero-cache/src/types/pg-data-type.ts @@ -47,6 +47,7 @@ export const pgToZqlTypeMap = Object.freeze({ // Date/Time types 'date': 'number', 'time': 'number', + 'timetz': 'number', 'time with time zone': 'number', 'time without time zone': 'number', 'timestamp': 'number', diff --git a/packages/zero/package.json b/packages/zero/package.json index 98e3bf6b1d..31014556a6 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -70,7 +70,7 @@ "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "semver": "^7.5.4", "tsx": "^4.21.0", "url-pattern": "^1.0.3", From b4b2375fa8e2dd2ac7fb4c968bf9d66657b32dd7 Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Mon, 16 Mar 2026 21:32:11 -0700 Subject: [PATCH 145/495] fix(zero-cache): address possible way a reset can get stuck (#5656) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a stack is reset, when finishing the initial-sync, the new replication-manager needs to “take over” the change DB. As part of this "take over" it usually needs to TRUNCATE CDC tables, which requires an ACCESS EXCLUSIVE lock. If the old replication manager's storer is still reading (e.g., large catchup cursors), the TRUNCATE is blocked causing the reset to be stalled. This change adds a 5-second timer race scoped to the TRUNCATE path inside ensureReplicationConfig. If the TRUNCATE doesn't complete in time, terminateChangeDBLockHolders identifies the blocking zero-change-streamer backends via pg_stat_activity + pg_blocking_pids() and terminates them, allowing the new replication manager to proceed. - Timer only activates when TRUNCATEs are actually needed (version/publication mismatch) - Only terminates backends matching application_name = 'zero-change-streamer' - Excludes the blocked TRUNCATE PID from termination as a safety guard - Extracted CHANGE_STREAMER_APP_NAME constant --- .../zero-cache/src/server/change-streamer.ts | 7 +- .../change-streamer-service.ts | 1 + .../change-streamer/schema/tables.pg.test.ts | 130 ++++++++++++++++++ .../services/change-streamer/schema/tables.ts | 95 ++++++++++++- 4 files changed, 230 insertions(+), 3 deletions(-) diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index 5a61239aad..eb82309a86 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -13,7 +13,10 @@ import {ChangeStreamerHttpServer} from '../services/change-streamer/change-strea import {initializeStreamer} from '../services/change-streamer/change-streamer-service.ts'; import type {ChangeStreamerService} from '../services/change-streamer/change-streamer.ts'; import {ReplicaMonitor} from '../services/change-streamer/replica-monitor.ts'; -import {AutoResetSignal} from '../services/change-streamer/schema/tables.ts'; +import { + AutoResetSignal, + CHANGE_STREAMER_APP_NAME, +} from '../services/change-streamer/schema/tables.ts'; import {exitAfter, runUntilKilled} from '../services/life-cycle.ts'; import {replicationStatusError} from '../services/replicator/replication-status.ts'; import {pgClient} from '../types/pg.ts'; @@ -62,7 +65,7 @@ export default async function runWorker( change.db, { max: change.maxConns, - connection: {['application_name']: 'zero-change-streamer'}, + connection: {['application_name']: CHANGE_STREAMER_APP_NAME}, }, {sendStringAsJson: true}, ); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 206d9ebbc1..926656a767 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -73,6 +73,7 @@ export async function initializeStreamer( subscriptionState, shard, autoReset, + setTimeoutFn, ); const {replicaVersion} = subscriptionState; diff --git a/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts b/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts index da96583160..8edbfe2fc4 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/tables.pg.test.ts @@ -1,3 +1,5 @@ +import postgres from 'postgres'; +import {resolver} from '@rocicorp/resolver'; import {beforeEach, describe, expect} from 'vitest'; import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; import {Database} from '../../../../../zqlite/src/db.ts'; @@ -6,6 +8,7 @@ import type {PostgresDB} from '../../../types/pg.ts'; import {initReplicationState} from '../../replicator/schema/replication-state.ts'; import { AutoResetSignal, + CHANGE_STREAMER_APP_NAME, ensureReplicationConfig, markResetRequired, setupCDCTables, @@ -250,4 +253,131 @@ describe('change-streamer/schema/tables', () => { ), ).rejects.toThrow(AutoResetSignal); }); + + test('terminateChangeDBLockHolders with multiple blockers', async () => { + // Set up initial replication config. + await ensureReplicationConfig( + lc, + sql, + { + replicaVersion: '183', + publications: ['zero_data', 'zero_metadata'], + watermark: '183', + }, + shard, + true, + ); + + // Insert some data so the changeLog table has rows to read. + await sql` + INSERT INTO "rezo_8/cdc"."changeLog" (watermark, pos, change) + VALUES ('184', 0, '{"tag":"begin"}'::json), + ('184', 1, '{"tag":"commit"}'::json), + ('185', 0, '{"tag":"begin"}'::json), + ('185', 1, '{"tag":"commit"}'::json) + `.simple(); + + // Create multiple secondary connections that simulate the old storer's + // catchup cursor reads. These hold read locks on the changeLog table. + const {host, port, user: username, pass, database} = sql.options; + const NUM_BLOCKERS = 3; + const blockerConns: postgres.Sql[] = []; + const blockerTxDone: Promise[] = []; + const readyPromises: Promise[] = []; + + for (let i = 0; i < NUM_BLOCKERS; i++) { + const conn = postgres({ + host: host[0], + port: port[0], + username, + password: pass ?? undefined, + database, + connection: {['application_name']: CHANGE_STREAMER_APP_NAME}, + }); + blockerConns.push(conn); + + const {promise: ready, resolve: resolveReady} = resolver(); + readyPromises.push(ready); + + // Start a long-running read transaction. The SELECT holds a + // lock that conflicts with TRUNCATE's ACCESS EXCLUSIVE lock. + const txDone = conn.begin(async tx => { + await tx`SELECT * FROM "rezo_8/cdc"."changeLog"`; + resolveReady(); + // Keep the transaction open until terminated. + await new Promise(() => {}); + }); + txDone.catch(() => {}); // Prevent unhandled rejection. + blockerTxDone.push(txDone); + } + + // Wait for all blockers to have acquired their read locks. + await Promise.all(readyPromises); + + // Wrap setTimeout to capture the scheduled delay and fire quickly (10ms). + let scheduledMs: number | undefined; + const shortSetTimeout = ((fn: () => void, ms: number) => { + scheduledMs = ms; + return setTimeout(fn, 10); + }) as typeof setTimeout; + + // The connection doing the TRUNCATE needs application_name = + // CHANGE_STREAMER_APP_NAME to match the terminateChangeDBLockHolders query. + const truncateConn = postgres({ + host: host[0], + port: port[0], + username, + password: pass ?? undefined, + database, + connection: {['application_name']: CHANGE_STREAMER_APP_NAME}, + }) as unknown as PostgresDB; + + try { + // ensureReplicationConfig will TRUNCATE (different replicaVersion), + // block on the read locks, then the short timer fires and terminates + // the blocking backends, allowing the TRUNCATE to proceed. + await ensureReplicationConfig( + lc, + truncateConn, + { + replicaVersion: '1g8', + publications: ['zero_data', 'zero_metadata'], + watermark: '1g8', + }, + shard, + true, + shortSetTimeout, + ); + + // Verify the timer was scheduled for the production timeout. + expect(scheduledMs).toBe(5_000); + + // Verify the tables were properly re-initialized. + await expectTables(sql, { + ['rezo_8/cdc.changeLog']: [ + {watermark: '1g8', pos: 0n, change: {tag: 'begin'}, precommit: null}, + {watermark: '1g8', pos: 1n, change: {tag: 'commit'}, precommit: null}, + ], + ['rezo_8/cdc.replicationConfig']: [ + { + replicaVersion: '1g8', + publications: ['zero_data', 'zero_metadata'], + resetRequired: null, + lock: 1, + }, + ], + }); + } finally { + // Verify all blocker transactions were terminated. + const results = await Promise.allSettled(blockerTxDone); + for (const result of results) { + expect(result.status).toBe('rejected'); + } + expect(results).toHaveLength(NUM_BLOCKERS); + + // Clean up all connections. + await Promise.all(blockerConns.map(c => c.end())); + await (truncateConn as unknown as postgres.Sql).end(); + } + }); }); diff --git a/packages/zero-cache/src/services/change-streamer/schema/tables.ts b/packages/zero-cache/src/services/change-streamer/schema/tables.ts index 76c514d260..6a76768e65 100644 --- a/packages/zero-cache/src/services/change-streamer/schema/tables.ts +++ b/packages/zero-cache/src/services/change-streamer/schema/tables.ts @@ -168,6 +168,7 @@ export async function ensureReplicationConfig( >, shard: ShardID, autoReset: boolean, + setTimeoutFn: typeof setTimeout = setTimeout, ) { const {publications, replicaVersion, watermark} = subscriptionState; const replicaConfig = {publications, replicaVersion}; @@ -180,6 +181,7 @@ export async function ensureReplicationConfig( await runTx(db, async sql => { const stmts: PendingQuery[] = []; + let needsTruncate = false; const results = await sql< { replicaVersion: string; @@ -214,6 +216,7 @@ export async function ensureReplicationConfig( // change-streamer. Deleting the existing row and creating // a new one, on the other hand, may not properly trigger the // SERIALIZATION failure necessary to abort the pending tx. + needsTruncate = true; stmts.push( sql`TRUNCATE TABLE ${sql(schema)}."changeLog"`, sql`TRUNCATE TABLE ${sql(schema)}."replicationConfig"`, @@ -223,7 +226,7 @@ export async function ensureReplicationConfig( } } // Initialize (or re-initialize TRUNCATED) tables - if (results.length === 0 || stmts.length > 0) { + if (results.length === 0 || needsTruncate) { // The storer uses the earliest changeLog entry as the safe watermark // from which subscribers can be resumed. These initial entries ensure // that subscribers can start from a freshly synced replica, even if @@ -245,6 +248,24 @@ export async function ensureReplicationConfig( change => sql`INSERT INTO ${sql(schema)}."changeLog" ${sql(change)}`, ), ); + + if (needsTruncate) { + // The TRUNCATE statements require ACCESS EXCLUSIVE locks, which may + // be blocked by old storer catchup reads. Race against a timeout + // that terminates the blocking backends if the TRUNCATE takes too + // long. + const timer = setTimeoutFn(async () => { + lc.info?.( + 'ensureReplicationConfig blocked, terminating lock holders', + ); + await terminateChangeDBLockHolders(lc, db, shard); + }, LOCK_HOLDER_TERMINATE_TIMEOUT_MS); + try { + return await Promise.all(stmts); + } finally { + clearTimeout(timer); + } + } return Promise.all(stmts); } @@ -266,6 +287,78 @@ export async function ensureReplicationConfig( }); } +// The time to wait for a TRUNCATE in ensureReplicationConfig before +// terminating blocking backends via terminateChangeDBLockHolders. +const LOCK_HOLDER_TERMINATE_TIMEOUT_MS = 5_000; + +export const CHANGE_STREAMER_APP_NAME = 'zero-change-streamer'; + export class AutoResetSignal extends AbortError { readonly name = 'AutoResetSignal'; } + +/** + * Terminates zero-cache backends that are blocking the current backend + * from acquiring locks on CDC tables (e.g., during TRUNCATE). + * + * This is used during change-DB takeover when the new replication-manager's + * `ensureReplicationConfig` needs to TRUNCATE tables, but the old + * replication-manager's storer is still reading from them (e.g., large + * catchup cursors). + * + * The function: + * 1. Finds backends waiting for a lock on a TRUNCATE in {schema} + * 2. Uses `pg_blocking_pids()` to identify which backends are blocking them + * 3. Terminates blocking backends that have `application_name = 'zero-change-streamer'` + * + * Must be called on a **separate connection** from the one that is blocked, + * since the blocked connection is inside a pending transaction. + */ +export async function terminateChangeDBLockHolders( + lc: LogContext, + db: PostgresDB, + shard: ShardID, +) { + const schema = cdcSchema(shard); + + // Step 1: Find backends that are blocked waiting for a lock, + // whose query involves a TRUNCATE on this shard's CDC schema. + const blocked = await db<{pid: number}[]>` + SELECT pid FROM pg_stat_activity + WHERE wait_event_type = 'Lock' + AND application_name = ${CHANGE_STREAMER_APP_NAME} + AND query LIKE ${'%TRUNCATE%' + schema + '%'}`; + + if (blocked.length === 0) { + lc.info?.('no blocked TRUNCATE backends found'); + return; + } + + const blockedPids = blocked.map(r => r.pid); + lc.info?.(`found blocked TRUNCATE backends: ${JSON.stringify(blockedPids)}`); + + // Step 2: For each blocked backend, find and terminate its blockers + // that are zero-change-streamer connections. + const terminated = await db< + {pid: number; applicationName: string; query: string; terminated: boolean}[] + >` + SELECT pid, application_name as "applicationName", query, + pg_terminate_backend(pid) as terminated + FROM pg_stat_activity + WHERE pid = ANY( + SELECT unnest(pg_blocking_pids(blocked.pid)) + FROM unnest(${blockedPids}::int[]) AS blocked(pid) + ) + AND application_name = ${CHANGE_STREAMER_APP_NAME} + AND pid != ALL(${blockedPids}::int[])`; + + if (terminated.length === 0) { + lc.info?.(`no ${CHANGE_STREAMER_APP_NAME} blockers found to terminate`); + } else { + for (const {pid, applicationName, query, terminated: ok} of terminated) { + lc.info?.( + `terminated blocking backend pid=${pid} app=${applicationName} ok=${ok} query=${query.slice(0, 200)}`, + ); + } + } +} From 0f96572b0f086fddf8a3e53d326207a09f30ffe8 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Tue, 17 Mar 2026 16:24:16 +0100 Subject: [PATCH 146/495] fix(z2s): if two values have different types, give them different palceholders (#5653) - add focused unit repro tests in `packages/z2s/src/sql.test.ts` for equal string values written to `text` and `json`/`jsonb` columns in the same statement - add PostgreSQL integration repro tests in `packages/z2s/src/sql.pg.test.ts` that do real `INSERT ... RETURNING` writes against mixed `TEXT` + `JSON`/`JSONB` tables - cover both value orders (`text -> json/jsonb` and `json/jsonb -> text`) and both empty/non-empty equal strings ## Why `SQLConvertFormat.formatValue()` currently dedupes placeholders by raw JS value only, but `text` and `json`/`jsonb` values serialize differently. That lets equal JS strings incorrectly share a placeholder across incompatible SQL encodings. This reproduces the Productlane failure mode where a mutation writes the same JS string to both a text column and a json/jsonb column, causing either: - `22P02 invalid input syntax for type json/jsonb` when text formatting wins first, or - incorrect quoted text values when json/jsonb formatting wins first ## Expected behavior Mixed `text` + `json`/`jsonb` writes should serialize independently and round-trip correctly regardless of argument order. Examples: - `summary: ""`, `content: ""` -> `summary = ""`, `content = ""` - `summary: "same"`, `content: "same"` -> `summary = "same"`, `content = "same"` --------- Co-authored-by: Matt Wonlaw --- packages/z2s/src/sql.pg.test.ts | 56 ++++++++++++++++++++++++++ packages/z2s/src/sql.test.ts | 69 +++++++++++++++++++++++++++++++++ packages/z2s/src/sql.ts | 18 ++++++--- 3 files changed, 137 insertions(+), 6 deletions(-) diff --git a/packages/z2s/src/sql.pg.test.ts b/packages/z2s/src/sql.pg.test.ts index 9e10ecf479..dd4bdd48c5 100644 --- a/packages/z2s/src/sql.pg.test.ts +++ b/packages/z2s/src/sql.pg.test.ts @@ -100,6 +100,62 @@ describe('SQL builder with PostgreSQL', () => { tags: ['tag1', 'tag2'], }); }); + + test.each([ + {label: 'empty string', type: 'json', value: ''}, + {label: 'empty string', type: 'jsonb', value: ''}, + {label: 'non-empty string', type: 'json', value: 'same'}, + {label: 'non-empty string', type: 'jsonb', value: 'same'}, + ] as const)( + 'writes equal $label values correctly when text is formatted before $type', + async ({label: _label, type, value}) => { + const table = `mixed_values_${type}`; + await pg.unsafe(` + DROP TABLE IF EXISTS "${table}"; + CREATE TABLE "${table}" ( + summary TEXT NOT NULL, + content ${type.toUpperCase()} NOT NULL + ); + `); + + const stmt = formatPgInternalConvert(sql` + INSERT INTO ${sql.ident(table)} (summary, content) + VALUES (${sqlConvertArg('text', value)}, ${sqlConvertArg(type, value)}) + RETURNING summary, content + `); + const result = await pg.unsafe(stmt.text, stmt.values as JSONValue[]); + + expect(result).toEqual([{summary: value, content: value}]); + }, + ); + + test.each([ + {label: 'empty string', type: 'json', value: ''}, + {label: 'empty string', type: 'jsonb', value: ''}, + {label: 'non-empty string', type: 'json', value: 'same'}, + {label: 'non-empty string', type: 'jsonb', value: 'same'}, + ] as const)( + 'writes equal $label values correctly when $type is formatted before text', + async ({label: _label, type, value}) => { + const table = `mixed_values_${type}`; + await pg.unsafe(` + DROP TABLE IF EXISTS "${table}"; + CREATE TABLE "${table}" ( + summary TEXT NOT NULL, + content ${type.toUpperCase()} NOT NULL + ); + `); + + const stmt = formatPgInternalConvert(sql` + INSERT INTO ${sql.ident(table)} (content, summary) + VALUES (${sqlConvertArg(type, value)}, ${sqlConvertArg('text', value)}) + RETURNING content, summary + `); + const result = await pg.unsafe(stmt.text, stmt.values as JSONValue[]); + + expect(result).toEqual([{content: value, summary: value}]); + }, + ); }); const pluralComparison = { diff --git a/packages/z2s/src/sql.test.ts b/packages/z2s/src/sql.test.ts index 0a7df7d6c0..522982c3bc 100644 --- a/packages/z2s/src/sql.test.ts +++ b/packages/z2s/src/sql.test.ts @@ -589,6 +589,75 @@ describe('string arg packing', () => { `); }); + test.each(['json', 'jsonb'] as const)( + 'does not reuse placeholders across text and %s writes when the values are equal', + type => { + expect( + formatPgInternalConvert( + sql`INSERT INTO "foo" VALUES (${sqlConvertColumnArg( + {isArray: false, isEnum: false, type: 'text'}, + '', + false, + false, + )}, ${sqlConvertColumnArg( + {isArray: false, isEnum: false, type}, + '', + false, + false, + )})`, + ), + ).toEqual({ + text: `INSERT INTO "foo" VALUES ($1::text::text, $2::text::${type})`, + values: ['', '""'], + }); + }, + ); + + test.each(['json', 'jsonb'] as const)( + 'does not reuse placeholders across %s and text writes when the values are equal', + type => { + expect( + formatPgInternalConvert( + sql`INSERT INTO "foo" VALUES (${sqlConvertColumnArg( + {isArray: false, isEnum: false, type}, + '', + false, + false, + )}, ${sqlConvertColumnArg( + {isArray: false, isEnum: false, type: 'text'}, + '', + false, + false, + )})`, + ), + ).toEqual({ + text: `INSERT INTO "foo" VALUES ($1::text::${type}, $2::text::text)`, + values: ['""', ''], + }); + }, + ); + + test('does not conflate different object values across jsonb columns', () => { + expect( + formatPgInternalConvert( + sql`INSERT INTO "foo" VALUES (${sqlConvertColumnArg( + {isArray: false, isEnum: false, type: 'jsonb'}, + {a: 1}, + false, + false, + )}, ${sqlConvertColumnArg( + {isArray: false, isEnum: false, type: 'jsonb'}, + {b: 2}, + false, + false, + )})`, + ), + ).toEqual({ + text: `INSERT INTO "foo" VALUES ($1::text::jsonb, $2::text::jsonb)`, + values: ['{"a":1}', '{"b":2}'], + }); + }); + test('insert text[]', () => { expect( formatPgInternalConvert( diff --git a/packages/z2s/src/sql.ts b/packages/z2s/src/sql.ts index 6693cad548..df5ff43c2b 100644 --- a/packages/z2s/src/sql.ts +++ b/packages/z2s/src/sql.ts @@ -137,7 +137,8 @@ function stringify(arg: SqlConvertArg): string | null { } class SQLConvertFormat implements FormatConfig { - readonly #seen: Map = new Map(); + readonly #seen: Map> = new Map(); + #size = 0; readonly escapeIdentifier: (str: string) => string; constructor(escapeIdentifier: (str: string) => string) { @@ -146,16 +147,21 @@ class SQLConvertFormat implements FormatConfig { formatValue = (value: unknown) => { assert(isSqlConvert(value), 'JsonPackedFormat can only take JsonPackArgs.'); - const key = value.value; - if (this.#seen.has(key)) { + const byType = this.#seen.get(value.value); + if (byType?.has(value.type)) { return { - placeholder: createPlaceholder(this.#seen.get(key)!, value), + placeholder: createPlaceholder(byType.get(value.type)!, value), value: PREVIOUSLY_SEEN_VALUE, }; } - this.#seen.set(key, this.#seen.size + 1); + this.#size++; + if (byType) { + byType.set(value.type, this.#size); + } else { + this.#seen.set(value.value, new Map([[value.type, this.#size]])); + } return { - placeholder: createPlaceholder(this.#seen.size, value), + placeholder: createPlaceholder(this.#size, value), value: stringify(value), }; }; From 9355886be0bca4670a9f59e912c1f90c8d0cd09a Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Tue, 17 Mar 2026 16:24:37 +0100 Subject: [PATCH 147/495] chore: update vitest and oxlint (#5654) - Simplified the lint script in package.json to remove type awareness and unused directive reporting. - Updated oxlint to version 1.56 and oxlint-tsgolint to version 0.17 for improved linting capabilities. - I had to also update vitest to 4.1 to solve some deps issues --- .oxlintrc.json | 133 - apps/otel-proxy/package.json | 4 +- apps/zbugs/.oxlintrc.json | 8 - apps/zbugs/oxlint.config.ts | 16 + apps/zbugs/package.json | 18 +- .../src/components/label-picker.module.css | 2 +- apps/zbugs/src/umami.ts | 6 +- apps/zbugs/vite.config.ts | 3 +- apps/zbugs/vitest.config.ts | 3 +- apps/zql-viz/package.json | 4 +- oxlint.base.ts | 142 + oxlint.config.ts | 10 + package-lock.json | 53531 ++++------------ package.json | 19 +- packages/analyze-query/package.json | 2 +- packages/datadog/package.json | 4 +- packages/otel/tsconfig.json | 1 + packages/replicache-doc/package.json | 4 +- packages/replicache-perf/package.json | 4 +- packages/replicache/package.json | 12 +- packages/replicache/src/kv/op-sqlite/types.ts | 1 - packages/shared/package.json | 10 +- packages/shared/src/tool/vitest-config.ts | 32 +- packages/z2s/package.json | 4 +- packages/zero-cache/package.json | 4 +- .../zero-cache/src/config/zero-config.test.ts | 10 + .../pg/change-source.backfill.pg.test.ts | 11 +- .../pg/change-source.end-to-mid.pg.test.ts | 15 +- .../change-source/pg/decommission.pg.test.ts | 38 +- .../change-streamer/backup-monitor.test.ts | 6 +- packages/zero-client/package.json | 9 +- packages/zero-client/src/client/error.test.ts | 8 +- packages/zero-pg/package.json | 4 +- packages/zero-protocol/src/error.test.ts | 6 +- packages/zero-react/package.json | 6 + packages/zero-server/package.json | 6 +- packages/zero-solid/package.json | 9 +- packages/zero-types/package.json | 2 +- packages/zero/package.json | 10 +- packages/zql/src/query/define-query.test.ts | 8 +- packages/zqlite-zql-test/package.json | 4 +- 41 files changed, 13989 insertions(+), 40140 deletions(-) delete mode 100644 .oxlintrc.json delete mode 100644 apps/zbugs/.oxlintrc.json create mode 100644 apps/zbugs/oxlint.config.ts create mode 100644 oxlint.base.ts create mode 100644 oxlint.config.ts diff --git a/.oxlintrc.json b/.oxlintrc.json deleted file mode 100644 index 4f5281a430..0000000000 --- a/.oxlintrc.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "plugins": ["eslint", "typescript", "unicorn", "jest"], - "ignorePatterns": [ - "node_modules", - "dist", - "coverage", - "out", - "tool", - "bin", - "*_generated.ts", - "src/*/generated/", - "perf/index.js", - "um.js", - "prod/sst/sst-env.d.ts" - ], - "rules": { - // Disable unsafe optional chaining - many legitimate patterns in codebase - "no-unsafe-optional-chaining": "off", - - "no-console": "error", - "eqeqeq": "error", - "arrow-body-style": "error", - - // Handle unused variables consistently with ESLint config - "no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ], - - // TypeScript-specific rules - "typescript/no-explicit-any": "error", - "typescript/no-floating-promises": "error", - "typescript/no-non-null-assertion": "warn", - "typescript/consistent-type-imports": "error", - "typescript/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ], - - // Require await in async functions - "require-await": "error", - - // Vitest rules uses "jest" plugin - "jest/no-focused-tests": "error", - "jest/no-standalone-expect": "off", - - // Private class members (with inline disables for false positives) - "no-unused-private-class-members": "error", - - // Import restrictions - preserve the exact patterns from @rocicorp/eslint-config - "no-restricted-imports": [ - "error", - { - "patterns": [ - { - "group": [ - "datadog/*", - "otel/*", - "replicache/*", - "replicache-perf/*", - "shared/*", - "zero/*", - "zero-cache/*", - "zero-client/*", - "zero-protocol/*", - "zero-react/*", - "zero-react-native/*", - "zero-schema/*", - "zero-solid/*", - "zero-vue/*", - "zql/*", - "zqlite/*", - "zqlite-zql-test/*" - ], - "message": "Use relative imports instead" - }, - { - "group": ["**/mod.ts"], - "message": "Don't import from barrel files. Import from the specific module instead." - }, - { - "group": ["**/*.test.ts", "**/*.test.tsx"], - "message": "Do not import from test files." - }, - { - "group": ["sinon"], - "message": "Use vi instead of sinon" - } - ], - "paths": [ - {"name": "datadog", "message": "Use relative imports instead"}, - {"name": "otel", "message": "Use relative imports instead"}, - {"name": "replicache", "message": "Use relative imports instead"}, - { - "name": "replicache-perf", - "message": "Use relative imports instead" - }, - {"name": "shared", "message": "Use relative imports instead"}, - {"name": "zero", "message": "Use relative imports instead"}, - {"name": "zero-cache", "message": "Use relative imports instead"}, - {"name": "zero-client", "message": "Use relative imports instead"}, - {"name": "zero-protocol", "message": "Use relative imports instead"}, - {"name": "zero-react", "message": "Use relative imports instead"}, - { - "name": "zero-react-native", - "message": "Use relative imports instead" - }, - {"name": "zero-schema", "message": "Use relative imports instead"}, - {"name": "zero-solid", "message": "Use relative imports instead"}, - {"name": "zero-vue", "message": "Use relative imports instead"}, - {"name": "zql", "message": "Use relative imports instead"}, - {"name": "zqlite", "message": "Use relative imports instead"}, - {"name": "zqlite-zql-test", "message": "Use relative imports instead"} - ] - } - ], - - // Additional beneficial rules - "unicorn/prefer-set-size": "error", - "unicorn/prefer-string-starts-ends-with": "error", - "unicorn/prefer-array-find": "error", - "unicorn/prefer-array-flat-map": "error", - "unicorn/prefer-set-has": "error" - } -} diff --git a/apps/otel-proxy/package.json b/apps/otel-proxy/package.json index eaac195e7c..ffb96f4206 100644 --- a/apps/otel-proxy/package.json +++ b/apps/otel-proxy/package.json @@ -18,8 +18,8 @@ }, "devDependencies": { "@types/node": "^22.10.5", - "@vitest/coverage-v8": "4.0.15", + "@vitest/coverage-v8": "4.1.0", "typescript": "~5.9.3", - "vitest": "4.0.15" + "vitest": "4.1.0" } } diff --git a/apps/zbugs/.oxlintrc.json b/apps/zbugs/.oxlintrc.json deleted file mode 100644 index 81380904e4..0000000000 --- a/apps/zbugs/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": ["../../.oxlintrc.json"], - "plugins": ["react"], - "env": { - "builtin": true, - "browser": true - } -} diff --git a/apps/zbugs/oxlint.config.ts b/apps/zbugs/oxlint.config.ts new file mode 100644 index 0000000000..fb10da0c4c --- /dev/null +++ b/apps/zbugs/oxlint.config.ts @@ -0,0 +1,16 @@ +import {defineConfig} from 'oxlint'; +import {baseConfig} from '../../oxlint.base.ts'; + +/** + * Zbugs-specific oxlint configuration. + * This is a nested config (relative to the mono root oxlint.config.ts), + * so it must not contain `options.typeAware` — that lives in the root config. + */ +export default defineConfig({ + ...baseConfig, + plugins: [...baseConfig.plugins, 'react'], + env: { + builtin: true, + browser: true, + }, +}); diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 13f917e5ad..46947d87b8 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -19,7 +19,7 @@ "clean": "cd docker && docker compose down && docker volume rm docker_zbugs_pgdata_sync && docker volume rm docker_zbugs_pgdata_upstream && rm -rf /tmp/zbugs-sync-replica.db*", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware --react-plugin src/", + "lint": "oxlint --quiet -c ../../oxlint.config.ts src/", "preview": "vite preview", "zero": "tsx --trace-warnings ../../packages/zero-cache/src/server/runner/main.ts", "zero-cache-dev": "tsx ../../packages/zero/src/zero-cache-dev.ts", @@ -79,10 +79,10 @@ "@types/pg": "^8.11.11", "@types/react": "^18.3.18", "@types/react-dom": "18.3.5", - "@vitejs/plugin-react": "^5.1.2", - "@vitest/runner": "4.0.15", - "drizzle-kit": "^0.31.4", - "drizzle-orm": "^0.44.2", + "@vitejs/plugin-react": "^6.0.1", + "@vitest/runner": "4.1.0", + "drizzle-kit": "^0.31.10", + "drizzle-orm": "^0.45.1", "postcss-preset-env": "^7.4.3", "prettier": "^3.8.1", "rehype-video": "^2.3.0", @@ -90,11 +90,9 @@ "tailwindcss": "^3.0.23", "tsx": "^4.21.0", "typescript": "~5.9.3", - "universal-user-agent": "^7.0.2", - "vite": "7.2.7", - "vite-bundle-analyzer": "^1.3.1", + "vite": "8.0.0", + "vite-bundle-analyzer": "^1.3.6", "vite-plugin-svgr": "^4.5.0", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "4.0.15" + "vitest": "4.1.0" } } diff --git a/apps/zbugs/src/components/label-picker.module.css b/apps/zbugs/src/components/label-picker.module.css index 6e1813a55a..2d10827be9 100644 --- a/apps/zbugs/src/components/label-picker.module.css +++ b/apps/zbugs/src/components/label-picker.module.css @@ -48,7 +48,7 @@ top: 2.65rem; /* Center vertically */ transform: translateY(-50%); border-style: solid; - z-index: var(--z-index-popover + 1); + z-index: calc(var(--z-index-popover) + 1); } .popoverWrapper::before { diff --git a/apps/zbugs/src/umami.ts b/apps/zbugs/src/umami.ts index 8487723025..24ed6422d0 100644 --- a/apps/zbugs/src/umami.ts +++ b/apps/zbugs/src/umami.ts @@ -1,5 +1,3 @@ -/* oxlint-disable @typescript-eslint/no-explicit-any */ - // Based on: // // https://github.com/umami-software/umami/blob/master/src/tracker/index.js @@ -9,10 +7,10 @@ // scripts so the global might be undefined interface Umami { - track(eventName: string, eventData?: {[key: string]: any}): void; + track(eventName: string, eventData?: {[key: string]: unknown}): void; } -export const umami: Umami = (globalThis as any).umami ?? { +export const umami: Umami = (globalThis as {umami?: Umami}).umami ?? { track() { // no op }, diff --git a/apps/zbugs/vite.config.ts b/apps/zbugs/vite.config.ts index a39aaf7ec4..01c5bcdadb 100644 --- a/apps/zbugs/vite.config.ts +++ b/apps/zbugs/vite.config.ts @@ -2,7 +2,6 @@ import react from '@vitejs/plugin-react'; import {fileURLToPath, URL} from 'node:url'; import {defineConfig, type PluginOption, type ViteDevServer} from 'vite'; import svgr from 'vite-plugin-svgr'; -import tsconfigPaths from 'vite-tsconfig-paths'; import {makeDefine} from '../../packages/shared/src/build.ts'; import {fastify} from './api/index.ts'; @@ -29,6 +28,7 @@ export default defineConfig({ // `@rocicorp/zero-virtual` against a different module instance, which breaks // Zero context/query internals checks in dev. resolve: { + tsconfigPaths: true, dedupe: ['@rocicorp/zero', '@rocicorp/zero/react'], alias: [ {find: '@rocicorp/zero/react', replacement: zeroReactPath}, @@ -43,7 +43,6 @@ export default defineConfig({ ], }, plugins: [ - tsconfigPaths(), svgr() as unknown as PluginOption, react() as unknown as PluginOption, { diff --git a/apps/zbugs/vitest.config.ts b/apps/zbugs/vitest.config.ts index 1f2c5a943a..8d16d6cb4c 100644 --- a/apps/zbugs/vitest.config.ts +++ b/apps/zbugs/vitest.config.ts @@ -1,6 +1,5 @@ import {dirname, resolve} from 'path'; import {fileURLToPath} from 'url'; -import tsconfigPaths from 'vite-tsconfig-paths'; import {defineConfig, mergeConfig} from 'vitest/config'; import config from '../../packages/shared/src/tool/vitest-config.ts'; @@ -16,8 +15,8 @@ export function configForVersion(version: number, url: string) { const packagesDir = resolve(rootDir, '../../packages'); return mergeConfig(config, { - plugins: [tsconfigPaths()], resolve: { + tsconfigPaths: true, alias: [ { find: '@rocicorp/zero', diff --git a/apps/zql-viz/package.json b/apps/zql-viz/package.json index 53ef29659b..ff49fc0431 100644 --- a/apps/zql-viz/package.json +++ b/apps/zql-viz/package.json @@ -22,9 +22,9 @@ "@tantaman/api-extractor": "^7.52.13", "@types/react": "^18.3.18", "@types/react-dom": "18.3.5", - "@vitejs/plugin-react": "^5.1.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "~5.9.3", - "vite": "7.2.7", + "vite": "8.0.0", "zero-types": "0.0.0", "zql": "0.0.0" } diff --git a/oxlint.base.ts b/oxlint.base.ts new file mode 100644 index 0000000000..aea205ab69 --- /dev/null +++ b/oxlint.base.ts @@ -0,0 +1,142 @@ +import type { OxlintConfig } from 'oxlint'; + +/** + * Shared oxlint configuration for all packages in the monorepo. + * This is a plain data module (not an oxlint config file) so it can be + * imported by both root configs without triggering nested-config validation. + */ +export const baseConfig = { + plugins: ['eslint', 'typescript', 'unicorn', 'jest'], + ignorePatterns: [ + 'node_modules', + 'dist', + 'coverage', + 'out', + 'tool', + 'bin', + '*_generated.ts', + 'src/*/generated/', + 'perf/index.js', + 'um.js', + 'prod/sst/sst-env.d.ts', + '**/um.js', + ], + rules: { + // Disable unsafe optional chaining - many legitimate patterns in codebase + 'no-unsafe-optional-chaining': 'off', + + 'no-console': 'error', + 'eqeqeq': 'error', + 'arrow-body-style': 'error', + + // Handle unused variables consistently with ESLint config + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + + // TypeScript-specific rules + 'typescript/no-explicit-any': 'error', + 'typescript/no-floating-promises': 'error', + 'typescript/no-non-null-assertion': 'warn', + 'typescript/consistent-type-imports': 'error', + 'typescript/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + + // Require await in async functions + 'require-await': 'error', + + // Vitest rules uses "jest" plugin + 'jest/no-focused-tests': 'error', + 'jest/no-standalone-expect': 'off', + + // Private class members (with inline disables for false positives) + 'no-unused-private-class-members': 'error', + + // Import restrictions - preserve the exact patterns from @rocicorp/eslint-config + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: [ + 'datadog/*', + 'otel/*', + 'replicache/*', + 'replicache-perf/*', + 'shared/*', + 'zero/*', + 'zero-cache/*', + 'zero-client/*', + 'zero-protocol/*', + 'zero-react/*', + 'zero-react-native/*', + 'zero-schema/*', + 'zero-solid/*', + 'zero-vue/*', + 'zql/*', + 'zqlite/*', + 'zqlite-zql-test/*', + ], + message: 'Use relative imports instead', + }, + { + group: ['**/mod.ts'], + message: + "Don't import from barrel files. Import from the specific module instead.", + }, + { + group: ['**/*.test.ts', '**/*.test.tsx'], + message: 'Do not import from test files.', + }, + { + group: ['sinon'], + message: 'Use vi instead of sinon', + }, + ], + paths: [ + {name: 'datadog', message: 'Use relative imports instead'}, + {name: 'otel', message: 'Use relative imports instead'}, + {name: 'replicache', message: 'Use relative imports instead'}, + { + name: 'replicache-perf', + message: 'Use relative imports instead', + }, + {name: 'shared', message: 'Use relative imports instead'}, + {name: 'zero', message: 'Use relative imports instead'}, + {name: 'zero-cache', message: 'Use relative imports instead'}, + {name: 'zero-client', message: 'Use relative imports instead'}, + {name: 'zero-protocol', message: 'Use relative imports instead'}, + {name: 'zero-react', message: 'Use relative imports instead'}, + { + name: 'zero-react-native', + message: 'Use relative imports instead', + }, + {name: 'zero-schema', message: 'Use relative imports instead'}, + {name: 'zero-solid', message: 'Use relative imports instead'}, + {name: 'zero-vue', message: 'Use relative imports instead'}, + {name: 'zql', message: 'Use relative imports instead'}, + {name: 'zqlite', message: 'Use relative imports instead'}, + {name: 'zqlite-zql-test', message: 'Use relative imports instead'}, + ], + }, + ], + + // Additional beneficial rules + 'unicorn/prefer-set-size': 'error', + 'unicorn/prefer-string-starts-ends-with': 'error', + 'unicorn/prefer-array-find': 'error', + 'unicorn/prefer-array-flat-map': 'error', + 'unicorn/prefer-set-has': 'error', + }, +} satisfies OxlintConfig; diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 0000000000..28612b48b0 --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,10 @@ +import {defineConfig} from 'oxlint'; +import {baseConfig} from './oxlint.base.ts'; + +export default defineConfig({ + ...baseConfig, + options: { + typeAware: true, + reportUnusedDisableDirectives: 'error', + }, +}); diff --git a/package-lock.json b/package-lock.json index 91f8fd1a7c..26a0355b7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "@rocicorp/mono", "version": "0.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -14,16 +14,16 @@ "tools/*" ], "devDependencies": { - "@vitest/browser-playwright": "^4.0.15", - "@vitest/coverage-v8": "4.0.15", - "@vitest/runner": "4.0.15", - "baseline-browser-mapping": "^2.9.6", - "oxlint": "^1.50.0", - "oxlint-tsgolint": "^0.14.2", + "@vitest/browser-playwright": "^4.1.0", + "@vitest/coverage-v8": "4.1.0", + "@vitest/runner": "4.1.0", + "baseline-browser-mapping": "^2.10.8", + "oxlint": "^1.56.0", + "oxlint-tsgolint": "^0.17.0", "prettier": "^3.8.1", "tsx": "^4.21.0", "turbo": "^2.4.4", - "vitest": "4.0.15" + "vitest": "4.1.0" }, "engines": { "node": ">=22" @@ -36,29 +36,11 @@ }, "devDependencies": { "@types/node": "^22.10.5", - "@vitest/coverage-v8": "4.0.15", + "@vitest/coverage-v8": "4.1.0", "typescript": "~5.9.3", - "vitest": "4.0.15" + "vitest": "4.1.0" } }, - "apps/otel-proxy/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "apps/repro": { - "version": "0.0.0", - "extraneous": true - }, "apps/zbugs": { "version": "0.0.0", "dependencies": { @@ -106,10 +88,10 @@ "@types/pg": "^8.11.11", "@types/react": "^18.3.18", "@types/react-dom": "18.3.5", - "@vitejs/plugin-react": "^5.1.2", - "@vitest/runner": "4.0.15", - "drizzle-kit": "^0.31.4", - "drizzle-orm": "^0.44.2", + "@vitejs/plugin-react": "^6.0.1", + "@vitest/runner": "4.1.0", + "drizzle-kit": "^0.31.10", + "drizzle-orm": "^0.45.1", "postcss-preset-env": "^7.4.3", "prettier": "^3.8.1", "rehype-video": "^2.3.0", @@ -117,474 +99,170 @@ "tailwindcss": "^3.0.23", "tsx": "^4.21.0", "typescript": "~5.9.3", - "universal-user-agent": "^7.0.2", - "vite": "7.2.7", - "vite-bundle-analyzer": "^1.3.1", + "vite": "8.0.0", + "vite-bundle-analyzer": "^1.3.6", "vite-plugin-svgr": "^4.5.0", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "4.0.15" - } - }, - "apps/zbugs/node_modules/@rocicorp/zero-virtual": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rocicorp/zero-virtual/-/zero-virtual-0.1.1.tgz", - "integrity": "sha512-vT6CoSqmgaalsLhyWRo4I9FsRPqF8LR7Yb8LfTkvYL0z0/E4sz8wxqEKQd95UyoIVpsdbcb55ZlkAbaL2Fdp/Q==", - "license": "Apache-2.0", - "peerDependencies": { - "@rocicorp/zero": ">=0.25", - "@tanstack/react-virtual": "^3.13.0", - "@tanstack/virtual-core": "^3.13.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "apps/zbugs/node_modules/@types/pg": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "apps/zbugs/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "apps/zbugs/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "apps/zbugs/node_modules/nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "apps/zbugs/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "vitest": "4.1.0" } }, - "apps/zbugs/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "apps/zbugs/node_modules/drizzle-orm": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", + "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", "dev": true, "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "apps/zbugs/node_modules/vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "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", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.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" + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" }, "peerDependenciesMeta": { - "@types/node": { + "@aws-sdk/client-rds-data": { "optional": true }, - "jiti": { + "@cloudflare/workers-types": { "optional": true }, - "less": { + "@electric-sql/pglite": { "optional": true }, - "lightningcss": { + "@libsql/client": { "optional": true }, - "sass": { + "@libsql/client-wasm": { "optional": true }, - "sass-embedded": { + "@neondatabase/serverless": { "optional": true }, - "stylus": { + "@op-engineering/op-sqlite": { "optional": true }, - "sugarss": { + "@opentelemetry/api": { "optional": true }, - "terser": { + "@planetscale/database": { "optional": true }, - "tsx": { + "@prisma/client": { "optional": true }, - "yaml": { + "@tidbcloud/serverless": { "optional": true - } - } - }, - "apps/zbugs/node_modules/vite-tsconfig-paths": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", - "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { + }, + "@types/better-sqlite3": { "optional": true - } - } - }, - "apps/zbugs/node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "apps/zql-viz": { - "version": "0.0.0", - "dependencies": { - "@monaco-editor/react": "^4.7.0", - "@xyflow/react": "^12.8.2", - "lucide-react": "^0.539.0", - "monaco-editor": "^0.52.2", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-resizable-panels": "^3.0.4" - }, - "devDependencies": { - "@tantaman/api-extractor": "^7.52.13", - "@types/react": "^18.3.18", - "@types/react-dom": "18.3.5", - "@vitejs/plugin-react": "^5.1.2", - "typescript": "~5.9.3", - "vite": "7.2.7", - "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "apps/zql-viz/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { + }, + "@types/pg": { "optional": true - } - } - }, - "apps/zql-viz/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "apps/zql-viz/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "apps/zql-viz/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "apps/zql-viz/node_modules/vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "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", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.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": { + }, + "@types/sql.js": { "optional": true }, - "jiti": { + "@upstash/redis": { "optional": true }, - "less": { + "@vercel/postgres": { "optional": true }, - "lightningcss": { + "@xata.io/client": { "optional": true }, - "sass": { + "better-sqlite3": { "optional": true }, - "sass-embedded": { + "bun-types": { "optional": true }, - "stylus": { + "expo-sqlite": { "optional": true }, - "sugarss": { + "gel": { "optional": true }, - "terser": { + "knex": { "optional": true }, - "tsx": { + "kysely": { "optional": true }, - "yaml": { + "mysql2": { "optional": true - } - } - }, - "node_modules/@0no-co/graphql.web": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", - "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "graphql": { + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { "optional": true } } }, - "node_modules/@ai-sdk/gateway": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.21.tgz", - "integrity": "sha512-BwV7DU/lAm3Xn6iyyvZdWgVxgLu3SNXzl5y57gMvkW4nGhAOV5269IrJzQwGt03bb107sa6H6uJwWxc77zXoGA==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", - "@vercel/oidc": "3.0.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", - "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.19.tgz", - "integrity": "sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/react": { - "version": "2.0.115", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.115.tgz", - "integrity": "sha512-Etu7gWSEi2dmXss1PoR5CAZGwGShXsF9+Pon1eRO6EmatjYaBMhq1CfHPyYhGzWrint8jJIK2VaAhiMef29qZw==", - "license": "Apache-2.0", + "apps/zql-viz": { + "version": "0.0.0", "dependencies": { - "@ai-sdk/provider-utils": "3.0.19", - "ai": "5.0.113", - "swr": "^2.2.5", - "throttleit": "2.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1", - "zod": "^3.25.76 || ^4.1.8" + "@monaco-editor/react": "^4.7.0", + "@xyflow/react": "^12.8.2", + "lucide-react": "^0.539.0", + "monaco-editor": "^0.52.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-resizable-panels": "^3.0.4" }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "devDependencies": { + "@tantaman/api-extractor": "^7.52.13", + "@types/react": "^18.3.18", + "@types/react-dom": "18.3.5", + "@vitejs/plugin-react": "^6.0.1", + "typescript": "~5.9.3", + "vite": "8.0.0", + "zero-types": "0.0.0", + "zql": "0.0.0" } }, "node_modules/@algolia/abtesting": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.0.tgz", - "integrity": "sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.2.tgz", + "integrity": "sha512-rF7vRVE61E0QORw8e2NNdnttcl3jmFMWS9B4hhdga12COe+lMa26bQLfcBn/Nbp9/AF/8gXdaRCPsVns3CnjsA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" @@ -623,99 +301,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.0.tgz", - "integrity": "sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.2.tgz", + "integrity": "sha512-XyvKCm0RRmovMI/ChaAVjTwpZhXdbgt3iZofK914HeEHLqD1MUFFVLz7M0+Ou7F56UkHXwRbpHwb9xBDNopprQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.0.tgz", - "integrity": "sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.49.2.tgz", + "integrity": "sha512-jq/3qvtmj3NijZlhq7A1B0Cl41GfaBpjJxcwukGsYds6aMSCWrEAJ9pUqw/C9B3hAmILYKl7Ljz3N9SFvekD3Q==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.0.tgz", - "integrity": "sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.49.2.tgz", + "integrity": "sha512-bn0biLequn3epobCfjUqCxlIlurLr4RHu7RaE4trgN+RDcUq6HCVC3/yqq1hwbNYpVtulnTOJzcaxYlSr1fnuw==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.0.tgz", - "integrity": "sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.2.tgz", + "integrity": "sha512-z14wfFs1T3eeYbCArC8pvntAWsPo9f6hnUGoj8IoRUJTwgJiiySECkm8bmmV47/x0oGHfsVn3kBdjMX0yq0sNA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.0.tgz", - "integrity": "sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.49.2.tgz", + "integrity": "sha512-GpRf7yuuAX93+Qt0JGEJZwgtL0MFdjFO9n7dn8s2pA9mTjzl0Sc5+uTk1VPbIAuf7xhCP9Mve+URGb6J+EYxgA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.0.tgz", - "integrity": "sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.2.tgz", + "integrity": "sha512-HZwApmNkp0DiAjZcLYdQLddcG4Agb88OkojiAHGgcm5DVXobT5uSZ9lmyrbw/tmQBJwgu2CNw4zTyXoIB7YbPA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", - "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", + "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" @@ -728,81 +406,81 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.0.tgz", - "integrity": "sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==", + "version": "1.49.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.49.2.tgz", + "integrity": "sha512-YYJRjaZ2bqk923HxE4um7j/Cm3/xoSkF2HC2ZweOF8cXL3sqnlndSUYmCaxHFjNPWLaSHk2IfssX6J/tdKTULw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.0.tgz", - "integrity": "sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==", + "version": "1.49.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.2.tgz", + "integrity": "sha512-9WgH+Dha39EQQyGKCHlGYnxW/7W19DIrEbCEbnzwAMpGAv1yTWCHMPXHxYa+LcL3eCp2V/5idD1zHNlIKmHRHg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.0.tgz", - "integrity": "sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.49.2.tgz", + "integrity": "sha512-K7Gp5u+JtVYgaVpBxF5rGiM+Ia8SsMdcAJMTDV93rwh00DKNllC19o1g+PwrDjDvyXNrnTEbofzbTs2GLfFyKA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.0.tgz", - "integrity": "sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.49.2.tgz", + "integrity": "sha512-3UhYCcWX6fbtN8ABcxZlhaQEwXFh3CsFtARyyadQShHMPe3mJV9Wel4FpJTa+seugRkbezFz0tt6aPTZSYTBuA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0" + "@algolia/client-common": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.0.tgz", - "integrity": "sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.2.tgz", + "integrity": "sha512-G94VKSGbsr+WjsDDOBe5QDQ82QYgxvpxRGJfCHZBnYKYsy/jv9qGIDb93biza+LJWizQBUtDj7bZzp3QZyzhPQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0" + "@algolia/client-common": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.0.tgz", - "integrity": "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.49.2.tgz", + "integrity": "sha512-UuihBGHafG/ENsrcTGAn5rsOffrCIRuHMOsD85fZGLEY92ate+BMTUqxz60dv5zerh8ZumN4bRm8eW2z9L11jA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0" + "@algolia/client-common": "5.49.2" }, "engines": { "node": ">= 14.0.0" @@ -813,6 +491,7 @@ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -820,27 +499,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -1044,685 +702,655 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.844.0.tgz", - "integrity": "sha512-Yhp8+U4KFVQqL6phZ5yrHF5PdCvKWbYtLSS+egAfAW+N5w78amhbZcctervj59uqOZHMGDWXuDBklN+7eVfasg==", + "version": "3.1010.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1010.0.tgz", + "integrity": "sha512-XUqXFrn/FGLLzO5OXu9iAtt492kj9Z7Yk8b0iPFxeJoIhaa61YOgR84chOExvnjm2+JTYyGNZiVPmgnFB3jxXA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/credential-provider-node": "3.844.0", - "@aws-sdk/middleware-bucket-endpoint": "3.840.0", - "@aws-sdk/middleware-expect-continue": "3.840.0", - "@aws-sdk/middleware-flexible-checksums": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-location-constraint": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-sdk-s3": "3.844.0", - "@aws-sdk/middleware-ssec": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/signature-v4-multi-region": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/eventstream-serde-browser": "^4.0.4", - "@smithy/eventstream-serde-config-resolver": "^4.1.2", - "@smithy/eventstream-serde-node": "^4.0.4", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-blob-browser": "^4.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/hash-stream-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/md5-js": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.6", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/credential-provider-node": "^3.972.21", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.8", + "@aws-sdk/middleware-expect-continue": "^3.972.8", + "@aws-sdk/middleware-flexible-checksums": "^3.974.0", + "@aws-sdk/middleware-host-header": "^3.972.8", + "@aws-sdk/middleware-location-constraint": "^3.972.8", + "@aws-sdk/middleware-logger": "^3.972.8", + "@aws-sdk/middleware-recursion-detection": "^3.972.8", + "@aws-sdk/middleware-sdk-s3": "^3.972.20", + "@aws-sdk/middleware-ssec": "^3.972.8", + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/region-config-resolver": "^3.972.8", + "@aws-sdk/signature-v4-multi-region": "^3.996.8", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@aws-sdk/util-user-agent-browser": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.973.7", + "@smithy/config-resolver": "^4.4.11", + "@smithy/core": "^3.23.11", + "@smithy/eventstream-serde-browser": "^4.2.12", + "@smithy/eventstream-serde-config-resolver": "^4.3.12", + "@smithy/eventstream-serde-node": "^4.2.12", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/hash-blob-browser": "^4.2.13", + "@smithy/hash-node": "^4.2.12", + "@smithy/hash-stream-node": "^4.2.12", + "@smithy/invalid-dependency": "^4.2.12", + "@smithy/md5-js": "^4.2.12", + "@smithy/middleware-content-length": "^4.2.12", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-retry": "^4.4.42", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.41", + "@smithy/util-defaults-mode-node": "^4.2.44", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/util-stream": "^4.5.19", + "@smithy/util-utf8": "^4.2.2", + "@smithy/util-waiter": "^4.2.13", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.844.0.tgz", - "integrity": "sha512-FktodSx+pfUfIqMjoNwZ6t1xqq/G3cfT7I4JJ0HKHoIIZdoCHQB52x0OzKDtHDJAnEQPInasdPS8PorZBZtHmg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", + "node_modules/@aws-sdk/core": { + "version": "3.973.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.20.tgz", + "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/xml-builder": "^3.972.11", + "@smithy/core": "^3.23.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/core": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.844.0.tgz", - "integrity": "sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==", + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.5.tgz", + "integrity": "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.844.0.tgz", - "integrity": "sha512-WB94Ox86MqcZ4CnRjKgopzaSuZH4hMP0GqdOxG4s1it1lRWOIPOHOC1dPiM0Zbj1uqITIhbXUQVXyP/uaJeNkw==", + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.18.tgz", + "integrity": "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.844.0.tgz", - "integrity": "sha512-e+efVqfkhpM8zxYeiLNgTUlX+tmtXzVm3bw1A02U9Z9cWBHyQNb8pi90M7QniLoqRURY1B0C2JqkOE61gd4KNg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.20.tgz", + "integrity": "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.19", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.844.0.tgz", - "integrity": "sha512-jc5ArGz2HfAx5QPXD+Ep36+QWyCKzl2TG6Vtl87/vljfLhVD0gEHv8fRsqWEp3Rc6hVfKnCjLW5ayR2HYcow9w==", + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.20.tgz", + "integrity": "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/credential-provider-env": "^3.972.18", + "@aws-sdk/credential-provider-http": "^3.972.20", + "@aws-sdk/credential-provider-login": "^3.972.20", + "@aws-sdk/credential-provider-process": "^3.972.18", + "@aws-sdk/credential-provider-sso": "^3.972.20", + "@aws-sdk/credential-provider-web-identity": "^3.972.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz", + "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/credential-provider-env": "3.844.0", - "@aws-sdk/credential-provider-http": "3.844.0", - "@aws-sdk/credential-provider-process": "3.844.0", - "@aws-sdk/credential-provider-sso": "3.844.0", - "@aws-sdk/credential-provider-web-identity": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.844.0.tgz", - "integrity": "sha512-pUqB0StTNyW0R03XjTA3wrQZcie/7FJKSXlYHue921ZXuhLOZpzyDkLNfdRsZTcEoYYWVPSmyS+Eu/g5yVsBNA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.844.0", - "@aws-sdk/credential-provider-http": "3.844.0", - "@aws-sdk/credential-provider-ini": "3.844.0", - "@aws-sdk/credential-provider-process": "3.844.0", - "@aws-sdk/credential-provider-sso": "3.844.0", - "@aws-sdk/credential-provider-web-identity": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.21.tgz", + "integrity": "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.18", + "@aws-sdk/credential-provider-http": "^3.972.20", + "@aws-sdk/credential-provider-ini": "^3.972.20", + "@aws-sdk/credential-provider-process": "^3.972.18", + "@aws-sdk/credential-provider-sso": "^3.972.20", + "@aws-sdk/credential-provider-web-identity": "^3.972.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.844.0.tgz", - "integrity": "sha512-VCI8XvIDt2WBfk5Gi/wXKPcWTS3OkAbovB66oKcNQalllH8ESDg4SfLNhchdnN8A5sDGj6tIBJ19nk+dQ6GaqQ==", + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.18.tgz", + "integrity": "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.844.0.tgz", - "integrity": "sha512-UNp/uWufGlb5nWa4dpc6uQnDOB/9ysJJFG95ACowNVL9XWfi1LJO7teKrqNkVhq0CzSJS1tCt3FvX4UfM+aN1g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.844.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/token-providers": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.20.tgz", + "integrity": "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/token-providers": "3.1009.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.844.0.tgz", - "integrity": "sha512-iDmX4pPmatjttIScdspZRagaFnCjpHZIEEwTyKdXxUaU0iAOSXF8ecrCEvutETvImPOC86xdrq+MPacJOnMzUA==", + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.20.tgz", + "integrity": "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", - "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz", + "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.840.0.tgz", - "integrity": "sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz", + "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.844.0.tgz", - "integrity": "sha512-LCImZd1hpM0cegfdpgZyK6x4on4Ky+c9XCFURfE4wil1J9HXf6OP4KsfHQwt1yIkMEbFqvd/ab2I5fmp7S7aFA==", + "version": "3.974.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.0.tgz", + "integrity": "sha512-BmdDjqvnuYaC4SY7ypHLXfCSsGYGUZkjCLSZyUAAYn1YT28vbNMJNDwhlfkvvE+hQHG5RJDlEmYuvBxcB9jX1g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/crc64-nvme": "^3.972.5", + "@aws-sdk/types": "^3.973.6", + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.19", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.840.0.tgz", - "integrity": "sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz", + "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "^3.973.6", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.844.0.tgz", - "integrity": "sha512-vOD5reqZszXBWMbZFN3EUar203o2i8gcoTdrymY4GMsAPDsh0k8yd3VJRNPuxT/017tP6G+rQepOGzna4umung==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.20.tgz", + "integrity": "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/core": "^3.23.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.19", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.840.0.tgz", - "integrity": "sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz", + "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.844.0.tgz", - "integrity": "sha512-SIbDNUL6ZYXPj5Tk0qEz05sW9kNS1Gl3/wNWEmH+AuUACipkyIeKKWzD6z5433MllETh73vtka/JQF3g7AuZww==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@smithy/core": "^3.7.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz", + "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@smithy/core": "^3.23.11", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-retry": "^4.2.12", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.844.0.tgz", - "integrity": "sha512-p2XILWc7AcevUSpBg2VtQrk79eWQC4q2JsCSY7HxKpFLZB4mMOfmiTyYkR1gEA6AttK/wpCOtfz+hi1/+z2V1A==", + "version": "3.996.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz", + "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/middleware-host-header": "^3.972.8", + "@aws-sdk/middleware-logger": "^3.972.8", + "@aws-sdk/middleware-recursion-detection": "^3.972.8", + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/region-config-resolver": "^3.972.8", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@aws-sdk/util-user-agent-browser": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.973.7", + "@smithy/config-resolver": "^4.4.11", + "@smithy/core": "^3.23.11", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/hash-node": "^4.2.12", + "@smithy/invalid-dependency": "^4.2.12", + "@smithy/middleware-content-length": "^4.2.12", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-retry": "^4.4.42", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.41", + "@smithy/util-defaults-mode-node": "^4.2.44", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.844.0.tgz", - "integrity": "sha512-i953TKW1rXbd9G2xEgWoJZDoF0Z1ONRlrXkOKDGOrY/uQhAIPNDz5k6tFcXG5oIaLWW197ShENv3CeEJnhfh3g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-format-url": "3.840.0", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", + "version": "3.1010.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.1010.0.tgz", + "integrity": "sha512-EP+LRZ5+FM9IFZz9vmRSCHAqtaD39Y3TcMbBApn2NgHIogvYxuLx+KUV9rcjGOyJFSDlbSUa0R9s1bM/YmeSCg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/signature-v4-multi-region": "^3.996.8", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-format-url": "^3.972.8", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.844.0.tgz", - "integrity": "sha512-QC8nocQcZ3Bj7vTnuL47iNhcuUjMC46E2L85mU+sPQo3LN2qBVGSOTF+xSWGvmSFDpkN4ZXUMVeA0cJoJFEDFA==", + "version": "3.996.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.8.tgz", + "integrity": "sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-sdk-s3": "^3.972.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.844.0.tgz", - "integrity": "sha512-Kh728FEny0fil+LeH8U1offPJCTd/EDh8liBAvLtViLHt2WoX2xC8rk98D38Q5p79aIUhHb3Pf4n9IZfTu/Kog==", + "version": "3.1009.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1009.0.tgz", + "integrity": "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", - "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", + "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.844.0.tgz", - "integrity": "sha512-1DHh0WTUmxlysz3EereHKtKoxVUG9UC5BsfAw6Bm4/6qDlJiqtY3oa2vebkYN23yltKdfsCK65cwnBRU59mWVg==", + "version": "3.996.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-endpoints": "^3.3.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.840.0.tgz", - "integrity": "sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.8.tgz", + "integrity": "sha512-J6DS9oocrgxM8xlUTTmQOuwRF6rnAGEujAN9SAzllcrQmwn5iJ58ogxy3SEhD0Q7JZvlA5jvIXBkpQRqEqlE9A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "^3.973.6", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", - "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.844.0.tgz", - "integrity": "sha512-0eTpURp9Gxbyyeqr78ogARZMSWS5KUMZuN+XMHxNpQLmn2S+J3g+MAyoklCcwhKXlbdQq2aMULEiy0mqIWytuw==", + "version": "3.973.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz", + "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/types": "^3.973.6", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -1734,25 +1362,35 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz", + "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", + "fast-xml-parser": "5.4.1", "tslib": "^2.6.2" }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", "engines": { "node": ">=18.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -1761,29 +1399,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -1803,18 +1441,19 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -1836,12 +1475,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -1851,15 +1490,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1869,24 +1499,18 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -1932,16 +1556,16 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" + "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -1957,40 +1581,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2012,9 +1636,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2038,14 +1662,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2095,141 +1719,39 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -2302,13 +1824,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2318,16 +1840,16 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", - "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-decorators": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2425,14 +1947,14 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2454,14 +1976,14 @@ } }, "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", - "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.28.6.tgz", + "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2471,14 +1993,14 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", - "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", + "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2488,12 +2010,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2503,12 +2025,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2546,12 +2068,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2679,12 +2201,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2725,14 +2247,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -2742,13 +2264,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { @@ -2774,12 +2296,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2789,13 +2311,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2805,13 +2327,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2821,17 +2343,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2841,13 +2363,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2873,13 +2395,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2904,13 +2426,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2935,13 +2457,13 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2951,12 +2473,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3032,12 +2554,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3062,12 +2584,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3108,13 +2630,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3124,15 +2646,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -3158,13 +2680,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3189,12 +2711,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3204,12 +2726,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3219,16 +2741,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3254,12 +2776,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3269,12 +2791,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -3300,13 +2822,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3316,14 +2838,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3363,12 +2885,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3378,16 +2900,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3397,12 +2919,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3417,6 +2939,7 @@ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -3433,6 +2956,7 @@ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -3444,13 +2968,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3460,12 +2984,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3475,13 +2999,13 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3506,16 +3030,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -3550,12 +3074,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -3611,16 +3135,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz", - "integrity": "sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3645,13 +3169,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3677,13 +3201,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -3693,80 +3217,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", + "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.28.6", "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", "semver": "^6.3.1" }, "engines": { @@ -3777,13 +3301,13 @@ } }, "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3813,17 +3337,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", - "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3833,16 +3357,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -3852,55 +3376,52 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", - "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", + "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", "license": "MIT", "dependencies": { - "core-js-pure": "^3.43.0" + "core-js-pure": "^3.48.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -3909,19 +3430,19 @@ }, "node_modules/@babel/traverse--for-generate-function-map": { "name": "@babel/traverse", - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -3929,9 +3450,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -3967,6 +3488,13 @@ "node": ">=18" } }, + "node_modules/@blazediff/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", + "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", + "dev": true, + "license": "MIT" + }, "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", @@ -3979,6 +3507,13 @@ "lodash": "4.17.21" } }, + "node_modules/@chevrotain/cst-dts-gen/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/@chevrotain/gast": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", @@ -3990,6 +3525,13 @@ "lodash": "4.17.21" } }, + "node_modules/@chevrotain/gast/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/@chevrotain/types": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz", @@ -4018,6 +3560,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -4029,6 +3572,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -4249,6 +3793,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "postcss-selector-parser": "^6.0.10" @@ -4269,6 +3814,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -4585,6 +4131,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4685,6 +4232,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4704,6 +4252,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -4746,6 +4295,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -4991,6 +4541,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5010,6 +4561,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5029,6 +4581,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -5071,6 +4624,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5081,6 +4635,32 @@ "postcss": "^8.3" } }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/@csstools/postcss-random-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", @@ -5232,6 +4812,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5246,6 +4827,31 @@ "postcss": "^8.2" } }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/@csstools/postcss-system-ui-font-family": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", @@ -5277,6 +4883,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5296,6 +4903,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -5315,6 +4923,7 @@ "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -5331,6 +4940,7 @@ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -5368,6 +4978,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@databases/escape-identifier/-/escape-identifier-1.0.3.tgz", "integrity": "sha512-Su36iSVzaHxpVdISVMViUX/32sLvzxVgjZpYhzhotxZUuLo11GVWsiHwqkvUZijTLUxcDmUqEwGJO3O/soLuZA==", + "license": "MIT", "dependencies": { "@databases/validate-unicode": "^1.0.0" } @@ -5375,12 +4986,14 @@ "node_modules/@databases/sql": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@databases/sql/-/sql-3.3.0.tgz", - "integrity": "sha512-vj9huEy4mjJ48GS1Z8yvtMm4BYAnFYACUds25ym6Gd/gsnngkJ17fo62a6mmbNNwCBS/8467PmZR01Zs/06TjA==" + "integrity": "sha512-vj9huEy4mjJ48GS1Z8yvtMm4BYAnFYACUds25ym6Gd/gsnngkJ17fo62a6mmbNNwCBS/8467PmZR01Zs/06TjA==", + "license": "MIT" }, "node_modules/@databases/validate-unicode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@databases/validate-unicode/-/validate-unicode-1.0.0.tgz", - "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==" + "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==", + "license": "MIT" }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", @@ -5392,9 +5005,9 @@ } }, "node_modules/@docsearch/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.3.1.tgz", - "integrity": "sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.0.tgz", + "integrity": "sha512-IqG3oSd529jVRQ4dWZQKwZwQLVd//bWJTz2HiL0LkiHrI4U/vLrBasKB7lwQB/69nBAcCgs3TmudxTZSLH/ZQg==", "license": "MIT", "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -5414,25 +5027,20 @@ } }, "node_modules/@docsearch/css": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.3.2.tgz", - "integrity": "sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.0.tgz", + "integrity": "sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ==", "license": "MIT" }, "node_modules/@docsearch/react": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.3.2.tgz", - "integrity": "sha512-74SFD6WluwvgsOPqifYOviEEVwDxslxfhakTlra+JviaNcs7KK/rjsPj89kVEoQc9FUxRkAofaJnHIR7pb4TSQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.0.tgz", + "integrity": "sha512-j8H5B4ArGxBPBWvw3X0J0Rm/Pjv2JDa2rV5OE0DLTp5oiBCptIJ/YlNOhZxuzbO2nwge+o3Z52nJRi3hryK9cA==", "license": "MIT", "dependencies": { - "@ai-sdk/react": "^2.0.30", "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.3.1", - "@docsearch/css": "4.3.2", - "ai": "^5.0.30", - "algoliasearch": "^5.28.0", - "marked": "^16.3.0", - "zod": "^4.1.8" + "@docsearch/core": "4.6.0", + "@docsearch/css": "4.6.0" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -5455,15 +5063,6 @@ } } }, - "node_modules/@docsearch/react/node_modules/zod": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.0.tgz", - "integrity": "sha512-Bd5fw9wlIhtqCCxotZgdTOMwGm1a0u75wARVEY9HMs1X17trvA/lMi4+MGK5EUfYkXVTbX8UDiDKW4OgzHVUZw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@docusaurus/babel": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", @@ -5723,9 +5322,9 @@ } }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", - "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", "funding": [ { "type": "github", @@ -6022,9 +5621,9 @@ } }, "node_modules/@docusaurus/bundler/node_modules/cssdb": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.5.2.tgz", - "integrity": "sha512-Pmoj9RmD8RIoIzA2EQWO4D4RMeDts0tgAH0VXdlNdxjuBGI3a9wMOIcUwaPNmD4r2qtIa06gqkIf7sECl+cBCg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.8.0.tgz", + "integrity": "sha512-QbLeyz2Bgso1iRlh7IpWk6OKa3lLNGXsujVjDMPl9rOZpxKeiG69icLpbLCFxeURwmcdIfZqQyhlooKJYM4f8Q==", "funding": [ { "type": "opencollective", @@ -6532,9 +6131,9 @@ } }, "node_modules/@docusaurus/bundler/node_modules/postcss-preset-env": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.5.0.tgz", - "integrity": "sha512-xgxFQPAPxeWmsgy8cR7GM1PGAL/smA5E9qU7K//D4vucS01es3M0fDujhDJn3kY8Ip7/vVYcecbe1yY+vBo3qQ==", + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", "funding": [ { "type": "github", @@ -6572,25 +6171,27 @@ "@csstools/postcss-media-minmax": "^2.0.9", "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", "@csstools/postcss-oklab-function": "^4.0.12", "@csstools/postcss-position-area-property": "^1.0.0", "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", "@csstools/postcss-random-function": "^2.0.1", "@csstools/postcss-relative-color-syntax": "^3.0.12", "@csstools/postcss-scope-pseudo-class": "^4.0.1", "@csstools/postcss-sign-functions": "^1.1.4", "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", "@csstools/postcss-system-ui-font-family": "^1.0.0", "@csstools/postcss-text-decoration-shorthand": "^4.0.3", "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.22", - "browserslist": "^4.28.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", "css-blank-pseudo": "^7.0.1", "css-has-pseudo": "^7.0.3", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.5.2", + "cssdb": "^8.6.0", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^7.0.12", @@ -6748,15 +6349,109 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/core/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "node_modules/@docusaurus/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@docusaurus/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@docusaurus/core/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@docusaurus/core/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { "node": ">= 6" } }, + "node_modules/@docusaurus/core/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@docusaurus/core/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@docusaurus/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@docusaurus/cssnano-preset": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", @@ -6785,6 +6480,49 @@ "node": ">=20.0" } }, + "node_modules/@docusaurus/logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@docusaurus/logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@docusaurus/logger/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@docusaurus/mdx-loader": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", @@ -6824,18 +6562,6 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/mdx-loader/node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/@docusaurus/module-type-aliases": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", @@ -7258,15 +6984,6 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/types/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/@docusaurus/types/node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", @@ -7346,13 +7063,13 @@ } }, "node_modules/@dotenvx/dotenvx": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.39.0.tgz", - "integrity": "sha512-qGfDpL/3S17MQYXpR3HkBS5xNQ7wiFlqLdpr+iIQzv17aMRcSlgL4EjMIsYFZ540Dq17J+y5FVElA1AkVoXiUA==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.55.1.tgz", + "integrity": "sha512-WEuKyoe9CA7dfcFBnNbL0ndbCNcptaEYBygfFo9X1qEG+HD7xku4CYIplw6sbAHJavesZWbVBHeRSpvri0eKqw==", "license": "BSD-3-Clause", "dependencies": { "commander": "^11.1.0", - "dotenv": "^16.4.5", + "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", @@ -7362,8 +7079,7 @@ "which": "^4.0.0" }, "bin": { - "dotenvx": "src/cli/dotenvx.js", - "git-dotenvx": "src/cli/dotenvx.js" + "dotenvx": "src/cli/dotenvx.js" }, "funding": { "url": "https://dotenvx.com" @@ -7378,60 +7094,11 @@ "node": ">=16" } }, - "node_modules/@dotenvx/dotenvx/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, "node_modules/@drdgvhbh/postgres-error-codes": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@drdgvhbh/postgres-error-codes/-/postgres-error-codes-0.0.6.tgz", - "integrity": "sha512-tAz0Xp+qhq90x0r/3VW96iRdHFw72cYQqXa65u0eFVhSMC27bc2gZ8Ky5WXEmshrl/bCe7QTYBNEF0U5zeSQjw==" + "integrity": "sha512-tAz0Xp+qhq90x0r/3VW96iRdHFw72cYQqXa65u0eFVhSMC27bc2gZ8Ky5WXEmshrl/bCe7QTYBNEF0U5zeSQjw==", + "license": "MIT" }, "node_modules/@drizzle-team/brocli": { "version": "0.10.2", @@ -7441,9 +7108,9 @@ "license": "Apache-2.0" }, "node_modules/@ecies/ciphers": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.3.tgz", - "integrity": "sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.5.tgz", + "integrity": "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==", "license": "MIT", "engines": { "bun": ">=1", @@ -7503,50 +7170,50 @@ } }, "node_modules/@electric-sql/pglite": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", - "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz", + "integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.0.6.tgz", - "integrity": "sha512-6RjmgzphIHIBA4NrMGJsjNWK4pu+bCWJlEWlwcxFTVY3WT86dFpKwbZaGWZV6C5Rd7sCk1Z0CI76QEfukLAUXw==", + "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==", "dev": true, "license": "Apache-2.0", "bin": { "pglite-server": "dist/scripts/server.js" }, "peerDependencies": { - "@electric-sql/pglite": "0.3.2" + "@electric-sql/pglite": "0.3.15" } }, "node_modules/@electric-sql/pglite-tools": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.2.7.tgz", - "integrity": "sha512-9dAccClqxx4cZB+Ar9B+FZ5WgxDc/Xvl9DPrTWv+dYTf0YNubLzi4wHHRGRGhrJv15XwnyKcGOZAP1VXSneSUg==", + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.2.20.tgz", + "integrity": "sha512-BK50ZnYa3IG7ztXhtgYf0Q7zijV32Iw1cYS8C+ThdQlwx12V5VZ9KRJ42y82Hyb4PkTxZQklVQA9JHyUlex33A==", "dev": true, "license": "Apache-2.0", "peerDependencies": { - "@electric-sql/pglite": "0.3.2" + "@electric-sql/pglite": "0.3.15" } }, "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", + "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", "license": "MIT", "optional": true, "dependencies": { @@ -7554,9 +7221,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "license": "MIT", "optional": true, "dependencies": { @@ -8000,12 +7667,13 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8016,12 +7684,13 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8032,12 +7701,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8048,12 +7718,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8064,12 +7735,13 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8080,12 +7752,13 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8096,12 +7769,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8112,12 +7786,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8128,12 +7803,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8144,12 +7820,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8160,12 +7837,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8176,12 +7854,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8192,12 +7871,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8208,12 +7888,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8224,12 +7905,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8240,12 +7922,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8256,12 +7939,13 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8272,12 +7956,13 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8288,12 +7973,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8304,12 +7990,13 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8320,12 +8007,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8336,12 +8024,13 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8352,12 +8041,13 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8368,12 +8058,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8384,12 +8075,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8400,12 +8092,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8416,51 +8109,48 @@ } }, "node_modules/@expo/code-signing-certificates": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", - "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", + "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "node-forge": "^1.2.1", - "nullthrows": "^1.1.1" + "node-forge": "^1.3.3" } }, "node_modules/@expo/config": { - "version": "12.0.13", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", - "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.8.tgz", + "integrity": "sha512-D7RYYHfErCgEllGxNwdYdkgzLna7zkzUECBV3snbUpf7RvIpB5l1LpCgzuVoc5KVew5h7N1Tn4LnT/tBSUZsQg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.4", - "@expo/config-types": "^54.0.10", - "@expo/json-file": "^10.0.8", + "@expo/config-plugins": "~55.0.6", + "@expo/config-types": "^55.0.5", + "@expo/json-file": "^10.0.12", + "@expo/require-utils": "^55.0.2", "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^13.0.0", - "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "~3.35.1" + "slugify": "^1.3.4" } }, "node_modules/@expo/config-plugins": { - "version": "54.0.4", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", - "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-55.0.6.tgz", + "integrity": "sha512-cIox6FjZlFaaX40rbQ3DvP9e87S5X85H9uw+BAxJE5timkMhuByy3GAlOsj1h96EyzSiol7Q6YIGgY1Jiz4M+A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@expo/config-types": "^54.0.10", - "@expo/json-file": "~10.0.8", - "@expo/plist": "^0.4.8", + "@expo/config-types": "^55.0.5", + "@expo/json-file": "~10.0.12", + "@expo/plist": "^0.5.2", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", @@ -8468,216 +8158,195 @@ "glob": "^13.0.0", "resolve-from": "^5.0.0", "semver": "^7.5.4", - "slash": "^3.0.0", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" } }, - "node_modules/@expo/config-plugins/node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "node_modules/@expo/config-plugins/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "20 || >=22" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/config-plugins/node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "node_modules/@expo/config-plugins/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "20 || >=22" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/config-plugins/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "node_modules/@expo/config-plugins/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/@expo/config-plugins/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "node_modules/@expo/config-plugins/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, "node_modules/@expo/config-types": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", - "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", + "version": "55.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-55.0.5.tgz", + "integrity": "sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==", "dev": true, "license": "MIT", "peer": true }, - "node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "node_modules/@expo/config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "@babel/highlight": "^7.10.4" + "engines": { + "node": ">=8" } }, - "node_modules/@expo/config/node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "node_modules/@expo/devcert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", + "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@expo/sudo-prompt": "^9.3.1", + "debug": "^3.1.0" } }, - "node_modules/@expo/config/node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, - "engines": { - "node": "20 || >=22" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/@expo/config/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "node_modules/@expo/env": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.1.1.tgz", + "integrity": "sha512-rVvHC4I6xlPcg+mAO09ydUi2Wjv1ZytpLmHOSzvXzBAz9mMrJggqCe4s4dubjJvi/Ino/xQCLhbaLCnTtLpikg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "chalk": "^4.0.0", + "debug": "^4.3.4", + "getenv": "^2.0.0" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=20.12.0" } }, - "node_modules/@expo/config/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "node_modules/@expo/env/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "color-convert": "^2.0.1" }, "engines": { - "node": "20 || >=22" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@expo/devcert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", - "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/sudo-prompt": "^9.3.1", - "debug": "^3.1.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/devcert/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@expo/env/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "ms": "^2.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/env": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", - "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", + "node_modules/@expo/env/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@expo/fingerprint": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", - "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.16.6.tgz", + "integrity": "sha512-nRITNbnu3RKSHPvKVehrSU4KG2VY9V8nvULOHBw98ukHCAU4bGrU5APvcblOkX3JAap+xEHsg/mZvqlvkLInmQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { + "@expo/env": "^2.0.11", "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", "chalk": "^4.1.2", "debug": "^4.3.4", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", + "minimatch": "^10.2.2", "resolve-from": "^5.0.0", "semver": "^7.6.0" }, @@ -8685,46 +8354,87 @@ "fingerprint": "bin/cli.js" } }, - "node_modules/@expo/fingerprint/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "node_modules/@expo/fingerprint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/@expo/fingerprint/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/@expo/fingerprint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "balanced-match": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@expo/fingerprint/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@expo/fingerprint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/fingerprint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@expo/image-utils": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", - "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.12.tgz", + "integrity": "sha512-3KguH7kyKqq7pNwLb9j6BBdD/bjmNwXZG/HPWT6GWIXbwrvAJt2JNyYTP5agWJ8jbbuys1yuCzmkX+TU6rmI7A==", "dev": true, "license": "MIT", "peer": true, @@ -8735,127 +8445,189 @@ "jimp-compact": "0.16.1", "parse-png": "^2.1.0", "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", - "semver": "^7.6.0", - "temp-dir": "~2.0.0", - "unique-string": "~2.0.0" + "semver": "^7.6.0" } }, - "node_modules/@expo/image-utils/node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "node_modules/@expo/image-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/image-utils/node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "node_modules/@expo/image-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/image-utils/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/image-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "crypto-random-string": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@expo/json-file": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", - "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", + "version": "10.0.12", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.12.tgz", + "integrity": "sha512-inbDycp1rMAelAofg7h/mMzIe+Owx6F7pur3XdQ3EPTy00tme+4P6FWgHKUcjN8dBSrnbRNpSyh5/shzHyVCyQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "~7.10.4", + "@babel/code-frame": "^7.20.0", "json5": "^2.2.3" } }, - "node_modules/@expo/json-file/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "node_modules/@expo/local-build-cache-provider": { + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.6.tgz", + "integrity": "sha512-4kfdv48sKzokijMqi07fINYA9/XprshmPgSLf8i69XgzIv2YdRyBbb70SzrufB7PDneFoltz8N83icW8gOOj1g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "@expo/config": "~55.0.8", + "chalk": "^4.1.2" } }, - "node_modules/@expo/mcp-tunnel": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", - "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", + "node_modules/@expo/local-build-cache-provider/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "ws": "^8.18.3", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.24.6" + "color-convert": "^2.0.1" }, - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.13.2" + "engines": { + "node": ">=8" }, - "peerDependenciesMeta": { - "@modelcontextprotocol/sdk": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/local-build-cache-provider/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/local-build-cache-provider/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@expo/metro": { - "version": "54.0.0", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", - "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", + "version": "54.2.0", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", + "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "metro": "0.83.1", - "metro-babel-transformer": "0.83.1", - "metro-cache": "0.83.1", - "metro-cache-key": "0.83.1", - "metro-config": "0.83.1", - "metro-core": "0.83.1", - "metro-file-map": "0.83.1", - "metro-resolver": "0.83.1", - "metro-runtime": "0.83.1", - "metro-source-map": "0.83.1", - "metro-transform-plugins": "0.83.1", - "metro-transform-worker": "0.83.1" + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3" } }, "node_modules/@expo/osascript": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", - "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.2.tgz", + "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@expo/spawn-async": "^1.7.2", - "exec-async": "^2.2.0" + "@expo/spawn-async": "^1.7.2" }, "engines": { "node": ">=12" } }, "node_modules/@expo/package-manager": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", - "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.3.tgz", + "integrity": "sha512-ZuXiK/9fCrIuLjPSe1VYmfp0Sa85kCMwd8QQpgyi5ufppYKRtLBg14QOgUqj8ZMbJTxE0xqzd0XR7kOs3vAK9A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@expo/json-file": "^10.0.8", + "@expo/json-file": "^10.0.12", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", @@ -8863,23 +8635,93 @@ "resolve-workspace-root": "^2.0.0" } }, + "node_modules/@expo/package-manager/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/package-manager/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/package-manager/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@expo/plist": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", - "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.2.tgz", + "integrity": "sha512-o4xdVdBpe4aTl3sPMZ2u3fJH4iG1I768EIRk1xRZP+GaFI93MaR3JvoFibYqxeTmLQ1p1kNEVqylfUjezxx45g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.2.3", + "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, + "node_modules/@expo/require-utils": { + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.2.tgz", + "integrity": "sha512-dV5oCShQ1umKBKagMMT4B/N+SREsQe3lU4Zgmko5AO0rxKV0tynZT6xXs+e2JxuqT4Rz997atg7pki0BnZb4uw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8" + }, + "peerDependencies": { + "typescript": "^5.0.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@expo/schema-utils": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", - "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.2.tgz", + "integrity": "sha512-QZ5WKbJOWkCrMq0/kfhV9ry8te/OaS34YgLVpG8u9y2gix96TlpRTbxM/YATjNcUR2s4fiQmPCOxkGtog4i37g==", "dev": true, "license": "MIT", "peer": true @@ -8923,89 +8765,74 @@ "peer": true }, "node_modules/@expo/xcpretty": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", - "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.1.tgz", + "integrity": "sha512-KZNxZvnGCtiM2aYYZ6Wz0Ix5r47dAvpNLApFtZWnSoERzAdOMzVBOPysBoM0JlF6FKWZ8GPqgn6qt3dV/8Zlpg==", "dev": true, "license": "BSD-3-Clause", "peer": true, "dependencies": { - "@babel/code-frame": "7.10.4", + "@babel/code-frame": "^7.20.0", "chalk": "^4.1.0", - "find-up": "^5.0.0", "js-yaml": "^4.1.0" }, "bin": { "excpretty": "build/cli.js" } }, - "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/xcpretty/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==", + "node_modules/@expo/xcpretty/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/xcpretty/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==", + "node_modules/@expo/xcpretty/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "p-locate": "^5.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/xcpretty/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==", + "node_modules/@expo/xcpretty/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "p-limit": "^3.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/@faker-js/faker": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.6.0.tgz", - "integrity": "sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.9.0.tgz", + "integrity": "sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==", "funding": [ { "type": "opencollective", @@ -9019,35 +8846,26 @@ } }, "node_modules/@fastify/ajv-compiler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.0.tgz", - "integrity": "sha512-dt0jyLAlay14LpIn4Fg1SY7V5NJ9KH0YFDpYVQY5cgIVBvdI8908AMx5zQ0bBYPGT6Wh+bM3f2caMmOXLP3QsQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", + "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0" } }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "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/@fastify/ajv-compiler/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==" - }, "node_modules/@fastify/busboy": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", @@ -9058,40 +8876,66 @@ } }, "node_modules/@fastify/cookie": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@fastify/cookie/-/cookie-10.0.0.tgz", - "integrity": "sha512-S43spazwAfzm5nKlqq/spAGW+O6r+WQzg5vXXI1ArCXXFa8KBA/tiU3XRVQUehSNtbN5PA6+g183hzh5/dZ6Iw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@fastify/cookie/-/cookie-10.0.1.tgz", + "integrity": "sha512-NV/wbCUv4ETJ5KM1KMu0fLx0nSCm9idIxwg66NZnNbfPQH3rdbx6k0qRs5uy0y+MhBgvDudYRA30KlK659chyw==", + "license": "MIT", "dependencies": { "cookie-signature": "^1.2.1", "fastify-plugin": "^5.0.0" } }, - "node_modules/@fastify/cookie/node_modules/cookie-signature": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", - "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", - "engines": { - "node": ">=6.6.0" - } - }, "node_modules/@fastify/cors": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-10.0.0.tgz", - "integrity": "sha512-kb9fkc/LVbLTQ3lhA+ZZjC/Styzysodo/MTCdVCvTtgHa/gBwxrEEkcp3fuoKIfAQt85wksrpXjUGbw5NQffEQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-10.1.0.tgz", + "integrity": "sha512-MZyBCBJtII60CU9Xme/iE4aEy8G7QpzGR8zkdXZkDFt7ElEMachbE61tfhAG/bvSaULlqlf0huMT12T7iqEmdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { "fastify-plugin": "^5.0.0", - "mnemonist": "0.39.8" + "mnemonist": "0.40.0" } }, "node_modules/@fastify/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.0.0.tgz", - "integrity": "sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" }, "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.0.tgz", - "integrity": "sha512-tywfuZfXsyxLC5kEqrMubbFa9vpAxNtuPE7j9w5si1r+6p5b981pDfZ5Y8HBqmjDQl+PABT7cV5jZgXI2j+I5g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", + "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { "fast-json-stringify": "^6.0.0" } @@ -9113,21 +8957,63 @@ "license": "MIT" }, "node_modules/@fastify/merge-json-schemas": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", - "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "dequal": "^2.0.3" } }, "node_modules/@fastify/oauth2": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@fastify/oauth2/-/oauth2-8.0.0.tgz", - "integrity": "sha512-mqB6jcBUfkBvHqJJ3gCi6yqpf0iLhtmKAZL0OuthqlAWzaUfUaoIgBeCB6wc/duMxw41ElzgJUPYCOJ3jhhvOw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@fastify/oauth2/-/oauth2-8.2.0.tgz", + "integrity": "sha512-JQls0pZVt7k9j+qLrSf5OGflpHvylgEfSCVSA2oDaILCX3dwC/Z0UeI1J9M3luik7dtEbEFfpq0v9hF1v/46pQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { - "@fastify/cookie": "^10.0.0", - "fastify-plugin": "^5.0.0", - "simple-oauth2": "^5.0.0" + "@fastify/cookie": "^11.0.2", + "fastify-plugin": "^5.1.0", + "simple-oauth2": "^5.1.0" + } + }, + "node_modules/@fastify/oauth2/node_modules/@fastify/cookie": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@fastify/cookie/-/cookie-11.0.2.tgz", + "integrity": "sha512-GWdwdGlgJxyvNv+QcKiGNevSspMQXncjMZ1J8IvuDQk0jvkzgWWZFNC2En3s+nHndZBGV8IbLwOI/sxCZw/mzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "cookie": "^1.0.0", + "fastify-plugin": "^5.0.0" } }, "node_modules/@fastify/proxy-addr": { @@ -9151,9 +9037,20 @@ } }, "node_modules/@fastify/websocket": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.0.0.tgz", - "integrity": "sha512-T+QeUaIDgEYyn+RN5vbbO2EZBRJOLGyZ5Y/N8dHxNREll4bN8ArRYsuXZ/WAVFZsqjz0HBjLw1eYq7eFwBzfiw==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.2.0.tgz", + "integrity": "sha512-3HrDPbAG1CzUCqnslgJxppvzaAZffieOVbLp1DAy1huCSynUWPifSvfdEDUR8HlJLp3sp1A36uOM2tJogADS8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { "duplexify": "^4.1.3", "fastify-plugin": "^5.0.0", @@ -9161,20 +9058,22 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", - "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.8" + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", - "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/react": { @@ -9193,11 +9092,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.0.0" + "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", @@ -9205,21 +9105,22 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" }, "node_modules/@gerrit0/mini-shiki": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.20.0.tgz", - "integrity": "sha512-Wa57i+bMpK6PGJZ1f2myxo3iO+K/kZikcyvH8NIqNNZhQUbDav7V9LQmWOXhf946mz5c1NZ19WMsGYiDKTryzQ==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", + "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.20.0", - "@shikijs/langs": "^3.20.0", - "@shikijs/themes": "^3.20.0", - "@shikijs/types": "^3.20.0", + "@shikijs/engine-oniguruma": "^3.23.0", + "@shikijs/langs": "^3.23.0", + "@shikijs/themes": "^3.23.0", + "@shikijs/types": "^3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, @@ -9227,6 +9128,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==", + "license": "Apache-2.0", "engines": { "node": ">=14.0.0" } @@ -9301,12 +9203,12 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", - "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", "license": "Apache-2.0", "dependencies": { - "@grpc/proto-loader": "^0.7.13", + "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { @@ -9314,14 +9216,14 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.5", + "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { @@ -9335,65 +9237,79 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz", "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^11.0.2" } }, + "node_modules/@hapi/boom/node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "license": "BSD-3-Clause" + }, "node_modules/@hapi/bourne": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==" + "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", + "license": "BSD-3-Clause" }, "node_modules/@hapi/hoek": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.4.tgz", - "integrity": "sha512-PnsP5d4q7289pS2T2EgGz147BFJ2Jpb4yrEdkpz2IhgEUzos1S7HTl7ezWh1yfYzYlj89KzLdCRkqsP6SIryeQ==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } }, - "node_modules/@hapi/topo/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, "node_modules/@hapi/wreck": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.1.0.tgz", "integrity": "sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/bourne": "^3.0.0", "@hapi/hoek": "^11.0.2" } }, + "node_modules/@hapi/wreck/node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "license": "BSD-3-Clause" + }, "node_modules/@headlessui/react": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.8.tgz", - "integrity": "sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==", + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.9.tgz", + "integrity": "sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==", + "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.16", - "@react-aria/focus": "^3.17.1", - "@react-aria/interactions": "^3.21.3", - "@tanstack/react-virtual": "^3.8.1" + "@react-aria/focus": "^3.20.2", + "@react-aria/interactions": "^3.25.0", + "@tanstack/react-virtual": "^3.13.9", + "use-sync-external-store": "^1.5.0" }, "engines": { "node": ">=10" }, "peerDependencies": { - "react": "^18", - "react-dom": "^18" + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "node_modules/@hono/node-server": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.6.tgz", - "integrity": "sha512-Shz/KjlIeAhfiuE93NDKVdZ7HdBVLQAfdbaXEaoAVO3ic9ibRSLGIQGkcBbFyuLr+7/1D5ZCINM8B+6IvXeMtw==", + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", "dev": true, "license": "MIT", "engines": { @@ -9441,9 +9357,9 @@ "license": "MIT" }, "node_modules/@httptoolkit/util": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@httptoolkit/util/-/util-0.1.8.tgz", - "integrity": "sha512-nFjEfR7pLJW+qksF9uOmRouwDM9ZaBtD/cA0olVHHN3Ti2cQGJr4HI9PVP7+7uUZA+haO5kapfGRSoGajplJXg==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@httptoolkit/util/-/util-0.1.9.tgz", + "integrity": "sha512-MRRf7UAHcb/bXfytFDmuCo+XRH6HqxXpQpTMT8KUd95YCLDiofPOBE+2SV3M6rG4YYeEf3WxNzQiidn3qo1akQ==", "dev": true, "license": "Apache-2.0" }, @@ -9500,13 +9416,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/@httptoolkit/websocket-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, "node_modules/@httptoolkit/websocket-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -9528,9 +9437,9 @@ } }, "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", + "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9545,6 +9454,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -9558,10 +9468,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -9569,48 +9480,14 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -9619,37 +9496,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@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==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@isaacs/ttlcache": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", @@ -9679,17 +9525,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -9717,9 +9552,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "peer": true, @@ -9776,11 +9611,34 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/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", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -9876,6 +9734,55 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/transform/node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", @@ -9908,10 +9815,53 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -9929,20 +9879,22 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -9988,9 +9940,9 @@ } }, "node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -10019,6 +9971,269 @@ "tslib": "2" } }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.56.11.tgz", + "integrity": "sha512-wThHjzUp01ImIjfCwhs+UnFkeGPFAymwLEkOtenHewaKe2pTP12p6r1UuwikA9NEvNf9Vlck92r8fb8n/MWM5w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.56.11.tgz", + "integrity": "sha512-ZYlF3XbMayyp97xEN8ZvYutU99PCHjM64mMZvnCseXkCJXJDVLAwlF8Q/7q/xiWQRsv3pQBj1WXHd9eEyYcaCQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.56.11", + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.56.11.tgz", + "integrity": "sha512-D65YrnP6wRuZyEWoSFnBJSr5zARVpVBGctnhie4rCsMuGXNzX7IHKaOt85/Aj7SSoG1N2+/xlNjWmkLvZ2H3Tg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.56.11", + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "@jsonjoy.com/fs-print": "4.56.11", + "@jsonjoy.com/fs-snapshot": "4.56.11", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.56.11.tgz", + "integrity": "sha512-CNmt3a0zMCIhniFLXtzPWuUxXFU+U+2VyQiIrgt/rRVeEJNrMQUABaRbVxR0Ouw1LyR9RjaEkPM6nYpED+y43A==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.56.11.tgz", + "integrity": "sha512-5OzGdvJDgZVo+xXWEYo72u81zpOWlxlbG4d4nL+hSiW+LKlua/dldNgPrpWxtvhgyntmdFQad2UTxFyGjJAGhA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.56.11", + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.56.11.tgz", + "integrity": "sha512-JADOZFDA3wRfsuxkT0+MYc4F9hJO2PYDaY66kRTG6NqGX3+bqmKu66YFYAbII/tEmQWPZeHoClUB23rtQM9UPg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.56.11" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.56.11.tgz", + "integrity": "sha512-rnaKRgCRIn8JGTjxhS0JPE38YM3Pj/H7SW4/tglhIPbfKEkky7dpPayNKV2qy25SZSL15oFVgH/62dMZ/z7cyA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.56.11", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.56.11.tgz", + "integrity": "sha512-IIldPX+cIRQuUol9fQzSS3hqyECxVpYMJQMqdU3dCKZFRzEl1rkIkw4P6y7Oh493sI7YdxZlKr/yWdzEWZ1wGQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@jsonjoy.com/json-pack": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", @@ -10045,6 +10260,22 @@ "tslib": "2" } }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@jsonjoy.com/json-pointer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", @@ -10085,6 +10316,22 @@ "tslib": "2" } }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -10197,15 +10444,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@mdx-js/mdx/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/@mdx-js/react": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", @@ -10224,65 +10462,41 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.30.7", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.7.tgz", - "integrity": "sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.0.tgz", + "integrity": "sha512-QIVJSreb8fGGJy1Qx0yzGVXxvHJN1WXgkFNHFheVv1iBJNqgvp+xeT3ienJmRwXmPPc5Es/cxBrXtKZJR3i7iw==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.14.0" + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.18.0" } }, "node_modules/@microsoft/tsdoc": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", "dev": true, "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", - "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", + "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.15.1", - "ajv": "~8.12.0", + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.18.0", "jju": "~1.4.0", "resolve": "~1.22.2" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@microsoft/tsdoc-config/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==", - "dev": true, - "license": "MIT" - }, "node_modules/@monaco-editor/loader": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz", - "integrity": "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", + "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", "license": "MIT", "dependencies": { "state-local": "^1.0.6" @@ -10303,9 +10517,9 @@ } }, "node_modules/@mrleebo/prisma-ast": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@mrleebo/prisma-ast/-/prisma-ast-0.12.1.tgz", - "integrity": "sha512-JwqeCQ1U3fvccttHZq7Tk0m/TMC6WcFAQZdukypW3AzlJYKYTGNVd1ANU2GuhKnv4UQuOFj3oAl0LLG/gxFN1w==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mrleebo/prisma-ast/-/prisma-ast-0.13.1.tgz", + "integrity": "sha512-XyroGQXcHrZdvmrGJvsA9KNeOOgGMg1Vg9OlheUsBOSKznLMDl+YChxbkboRHvtFYJEMRYmlV3uoo/njCw05iw==", "dev": true, "license": "MIT", "dependencies": { @@ -10316,22 +10530,54 @@ "node": ">=16" } }, + "node_modules/@mrleebo/prisma-ast/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", - "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -10341,12 +10587,12 @@ } }, "node_modules/@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.7.1" + "@noble/hashes": "1.8.0" }, "engines": { "node": "^14.21.3 || >=16" @@ -10356,9 +10602,9 @@ } }, "node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -10371,6 +10617,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -10383,6 +10630,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -10391,6 +10639,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -10400,23 +10649,25 @@ } }, "node_modules/@octokit/auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", - "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", + "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", - "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz", + "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==", + "license": "MIT", "dependencies": { "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", "before-after-hook": "^3.0.2", "universal-user-agent": "^7.0.0" }, @@ -10437,28 +10688,14 @@ "node": ">= 18" } }, - "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", - "license": "MIT" - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.1.0" - } - }, "node_modules/@octokit/graphql": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", - "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "license": "MIT", "dependencies": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" }, "engines": { @@ -10466,9 +10703,10 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "license": "MIT" }, "node_modules/@octokit/request": { "version": "9.2.4", @@ -10498,28 +10736,7 @@ "node": ">= 18" } }, - "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", - "license": "MIT" - }, - "node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.1.0" - } - }, - "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", - "license": "MIT" - }, - "node_modules/@octokit/request/node_modules/@octokit/types": { + "node_modules/@octokit/types": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", @@ -10528,14 +10745,6 @@ "@octokit/openapi-types": "^25.1.0" } }, - "node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", - "dependencies": { - "@octokit/openapi-types": "^22.2.0" - } - }, "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", @@ -10583,20 +10792,20 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.62.0.tgz", - "integrity": "sha512-h5g+VNJjiyX6u/IQpn36ZCHOENg1QW0GgBOHBcFGnHBBhmTww4R3brExdeuYbvLj3UQY09n+UHFEoMOqkhq07A==", + "version": "0.62.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.62.2.tgz", + "integrity": "sha512-Ipe6X7ddrCiRsuewyTU83IvKiSFT4piqmv9z8Ovg1E7v98pdTj1pUE6sDrHV50zl7/ypd+cONBgt+EYSZu4u9Q==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", "@opentelemetry/instrumentation-amqplib": "^0.50.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.54.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.56.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.54.1", + "@opentelemetry/instrumentation-aws-sdk": "^0.58.0", "@opentelemetry/instrumentation-bunyan": "^0.49.0", "@opentelemetry/instrumentation-cassandra-driver": "^0.49.0", "@opentelemetry/instrumentation-connect": "^0.47.0", - "@opentelemetry/instrumentation-cucumber": "^0.18.0", - "@opentelemetry/instrumentation-dataloader": "^0.21.0", + "@opentelemetry/instrumentation-cucumber": "^0.19.0", + "@opentelemetry/instrumentation-dataloader": "^0.21.1", "@opentelemetry/instrumentation-dns": "^0.47.0", "@opentelemetry/instrumentation-express": "^0.52.0", "@opentelemetry/instrumentation-fastify": "^0.48.0", @@ -10607,7 +10816,7 @@ "@opentelemetry/instrumentation-hapi": "^0.50.0", "@opentelemetry/instrumentation-http": "^0.203.0", "@opentelemetry/instrumentation-ioredis": "^0.51.0", - "@opentelemetry/instrumentation-kafkajs": "^0.12.0", + "@opentelemetry/instrumentation-kafkajs": "^0.13.0", "@opentelemetry/instrumentation-knex": "^0.48.0", "@opentelemetry/instrumentation-koa": "^0.51.0", "@opentelemetry/instrumentation-lru-memoizer": "^0.48.0", @@ -10615,20 +10824,20 @@ "@opentelemetry/instrumentation-mongodb": "^0.56.0", "@opentelemetry/instrumentation-mongoose": "^0.50.0", "@opentelemetry/instrumentation-mysql": "^0.49.0", - "@opentelemetry/instrumentation-mysql2": "^0.49.0", + "@opentelemetry/instrumentation-mysql2": "^0.50.0", "@opentelemetry/instrumentation-nestjs-core": "^0.49.0", "@opentelemetry/instrumentation-net": "^0.47.0", "@opentelemetry/instrumentation-oracledb": "^0.29.0", - "@opentelemetry/instrumentation-pg": "^0.55.0", - "@opentelemetry/instrumentation-pino": "^0.50.0", - "@opentelemetry/instrumentation-redis": "^0.51.0", + "@opentelemetry/instrumentation-pg": "^0.56.1", + "@opentelemetry/instrumentation-pino": "^0.50.1", + "@opentelemetry/instrumentation-redis": "^0.52.0", "@opentelemetry/instrumentation-restify": "^0.49.0", "@opentelemetry/instrumentation-router": "^0.48.0", - "@opentelemetry/instrumentation-runtime-node": "^0.17.0", + "@opentelemetry/instrumentation-runtime-node": "^0.17.1", "@opentelemetry/instrumentation-socket.io": "^0.50.0", "@opentelemetry/instrumentation-tedious": "^0.22.0", "@opentelemetry/instrumentation-undici": "^0.14.0", - "@opentelemetry/instrumentation-winston": "^0.48.0", + "@opentelemetry/instrumentation-winston": "^0.48.1", "@opentelemetry/resource-detector-alibaba-cloud": "^0.31.3", "@opentelemetry/resource-detector-aws": "^2.3.0", "@opentelemetry/resource-detector-azure": "^0.10.0", @@ -10646,9 +10855,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.0.1.tgz", - "integrity": "sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.0.tgz", + "integrity": "sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10658,9 +10867,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", + "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10692,6 +10901,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-logs-otlp-http": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.203.0.tgz", @@ -10711,6 +10935,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-logs-otlp-proto": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.203.0.tgz", @@ -10732,29 +10971,107 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.203.0.tgz", - "integrity": "sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==", + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.203.0", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-metrics": "2.0.1" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.203.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.203.0.tgz", + "integrity": "sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "2.0.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.203.0", + "@opentelemetry/otlp-exporter-base": "0.203.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.203.0", + "@opentelemetry/otlp-transformer": "0.203.0", + "@opentelemetry/resources": "2.0.1", + "@opentelemetry/sdk-metrics": "2.0.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.203.0.tgz", "integrity": "sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==", @@ -10773,6 +11090,53 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.203.0.tgz", @@ -10793,6 +11157,53 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-prometheus": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.203.0.tgz", @@ -10810,6 +11221,53 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.203.0.tgz", @@ -10831,6 +11289,37 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.203.0.tgz", @@ -10850,6 +11339,37 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-proto": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.203.0.tgz", @@ -10869,6 +11389,37 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-zipkin": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.0.1.tgz", @@ -10887,6 +11438,37 @@ "@opentelemetry/api": "^1.0.0" } }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/instrumentation": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.203.0.tgz", @@ -10922,14 +11504,14 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.54.0.tgz", - "integrity": "sha512-uiYI+kcMUJ/H9cxAwB8c9CaG8behLRgcYSOEA8M/tMQ54Y1ZmzAuEE3QKOi21/s30x5Q+by9g7BwiVfDtqzeMA==", + "version": "0.54.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.54.1.tgz", + "integrity": "sha512-qm8pGSAM1mXk7unbrGktWWGJc6IFI58ZsaHJ+i420Fp5VO3Vf7GglIgaXTS8CKBrVB4LHFj3NvzJg31PtsAQcA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/aws-lambda": "8.10.150" + "@types/aws-lambda": "8.10.152" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10939,14 +11521,13 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.56.0.tgz", - "integrity": "sha512-Jl2B/FYEb6tBCk9G31CMomKPikGU2g+CEhrGddDI0o1YeNpg3kAO9dExF+w489/IJUGZX6/wudyNvV7z4k9NjQ==", + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.58.0.tgz", + "integrity": "sha512-9vFH7gU686dsAeLMCkqUj9y0MQZ1xrTtStSpNV2UaGWtDnRjJrAdJLu9Y545oKEaDTeVaob4UflyZvvpZnw3Xw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/propagation-utils": "^0.31.3", "@opentelemetry/semantic-conventions": "^1.34.0" }, "engines": { @@ -11008,9 +11589,9 @@ } }, "node_modules/@opentelemetry/instrumentation-cucumber": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.18.0.tgz", - "integrity": "sha512-i+cUbLHvRShuevtM0NwjQR9wnABhmYw8+dbgD57LNBde7xkuSDot0CTzX+pYn32djtQ1bPYZiLf+uwS0JsMUrw==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.19.0.tgz", + "integrity": "sha512-99ms8kQWRuPt5lkDqbJJzD+7Tq5TMUlBZki4SA2h6CgK4ncX+tyep9XFY1e+XTBLJIWmuFMGbWqBLJ4fSKIQNQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11024,9 +11605,9 @@ } }, "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.21.0.tgz", - "integrity": "sha512-Xu4CZ1bfhdkV3G6iVHFgKTgHx8GbKSqrTU01kcIJRGHpowVnyOPEv1CW5ow+9GU2X4Eki8zoNuVUenFc3RluxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.21.1.tgz", + "integrity": "sha512-hNAm/bwGawLM8VDjKR0ZUDJ/D/qKR3s6lA5NV+btNaPVm2acqhPcT47l2uCVi+70lng2mywfQncor9v8/ykuyw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0" @@ -11184,6 +11765,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/instrumentation-ioredis": { "version": "0.51.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.51.0.tgz", @@ -11202,9 +11798,9 @@ } }, "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.12.0.tgz", - "integrity": "sha512-bIe4aSAAxytp88nzBstgr6M7ZiEpW6/D1/SuKXdxxuprf18taVvFL2H5BDNGZ7A14K27haHqzYqtCTqFXHZOYg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.13.0.tgz", + "integrity": "sha512-FPQyJsREOaGH64hcxlzTsIEQC4DYANgTwHjiB7z9lldmvua1LRMVn3/FfBlzXoqF179B0VGYviz6rn75E9wsDw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11333,9 +11929,9 @@ } }, "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.49.0.tgz", - "integrity": "sha512-dCub9wc02mkJWNyHdVEZ7dvRzy295SmNJa+LrAJY2a/+tIiVBQqEAajFzKwp9zegVVnel9L+WORu34rGLQDzxA==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.50.0.tgz", + "integrity": "sha512-PoOMpmq73rOIE3nlTNLf3B1SyNYGsp7QXHYKmeTZZnJ2Ou7/fdURuOhWOI0e6QZ5gSem18IR1sJi6GOULBQJ9g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11399,16 +11995,16 @@ } }, "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.55.0.tgz", - "integrity": "sha512-yfJ5bYE7CnkW/uNsnrwouG/FR7nmg09zdk2MSs7k0ZOMkDDAE3WBGpVFFApGgNu2U+gtzLgEzOQG4I/X+60hXw==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.56.1.tgz", + "integrity": "sha512-0/PiHDPVaLdcXNw6Gqb3JBdMxComMEwh444X8glwiynJKJHRTR49+l2cqJfoOVzB8Sl1XRl3Yaqw6aDi3s8e9w==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/semantic-conventions": "^1.34.0", "@opentelemetry/sql-common": "^0.41.0", - "@types/pg": "8.15.4", + "@types/pg": "8.15.5", "@types/pg-pool": "2.0.6" }, "engines": { @@ -11418,10 +12014,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { + "version": "8.15.5", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", + "integrity": "sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "node_modules/@opentelemetry/instrumentation-pino": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.50.0.tgz", - "integrity": "sha512-Pi0cWGp4f2gresq2xqef4IsuunLdebJ9n9tZxytDz2ci4euIfW36ILpszQmRNhwCVDCZLmUgGDKZGj4PXyPd0w==", + "version": "0.50.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.50.1.tgz", + "integrity": "sha512-pBbvuWiHA9iAumAuQ0SKYOXK7NRlbnVTf/qBV0nMdRnxBPrc/GZTbh0f7Y59gZfYsbCLhXLL1oRTEnS+PwS3CA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "^0.203.0", @@ -11436,9 +12043,9 @@ } }, "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.51.0.tgz", - "integrity": "sha512-uL/GtBA0u72YPPehwOvthAe+Wf8k3T+XQPBssJmTYl6fzuZjNq8zTfxVFhl9nRFjFVEe+CtiYNT0Q3AyqW1Z0A==", + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.52.0.tgz", + "integrity": "sha512-R8Y7cCZlJ2Vl31S2i7bl5SqyC/aul54ski4wCFip/Tp9WGtLK1xVATi2rwy2wkc8ZCtjdEe9eEVR+QFG6gGZxg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11486,9 +12093,9 @@ } }, "node_modules/@opentelemetry/instrumentation-runtime-node": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.17.0.tgz", - "integrity": "sha512-O+xc0woqrSjue5IgpCCMvlgsuDrq6DDEfiHW3S3vRMCjXE1ZoPjaDE/K6EURorN+tjnzZQN1gOMSrscSGAbjHg==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.17.1.tgz", + "integrity": "sha512-c1FlAk+bB2uF9a8YneGmNPTl7c/xVaan4mmWvbkWcOmH/ipKqR1LaKUlz/BMzLrJLjho1EJlG2NrS2w2Arg+nw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0" @@ -11550,9 +12157,9 @@ } }, "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.48.0.tgz", - "integrity": "sha512-QuKbswAaQfRULhtlYbeNC9gOAXPxOSCE4BjIzuY1oEsc84kIsHUjn3yvY9Q83s3eg3j0JycNcAMi8u0yTl5PIQ==", + "version": "0.48.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.48.1.tgz", + "integrity": "sha512-XyOuVwdziirHHYlsw+BWrvdI/ymjwnexupKA787zQQ+D5upaE/tseZxjfQa7+t4+FdVLxHICaMTmkSD4yZHpzQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "^0.203.0", @@ -11581,6 +12188,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/otlp-grpc-exporter-base": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.203.0.tgz", @@ -11599,6 +12221,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/otlp-transformer": { "version": "0.203.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.203.0.tgz", @@ -11620,16 +12257,51 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/propagation-utils": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.31.3.tgz", - "integrity": "sha512-ZI6LKjyo+QYYZY5SO8vfoCQ9A69r1/g+pyjvtu5RSK38npINN1evEmwqbqhbg2CdcIK3a4PN6pDAJz/yC5/gAA==", + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "node_modules/@opentelemetry/propagator-b3": { @@ -11647,6 +12319,21 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/propagator-jaeger": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.0.1.tgz", @@ -11662,24 +12349,38 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/redis-common": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.0.tgz", - "integrity": "sha512-4Wc0AWURII2cfXVVoZ6vDqK+s5n4K5IssdrlVrvGsx6OEOKdghKtJZqXAHWFiZv4nTDLH2/2fldjIHY8clMOjQ==", + "version": "0.38.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.2.tgz", + "integrity": "sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" } }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.31.3.tgz", - "integrity": "sha512-I556LHcLVsBXEgnbPgQISP/JezDt5OfpgOaJNR1iVJl202r+K145OSSOxnH5YOc/KvrydBD0FOE03F7x0xnVTw==", + "version": "0.31.11", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.31.11.tgz", + "integrity": "sha512-R/asn6dAOWMfkLeEwqHCUz0cNbb9oiHVyd11iwlypeT/p9bR1lCX5juu5g/trOwxo62dbuFcDbBdKCJd3O2Edg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/resources": "^2.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11689,9 +12390,9 @@ } }, "node_modules/@opentelemetry/resource-detector-aws": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.3.0.tgz", - "integrity": "sha512-PkD/lyXG3B3REq1Y6imBLckljkJYXavtqGYSryAeJYvGOf5Ds3doR+BCGjmKeF6ObAtI5MtpBeUStTDtGtBsWA==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.13.0.tgz", + "integrity": "sha512-ZPCn7gZhGqUYUoD+RCHIlayoHBMaJaEjfqlgz2EPKoXJ4y7Ru7CUm+Tm3yJVMKF92cN9xUQR0j5KALyF0fg9aw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11723,14 +12424,13 @@ } }, "node_modules/@opentelemetry/resource-detector-container": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.7.3.tgz", - "integrity": "sha512-SK+xUFw6DKYbQniaGmIFsFxAZsr8RpRSRWxKi5/ZJAoqqPnjcyGI/SeUx8zzPk4XLO084zyM4pRHgir0hRTaSQ==", + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.7.11.tgz", + "integrity": "sha512-XUxnGuANa/EdxagipWMXKYFC7KURwed9/V0+NtYjFmwWHzV9/J4IYVGTK8cWDpyUvAQf/vE4sMa3rnS025ivXQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/resources": "^2.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11758,12 +12458,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.0.tgz", + "integrity": "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.1", + "@opentelemetry/core": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -11790,14 +12490,45 @@ "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-metrics": { + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1" + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.0.tgz", + "integrity": "sha512-CicxWZxX6z35HR83jl+PLgtFgUrKRQ9LCXyxgenMnz5A1lgYWfAog7VtdOvGkJYyQgMNPhXQwkYrDLujk7z1Iw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11842,14 +12573,40 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-base": { + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/context-async-hooks": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.1.tgz", - "integrity": "sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.0.1.tgz", + "integrity": "sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -11859,7 +12616,23 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-node": { + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.0.1.tgz", "integrity": "sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==", @@ -11876,19 +12649,101 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.1.tgz", + "integrity": "sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.6.0.tgz", + "integrity": "sha512-YhswtasmsbIGEFvLGvR9p/y3PVRTfFf+mgY8van4Ygpnv4sA3vooAjvh+qAn9PNWxs4/IwGGqiQS0PPsaRJ0vQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.6.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.0.tgz", + "integrity": "sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.36.0.tgz", - "integrity": "sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz", + "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==", "license": "Apache-2.0", "engines": { "node": ">=14" } }, "node_modules/@opentelemetry/sql-common": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.0.tgz", - "integrity": "sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA==", + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz", + "integrity": "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0" @@ -12140,19 +12995,28 @@ "node": "^20.19.0 || >=22.12.0" } }, + "node_modules/@oxc-project/runtime": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", + "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@oxc-project/types": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.94.0.tgz", - "integrity": "sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==", + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" } }, "node_modules/@oxlint-tsgolint/darwin-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.14.2.tgz", - "integrity": "sha512-03WxIXguCXf1pTmoG2C6vqRcbrU9GaJCW6uTIiQdIQq4BrJnVWZv99KEUQQRkuHK78lOLa9g7B4K58NcVcB54g==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.17.0.tgz", + "integrity": "sha512-z3XwCDuOAKgk7bO4y5tyH8Zogwr51G56R0XGKC3tlAbrAq8DecoxAd3qhRZqWBMG2Gzl5bWU3Ghu7lrxuLPzYw==", "cpu": [ "arm64" ], @@ -12164,9 +13028,9 @@ ] }, "node_modules/@oxlint-tsgolint/darwin-x64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.14.2.tgz", - "integrity": "sha512-ksMLl1cIWz3Jw+U79BhyCPdvohZcJ/xAKri5bpT6oeEM2GVnQCHBk/KZKlYrd7hZUTxz0sLnnKHE11XFnLASNQ==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.17.0.tgz", + "integrity": "sha512-TZgVXy0MtI8nt0MYiceuZhHPwHcwlIZ/YwzFTAKrgdHiTvVzFbqHVdXi5wbZfT/o1nHGw9fbGWPlb6qKZ4uZ9Q==", "cpu": [ "x64" ], @@ -12178,9 +13042,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.14.2.tgz", - "integrity": "sha512-2BgR535w7GLxBCyQD5DR3dBzbAgiBbG5QX1kAEVzOmWxJhhGxt5lsHdHebRo7ilukYLpBDkerz0mbMErblghCQ==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.17.0.tgz", + "integrity": "sha512-IDfhFl/Y8bjidCvAP6QAxVyBsl78TmfCHlfjtEv2XtJXgYmIwzv6muO18XMp74SZ2qAyD4y2n2dUedrmghGHeA==", "cpu": [ "arm64" ], @@ -12192,9 +13056,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-x64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.14.2.tgz", - "integrity": "sha512-TUHFyVHfbbGtnTQZbUFgwvv3NzXBgzNLKdMUJw06thpiC7u5OW5qdk4yVXIC/xeVvdl3NAqTfcT4sA32aiMubg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.17.0.tgz", + "integrity": "sha512-Bgdgqx/m8EnfjmmlRLEeYy9Yhdt1GdFrMr5mTu/NyLRGkB1C9VLAikdxB7U9QambAGTAmjMbHNFDFk8Vx69Huw==", "cpu": [ "x64" ], @@ -12206,9 +13070,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.14.2.tgz", - "integrity": "sha512-OfYHa/irfVggIFEC4TbawsI7Hwrttppv//sO/e00tu4b2QRga7+VHAwtCkSFWSr0+BsO4InRYVA0+pun5BinpQ==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.17.0.tgz", + "integrity": "sha512-dO6wyKMDqFWh1vwr+zNZS7/ovlfGgl4S3P1LDy4CKjP6V6NGtdmEwWkWax8j/I8RzGZdfXKnoUfb/qhVg5bx0w==", "cpu": [ "arm64" ], @@ -12220,9 +13084,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-x64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.14.2.tgz", - "integrity": "sha512-5gxwbWYE2pP+pzrO4SEeYvLk4N609eAe18rVXUx+en3qtHBkU8VM2jBmMcZdIHn+G05leu4pYvwAvw6tvT9VbA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.17.0.tgz", + "integrity": "sha512-lPGYFp3yX2nh6hLTpIuMnJbZnt3Df42VkoA/fSkMYi2a/LXdDytQGpgZOrb5j47TICARd34RauKm0P3OA4Oxbw==", "cpu": [ "x64" ], @@ -12234,9 +13098,9 @@ ] }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.50.0.tgz", - "integrity": "sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.56.0.tgz", + "integrity": "sha512-IyfYPthZyiSKwAv/dLjeO18SaK8MxLI9Yss2JrRDyweQAkuL3LhEy7pwIwI7uA3KQc1Vdn20kdmj3q0oUIQL6A==", "cpu": [ "arm" ], @@ -12251,9 +13115,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.50.0.tgz", - "integrity": "sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.56.0.tgz", + "integrity": "sha512-Ga5zYrzH6vc/VFxhn6MmyUnYEfy9vRpwTIks99mY3j6Nz30yYpIkWryI0QKPCgvGUtDSXVLEaMum5nA+WrNOSg==", "cpu": [ "arm64" ], @@ -12268,9 +13132,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.50.0.tgz", - "integrity": "sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.56.0.tgz", + "integrity": "sha512-ogmbdJysnw/D4bDcpf1sPLpFThZ48lYp4aKYm10Z/6Nh1SON6NtnNhTNOlhEY296tDFItsZUz+2tgcSYqh8Eyw==", "cpu": [ "arm64" ], @@ -12285,9 +13149,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.50.0.tgz", - "integrity": "sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.56.0.tgz", + "integrity": "sha512-x8QE1h+RAtQ2g+3KPsP6Fk/tdz6zJQUv5c7fTrJxXV3GHOo+Ry5p/PsogU4U+iUZg0rj6hS+E4xi+mnwwlDCWQ==", "cpu": [ "x64" ], @@ -12302,9 +13166,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.50.0.tgz", - "integrity": "sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.56.0.tgz", + "integrity": "sha512-6G+WMZvwJpMvY7my+/SHEjb7BTk/PFbePqLpmVmUJRIsJMy/UlyYqjpuh0RCgYYkPLcnXm1rUM04kbTk8yS1Yg==", "cpu": [ "x64" ], @@ -12319,9 +13183,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.50.0.tgz", - "integrity": "sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.56.0.tgz", + "integrity": "sha512-YYHBsk/sl7fYwQOok+6W5lBPeUEvisznV/HZD2IfZmF3Bns6cPC3Z0vCtSEOaAWTjYWN3jVsdu55jMxKlsdlhg==", "cpu": [ "arm" ], @@ -12336,9 +13200,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.50.0.tgz", - "integrity": "sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.56.0.tgz", + "integrity": "sha512-+AZK8rOUr78y8WT6XkDb04IbMRqauNV+vgT6f8ZLOH8wnpQ9i7Nol0XLxAu+Cq7Sb+J9wC0j6Km5hG8rj47/yQ==", "cpu": [ "arm" ], @@ -12353,9 +13217,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.50.0.tgz", - "integrity": "sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.56.0.tgz", + "integrity": "sha512-urse2SnugwJRojUkGSSeH2LPMaje5Q50yQtvtL9HFckiyeqXzoFwOAZqD5TR29R2lq7UHidfFDM9EGcchcbb8A==", "cpu": [ "arm64" ], @@ -12370,9 +13234,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.50.0.tgz", - "integrity": "sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.56.0.tgz", + "integrity": "sha512-rkTZkBfJ4TYLjansjSzL6mgZOdN5IvUnSq3oNJSLwBcNvy3dlgQtpHPrRxrCEbbcp7oQ6If0tkNaqfOsphYZ9g==", "cpu": [ "arm64" ], @@ -12387,9 +13251,9 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.50.0.tgz", - "integrity": "sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.56.0.tgz", + "integrity": "sha512-uqL1kMH3u69/e1CH2EJhP3CP28jw2ExLsku4o8RVAZ7fySo9zOyI2fy9pVlTAp4voBLVgzndXi3SgtdyCTa2aA==", "cpu": [ "ppc64" ], @@ -12404,9 +13268,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.50.0.tgz", - "integrity": "sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.56.0.tgz", + "integrity": "sha512-j0CcMBOgV6KsRaBdsebIeiy7hCjEvq2KdEsiULf2LZqAq0v1M1lWjelhCV57LxsqaIGChXFuFJ0RiFrSRHPhSg==", "cpu": [ "riscv64" ], @@ -12421,9 +13285,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.50.0.tgz", - "integrity": "sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.56.0.tgz", + "integrity": "sha512-7VDOiL8cDG3DQ/CY3yKjbV1c4YPvc4vH8qW09Vv+5ukq3l/Kcyr6XGCd5NvxUmxqDb2vjMpM+eW/4JrEEsUetA==", "cpu": [ "riscv64" ], @@ -12438,9 +13302,9 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.50.0.tgz", - "integrity": "sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.56.0.tgz", + "integrity": "sha512-JGRpX0M+ikD3WpwJ7vKcHKV6Kg0dT52BW2Eu2BupXotYeqGXBrbY+QPkAyKO6MNgKozyTNaRh3r7g+VWgyAQYQ==", "cpu": [ "s390x" ], @@ -12455,9 +13319,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.50.0.tgz", - "integrity": "sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.56.0.tgz", + "integrity": "sha512-dNaICPvtmuxFP/VbqdofrLqdS3bM/AKJN3LMJD52si44ea7Be1cBk6NpfIahaysG9Uo+L98QKddU9CD5L8UHnQ==", "cpu": [ "x64" ], @@ -12472,9 +13336,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.50.0.tgz", - "integrity": "sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.56.0.tgz", + "integrity": "sha512-pF1vOtM+GuXmbklM1hV8WMsn6tCNPvkUzklj/Ej98JhlanbmA2RB1BILgOpwSuCTRTIYx2MXssmEyQQ90QF5aA==", "cpu": [ "x64" ], @@ -12489,9 +13353,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.50.0.tgz", - "integrity": "sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.56.0.tgz", + "integrity": "sha512-bp8NQ4RE6fDIFLa4bdBiOA+TAvkNkg+rslR+AvvjlLTYXLy9/uKAYLQudaQouWihLD/hgkrXIKKzXi5IXOewwg==", "cpu": [ "arm64" ], @@ -12506,9 +13370,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.50.0.tgz", - "integrity": "sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.56.0.tgz", + "integrity": "sha512-PxT4OJDfMOQBzo3OlzFb9gkoSD+n8qSBxyVq2wQSZIHFQYGEqIRTo9M0ZStvZm5fdhMqaVYpOnJvH2hUMEDk/g==", "cpu": [ "arm64" ], @@ -12523,9 +13387,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.50.0.tgz", - "integrity": "sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.56.0.tgz", + "integrity": "sha512-PTRy6sIEPqy2x8PTP1baBNReN/BNEFmde0L+mYeHmjXE1Vlcc9+I5nsqENsB2yAm5wLkzPoTNCMY/7AnabT4/A==", "cpu": [ "ia32" ], @@ -12540,9 +13404,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.50.0.tgz", - "integrity": "sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.56.0.tgz", + "integrity": "sha512-ZHa0clocjLmIDr+1LwoWtxRcoYniAvERotvwKUYKhH41NVfl0Y4LNbyQkwMZzwDvKklKGvGZ5+DAG58/Ik47tQ==", "cpu": [ "x64" ], @@ -12557,99 +13421,92 @@ } }, "node_modules/@peculiar/asn1-cms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", - "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", + "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-csr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", - "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", + "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", - "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", + "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", - "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", + "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", "license": "MIT", "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-rsa": "^2.6.1", "@peculiar/asn1-schema": "^2.6.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", - "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", + "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", - "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", + "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", "license": "MIT", "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pfx": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pfx": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", - "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", + "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } @@ -12658,7 +13515,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "dev": true, "license": "MIT", "dependencies": { "asn1js": "^3.0.6", @@ -12667,10 +13523,9 @@ } }, "node_modules/@peculiar/asn1-x509": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", - "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", + "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -12680,23 +13535,21 @@ } }, "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", - "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", + "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/x509": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.2.tgz", - "integrity": "sha512-r2w1Hg6pODDs0zfAKHkSS5HLkOLSeburtcgwvlLLWWCixw+MmW3U6kD5ddyvc2Y2YdbGuVwCF2S2ASoU1cFAag==", - "dev": true, + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -12712,14 +13565,21 @@ "tsyringe": "^4.10.0" }, "engines": { - "node": ">=22.0.0" + "node": ">=20.0.0" } }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -12746,10 +13606,16 @@ "node": ">=12.22.0" } }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", @@ -12761,48 +13627,116 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "license": "MIT" }, "node_modules/@postgresql-typed/oids": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@postgresql-typed/oids/-/oids-0.2.0.tgz", "integrity": "sha512-jh1nIP/nmtlZkj1t0cO2NC2lFHg/fXQhtRFsL70Rh/5ELp5fqxH/calwPVTkS8gPae1k/PTqQYbU23E+Q2q0rg==", + "license": "MPL-2.0", "engines": { "node": ">=16", "pnpm": ">=8.6.0" } }, "node_modules/@prisma/adapter-pg": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.2.0.tgz", - "integrity": "sha512-euIdQ13cRB2wZ3jPsnDnFhINquo1PYFPCg6yVL8b2rp3EdinQHsX9EDdCtRr489D5uhphcRk463OdQAFlsCr0w==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.5.0.tgz", + "integrity": "sha512-EJx7OLULahcC3IjJgdx2qRDNCT+ToY2v66UkeETMCLhNOTgqVzRzYvOEphY7Zp0eHyzfkC33Edd/qqeadf9R4A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/driver-adapter-utils": "7.2.0", + "@prisma/driver-adapter-utils": "7.5.0", + "@types/pg": "8.11.11", "pg": "^8.16.3", "postgres-array": "3.0.4" } }, + "node_modules/@prisma/adapter-pg/node_modules/@types/pg": { + "version": "8.11.11", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.11.tgz", + "integrity": "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@prisma/adapter-pg/node_modules/pg-types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.1.0.tgz", + "integrity": "sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.1.0", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@prisma/adapter-pg/node_modules/postgres-array": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/@prisma/adapter-pg/node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@prisma/adapter-pg/node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/@prisma/adapter-pg/node_modules/postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/@prisma/client": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", - "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.5.0.tgz", + "integrity": "sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@prisma/client-runtime-utils": "7.2.0" + "@prisma/client-runtime-utils": "7.5.0" }, "engines": { "node": "^20.19 || ^22.12 || >=24.0" @@ -12821,16 +13755,16 @@ } }, "node_modules/@prisma/client-runtime-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.2.0.tgz", - "integrity": "sha512-dn7oB53v0tqkB0wBdMuTNFNPdEbfICEUe82Tn9FoKAhJCUkDH+fmyEp0ClciGh+9Hp2Tuu2K52kth2MTLstvmA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.5.0.tgz", + "integrity": "sha512-KnJ2b4Si/pcWEtK68uM+h0h1oh80CZt2suhLTVuLaSKg4n58Q9jBF/A42Kw6Ma+aThy1yAhfDeTC0JvEmeZnFQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/config": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.2.0.tgz", - "integrity": "sha512-qmvSnfQ6l/srBW1S7RZGfjTQhc44Yl3ldvU6y3pgmuLM+83SBDs6UQVgMtQuMRe9J3gGqB0RF8wER6RlXEr6jQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.5.0.tgz", + "integrity": "sha512-1J/9YEX7A889xM46PYg9e8VAuSL1IUmXJW3tEhMv7XQHDWlfC9YSkIw9sTYRaq5GswGlxZ+GnnyiNsUZ9JJhSQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12869,22 +13803,6 @@ } } }, - "node_modules/@prisma/config/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@prisma/config/node_modules/dotenv": { "version": "16.6.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", @@ -12908,152 +13826,157 @@ "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/@prisma/config/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/@prisma/config/node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "optional": true, + "peer": true, + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.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==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.5.0.tgz", + "integrity": "sha512-163+nffny0JoPEkDhfNco0vcuT3ymIJc9+WX7MHSQhfkeKUmKe9/wqvGk5SjppT93DtBjVwr5HPJYlXbzm6qtg==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/dev": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.17.0.tgz", - "integrity": "sha512-6sGebe5jxX+FEsQTpjHLzvOGPn6ypFQprcs3jcuIWv1Xp/5v6P/rjfdvAwTkP2iF6pDx2tCd8vGLNWcsWzImTA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.20.0.tgz", + "integrity": "sha512-ovlBYwWor0OzG+yH4J3Ot+AneD818BttLA+Ii7wjbcLHUrnC4tbUPVGyNd3c/+71KETPKZfjhkTSpdS15dmXNQ==", "dev": true, "license": "ISC", "dependencies": { - "@electric-sql/pglite": "0.3.2", - "@electric-sql/pglite-socket": "0.0.6", - "@electric-sql/pglite-tools": "0.2.7", - "@hono/node-server": "1.19.6", - "@mrleebo/prisma-ast": "0.12.1", - "@prisma/get-platform": "6.8.2", - "@prisma/query-plan-executor": "6.18.0", + "@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.1.2", - "hono": "4.10.6", + "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.21.3", - "std-env": "3.9.0", + "remeda": "2.33.4", + "std-env": "3.10.0", "valibot": "1.2.0", - "zeptomatch": "2.0.2" + "zeptomatch": "2.1.0" } }, "node_modules/@prisma/dev/node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, "node_modules/@prisma/driver-adapter-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.2.0.tgz", - "integrity": "sha512-gzrUcbI9VmHS24Uf+0+7DNzdIw7keglJsD5m/MHxQOU68OhGVzlphQRobLiDMn8CHNA2XN8uugwKjudVtnfMVQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.5.0.tgz", + "integrity": "sha512-B79N/amgV677mFesFDBAdrW0OIaqawap9E0sjgLBtzIz2R3hIMS1QB8mLZuUEiS4q5Y8Oh3I25Kw4SLxMypk9Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.2.0" + "@prisma/debug": "7.5.0" } }, "node_modules/@prisma/engines": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.2.0.tgz", - "integrity": "sha512-HUeOI/SvCDsHrR9QZn24cxxZcujOjcS3w1oW/XVhnSATAli5SRMOfp/WkG3TtT5rCxDA4xOnlJkW7xkho4nURA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.5.0.tgz", + "integrity": "sha512-ondGRhzoaVpRWvFaQ5wH5zS1BIbhzbKqczKjCn6j3L0Zfe/LInjcEg8+xtB49AuZBX30qyx1ZtGoootUohz2pw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.2.0", - "@prisma/engines-version": "7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", - "@prisma/fetch-engine": "7.2.0", - "@prisma/get-platform": "7.2.0" + "@prisma/debug": "7.5.0", + "@prisma/engines-version": "7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e", + "@prisma/fetch-engine": "7.5.0", + "@prisma/get-platform": "7.5.0" } }, "node_modules/@prisma/engines-version": { - "version": "7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3.tgz", - "integrity": "sha512-KezsjCZDsbjNR7SzIiVlUsn9PnLePI7r5uxABlwL+xoerurZTfgQVbIjvjF2sVr3Uc0ZcsnREw3F84HvbggGdA==", + "version": "7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e.tgz", + "integrity": "sha512-E+iRV/vbJLl8iGjVr6g/TEWokA+gjkV/doZkaQN1i/ULVdDwGnPJDfLUIFGS3BVwlG/m6L8T4x1x5isl8hGMxA==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines/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==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.5.0.tgz", + "integrity": "sha512-7I+2y1nu/gkEKSiHHbcZ1HPe/euGdEqJZxEEMT0246q4De1+hla0ZzlTgvaT9dHcVCgLSuCG8v39db5qUUWNgw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.2.0" + "@prisma/debug": "7.5.0" } }, "node_modules/@prisma/fetch-engine": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.2.0.tgz", - "integrity": "sha512-Z5XZztJ8Ap+wovpjPD2lQKnB8nWFGNouCrglaNFjxIWAGWz0oeHXwUJRiclIoSSXN/ptcs9/behptSk8d0Yy6w==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.5.0.tgz", + "integrity": "sha512-kZCl2FV54qnyrVdnII8MI6qvt7HfU6Cbiz8dZ8PXz4f4lbSw45jEB9/gEMK2SGdiNhBKyk/Wv95uthoLhGMLYA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.2.0", - "@prisma/engines-version": "7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", - "@prisma/get-platform": "7.2.0" + "@prisma/debug": "7.5.0", + "@prisma/engines-version": "7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e", + "@prisma/get-platform": "7.5.0" } }, "node_modules/@prisma/fetch-engine/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==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.5.0.tgz", + "integrity": "sha512-7I+2y1nu/gkEKSiHHbcZ1HPe/euGdEqJZxEEMT0246q4De1+hla0ZzlTgvaT9dHcVCgLSuCG8v39db5qUUWNgw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.2.0" + "@prisma/debug": "7.5.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.8.2.tgz", - "integrity": "sha512-vXSxyUgX3vm1Q70QwzwkjeYfRryIvKno1SXbIqwSptKwqKzskINnDUcx85oX+ys6ooN2ATGSD0xN2UTfg6Zcow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz", + "integrity": "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.8.2" + "@prisma/debug": "7.2.0" } }, "node_modules/@prisma/get-platform/node_modules/@prisma/debug": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.8.2.tgz", - "integrity": "sha512-4muBSSUwJJ9BYth5N8tqts8JtiLT8QI/RSAzEogwEfpbYGFo9mYsInsVo8dqXdPO2+Rm5OG5q0qWDDE3nyUbVg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.2.0.tgz", + "integrity": "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/query-plan-executor": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@prisma/query-plan-executor/-/query-plan-executor-6.18.0.tgz", - "integrity": "sha512-jZ8cfzFgL0jReE1R10gT8JLHtQxjWYLiQ//wHmVYZ2rVkFHoh0DT8IXsxcKcFlfKN7ak7k6j0XMNn2xVNyr5cA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz", + "integrity": "sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/studio-core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.9.0.tgz", - "integrity": "sha512-xA2zoR/ADu/NCSQuriBKTh6Ps4XjU0bErkEcgMfnSGh346K1VI7iWKnoq1l2DoxUqiddPHIEWwtxJ6xCHG6W7g==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.21.1.tgz", + "integrity": "sha512-bOGqG/eMQtKC0XVvcVLRmhWWzm/I+0QUWqAEhEBtetpuS3k3V4IWqKGUONkAIT223DNXJMxMtZp36b1FmcdPeg==", "dev": true, "license": "Apache-2.0", + "engines": { + "node": "^20.19 || ^22.12 || ^24.0", + "pnpm": "8" + }, "peerDependencies": { "@types/react": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", @@ -13125,38 +14048,44 @@ "license": "BSD-3-Clause" }, "node_modules/@react-aria/focus": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.18.3.tgz", - "integrity": "sha512-WKUElg+5zS0D3xlVn8MntNnkzJql2J6MuzAMP8Sv5WTgFDse/XGR842dsxPTIyKKdrWVCRegCuwa4m3n/GzgJw==", + "version": "3.21.5", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.5.tgz", + "integrity": "sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q==", + "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.22.3", - "@react-aria/utils": "^3.25.3", - "@react-types/shared": "^3.25.0", + "@react-aria/interactions": "^3.27.1", + "@react-aria/utils": "^3.33.1", + "@react-types/shared": "^3.33.1", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-aria/interactions": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.3.tgz", - "integrity": "sha512-RRUb/aG+P0IKTIWikY/SylB6bIbLZeztnZY2vbe7RAG5MgVaCgn5HQ45SI15GlTmhsFG8CnF6slJsUFJiNHpbQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.27.1.tgz", + "integrity": "sha512-M3wLpTTmDflI0QGNK0PJNUaBXXfeBXue8ZxLMngfc1piHNiH4G5lUvWd9W14XVbqrSCVY8i8DfGrNYpyyZu0tw==", + "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.6", - "@react-aria/utils": "^3.25.3", - "@react-types/shared": "^3.25.0", + "@react-aria/ssr": "^3.9.10", + "@react-aria/utils": "^3.33.1", + "@react-stately/flags": "^3.1.2", + "@react-types/shared": "^3.33.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-aria/ssr": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.6.tgz", - "integrity": "sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", + "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" }, @@ -13164,28 +14093,31 @@ "node": ">= 12" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-aria/utils": { - "version": "3.25.3", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.25.3.tgz", - "integrity": "sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.33.1.tgz", + "integrity": "sha512-kIx1Sj6bbAT0pdqCegHuPanR9zrLn5zMRiM7LN12rgRf55S19ptd9g3ncahArifYTRkfEU9VIn+q0HjfMqS9/w==", + "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.6", - "@react-stately/utils": "^3.10.4", - "@react-types/shared": "^3.25.0", + "@react-aria/ssr": "^3.9.10", + "@react-stately/flags": "^3.1.2", + "@react-stately/utils": "^3.11.0", + "@react-types/shared": "^3.33.1", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-native/assets-registry": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", - "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.84.1.tgz", + "integrity": "sha512-lAJ6PDZv95FdT9s9uhc9ivhikW1Zwh4j9XdXM7J2l4oUA3t37qfoBmTSDLuPyE3Bi+Xtwa11hJm0BUTT2sc/gg==", "dev": true, "license": "MIT", "peer": true, @@ -13194,24 +14126,24 @@ } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", - "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", + "version": "0.83.2", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.83.2.tgz", + "integrity": "sha512-XbcN/BEa64pVlb0Hb/E/Ph2SepjVN/FcNKrJcQvtaKZA6mBSO8pW8Eircdlr61/KBH94LihHbQoQDzkQFpeaTg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.81.4" + "@react-native/codegen": "0.83.2" }, "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/babel-preset": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", - "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", + "version": "0.83.2", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.83.2.tgz", + "integrity": "sha512-X/RAXDfe6W+om/Fw1i6htTxQXFhBJ2jgNOWx3WpI3KbjeIWbq7ib6vrpTeIAW2NUMg+K3mML1NzgD4dpZeqdjA==", "dev": true, "license": "MIT", "peer": true, @@ -13257,8 +14189,8 @@ "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.81.4", - "babel-plugin-syntax-hermes-parser": "0.29.1", + "@react-native/babel-plugin-codegen": "0.83.2", + "babel-plugin-syntax-hermes-parser": "0.32.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, @@ -13269,10 +14201,21 @@ "@babel/core": "*" } }, + "node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hermes-parser": "0.32.0" + } + }, "node_modules/@react-native/codegen": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", - "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", + "version": "0.83.2", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.2.tgz", + "integrity": "sha512-9uK6X1miCXqtL4c759l74N/XbQeneWeQVjoV7SD2CGJuW7ZefxaoYenwGPs7rMoCdtS6wuIyR3hXQ+uWEBGYXA==", "dev": true, "license": "MIT", "peer": true, @@ -13280,7 +14223,7 @@ "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", "glob": "^7.1.1", - "hermes-parser": "0.29.1", + "hermes-parser": "0.32.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" @@ -13292,11 +14235,31 @@ "@babel/core": "*" } }, + "node_modules/@react-native/codegen/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", + "peer": true + }, + "node_modules/@react-native/codegen/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@react-native/codegen/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "peer": true, @@ -13315,20 +14278,34 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@react-native/codegen/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", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", - "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.84.1.tgz", + "integrity": "sha512-f6a+mJEJ6Joxlt/050TqYUr7uRRbeKnz8lnpL7JajhpsgZLEbkJRjH8HY5QiLcRdUwWFtizml4V+vcO3P4RxoQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@react-native/dev-middleware": "0.82.0", + "@react-native/dev-middleware": "0.84.1", "debug": "^4.4.0", "invariant": "^2.2.4", - "metro": "^0.83.1", - "metro-config": "^0.83.1", - "metro-core": "^0.83.1", + "metro": "^0.83.3", + "metro-config": "^0.83.3", + "metro-core": "^0.83.3", "semver": "^7.1.3" }, "engines": { @@ -13348,9 +14325,9 @@ } }, "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", - "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.84.1.tgz", + "integrity": "sha512-rUU/Pyh3R5zT0WkVgB+yA6VwOp7HM5Hz4NYE97ajFS07OUIcv8JzBL3MXVdSSjLfldfqOuPEuKUaZcAOwPgabw==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -13358,17 +14335,33 @@ "node": ">= 20.19.4" } }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-shell": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.84.1.tgz", + "integrity": "sha512-LIGhh4q4ette3yW5OzmukNMYwmINYrRGDZqKyTYc/VZyNpblZPw72coXVHXdfpPT6+YlxHqXzn3UjFZpNODGCQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "fb-dotslash": "0.5.8" + }, + "engines": { + "node": ">= 20.19.4" + } + }, "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", - "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.84.1.tgz", + "integrity": "sha512-Z83ra+Gk6ElAhH3XRrv3vwbwCPTb04sPPlNpotxcFZb5LtRQZwT91ZQEXw3GOJCVIFp9EQ/gj8AQbVvtHKOUlQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.82.0", - "@react-native/debugger-shell": "0.82.0", + "@react-native/debugger-frontend": "0.84.1", + "@react-native/debugger-shell": "0.84.1", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -13377,7 +14370,7 @@ "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", - "ws": "^6.2.3" + "ws": "^7.5.10" }, "engines": { "node": ">= 20.19.4" @@ -13402,20 +14395,32 @@ } }, "node_modules/@react-native/community-cli-plugin/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/@react-native/debugger-frontend": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", - "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", + "version": "0.83.2", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.2.tgz", + "integrity": "sha512-t4fYfa7xopbUF5S4+ihNEwgaq4wLZLKLY0Ms8z72lkMteVd3bOX2Foxa8E2wTfRvdhPOkSpOsTeNDmD8ON4DoQ==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -13424,9 +14429,9 @@ } }, "node_modules/@react-native/debugger-shell": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", - "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", + "version": "0.83.2", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.2.tgz", + "integrity": "sha512-z9go6NJMsLSDJT5MW6VGugRsZHjYvUTwxtsVc3uLt4U9W6T3J6FWI2wHpXIzd2dUkXRfAiRQ3Zi8ZQQ8fRFg9A==", "dev": true, "license": "MIT", "peer": true, @@ -13439,15 +14444,16 @@ } }, "node_modules/@react-native/dev-middleware": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", - "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", + "version": "0.83.2", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.2.tgz", + "integrity": "sha512-Zi4EVaAm28+icD19NN07Gh8Pqg/84QQu+jn4patfWKNkcToRFP5vPEbbp0eLOGWS+BVB1d1Fn5lvMrJsBbFcOg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.81.4", + "@react-native/debugger-frontend": "0.83.2", + "@react-native/debugger-shell": "0.83.2", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -13456,7 +14462,7 @@ "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", - "ws": "^6.2.3" + "ws": "^7.5.10" }, "engines": { "node": ">= 20.19.4" @@ -13481,20 +14487,32 @@ } }, "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", - "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.84.1.tgz", + "integrity": "sha512-7uVlPBE3uluRNRX4MW7PUJIO1LDBTpAqStKHU7LHH+GRrdZbHsWtOEAX8PiY4GFfBEvG8hEjiuTOqAxMjV+hDg==", "dev": true, "license": "MIT", "peer": true, @@ -13503,9 +14521,9 @@ } }, "node_modules/@react-native/js-polyfills": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", - "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.84.1.tgz", + "integrity": "sha512-UsTe2AbUugsfyI7XIHMQq4E7xeC8a6GrYwuK+NohMMMJMxmyM3JkzIk+GB9e2il6ScEQNMJNaj+q+i5za8itxQ==", "dev": true, "license": "MIT", "peer": true, @@ -13514,30 +14532,41 @@ } }, "node_modules/@react-native/normalize-colors": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", - "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", + "version": "0.83.2", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.2.tgz", + "integrity": "sha512-gkZAb9LoVVzNuYzzOviH7DiPTXQoZPHuiTH2+O2+VWNtOkiznjgvqpwYAhg58a5zfRq5GXlbBdf5mzRj5+3Y5Q==", "dev": true, "license": "MIT", "peer": true }, + "node_modules/@react-stately/flags": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz", + "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, "node_modules/@react-stately/utils": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.4.tgz", - "integrity": "sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", + "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-types/shared": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.25.0.tgz", - "integrity": "sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.33.1.tgz", + "integrity": "sha512-oJHtjvLG43VjwemQDadlR5g/8VepK56B/xKO2XORPHt9zlW6IZs3tZrYlvH29BMvoqC7RtE7E5UjgbnbFtDGag==", + "license": "Apache-2.0", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@rocicorp/lock": { @@ -13562,6 +14591,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@rocicorp/resolver/-/resolver-1.0.2.tgz", "integrity": "sha512-TfjMTQp9cNNqNtHFfa+XHEGdA7NnmDRu+ZJH4YF3dso0Xk/b9DMhg/sl+b6CR4ThFZArXXDsG1j8Mwl34wcOZQ==", + "license": "Apache-2.0", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -13592,10 +14622,263 @@ "node": "20.x || 22.x || 23.x || 24.x" } }, + "node_modules/@rocicorp/zero-virtual": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@rocicorp/zero-virtual/-/zero-virtual-0.1.4.tgz", + "integrity": "sha512-RrGhLyOostGP7IMj1sfiZ9S1MwycHmv4YPm26RMBSCAlcku23thFNeE7t0q3zwEK9ykdQ1LbZ0rZAveg4dFpiw==", + "license": "Apache-2.0", + "peerDependencies": { + "@rocicorp/zero": ">=0.25", + "@tanstack/react-virtual": "^3.13.0", + "@tanstack/virtual-core": "^3.13.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", + "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.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", + "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.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", + "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.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", + "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.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "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.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "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.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", + "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.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", + "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.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", - "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", "dev": true, "license": "MIT" }, @@ -13622,283 +14905,392 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/@rollup/pluginutils/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==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", - "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", - "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", - "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", - "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", - "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", - "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", - "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", - "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", - "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", - "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", - "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", - "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", - "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", - "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", - "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", - "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", - "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", - "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", - "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", - "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rushstack/node-core-library": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.14.0.tgz", - "integrity": "sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.18.0.tgz", + "integrity": "sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==", "dev": true, "license": "MIT", "dependencies": { @@ -13937,28 +15329,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@rushstack/node-core-library/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==", - "dev": true, - "license": "MIT" - }, "node_modules/@rushstack/node-core-library/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -13975,10 +15358,32 @@ "node": ">=10" } }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", + "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@rushstack/rig-package": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", - "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", + "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", "dev": true, "license": "MIT", "dependencies": { @@ -13987,13 +15392,14 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.16.0.tgz", - "integrity": "sha512-WEvNuKkoR1PXorr9SxO0dqFdSp1BA+xzDrIm/Bwlc5YHg2FFg6oS+uCTYjerOhFuqCW+A3vKBm6EmKWSHfgx/A==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.3.tgz", + "integrity": "sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.14.0", + "@rushstack/node-core-library": "5.18.0", + "@rushstack/problem-matcher": "0.1.1", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -14005,45 +15411,19 @@ } } }, - "node_modules/@rushstack/terminal/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/@rushstack/ts-command-line": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.0.3.tgz", - "integrity": "sha512-bgPhQEqLVv/2hwKLYv/XvsTWNZ9B/+X1zJ7WgQE9rO5oiLzrOZvkIW4pk13yOQBhHyjcND5qMOa6p83t+Z66iQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.3.tgz", + "integrity": "sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.16.0", + "@rushstack/terminal": "0.19.3", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" } }, - "node_modules/@rushstack/ts-command-line/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@schickling/fps-meter": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@schickling/fps-meter/-/fps-meter-0.1.2.tgz", @@ -14053,40 +15433,40 @@ } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.20.0.tgz", - "integrity": "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.20.0", + "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.20.0.tgz", - "integrity": "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.20.0" + "@shikijs/types": "3.23.0" } }, "node_modules/@shikijs/themes": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.20.0.tgz", - "integrity": "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.20.0" + "@shikijs/types": "3.23.0" } }, "node_modules/@shikijs/types": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.20.0.tgz", - "integrity": "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14105,29 +15485,27 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } }, - "node_modules/@sideway/address/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, "node_modules/@sideway/formula": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "license": "MIT" }, "node_modules/@sindresorhus/is": { @@ -14175,85 +15553,13 @@ "micromark-util-symbol": "^1.0.1" } }, - "node_modules/@slorber/remark-comment/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", + "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14261,9 +15567,9 @@ } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", - "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", + "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14273,12 +15579,12 @@ } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", - "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", + "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-base64": "^4.0.0", + "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -14286,15 +15592,16 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", + "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", "tslib": "^2.6.2" }, "engines": { @@ -14302,19 +15609,20 @@ } }, "node_modules/@smithy/core": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.0.tgz", - "integrity": "sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", + "version": "3.23.12", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.12.tgz", + "integrity": "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.20", + "@smithy/util-utf8": "^4.2.2", + "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" }, "engines": { @@ -14322,15 +15630,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", + "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", "tslib": "^2.6.2" }, "engines": { @@ -14338,14 +15646,14 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.4.tgz", - "integrity": "sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz", + "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/types": "^4.13.1", + "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14353,13 +15661,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.4.tgz", - "integrity": "sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz", + "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-serde-universal": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14367,12 +15675,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.2.tgz", - "integrity": "sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz", + "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14380,13 +15688,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.4.tgz", - "integrity": "sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz", + "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-serde-universal": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14394,13 +15702,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.4.tgz", - "integrity": "sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz", + "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-codec": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14408,15 +15716,15 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", - "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "version": "5.3.15", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", + "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -14424,14 +15732,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", - "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.13.tgz", + "integrity": "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==", "license": "Apache-2.0", "dependencies": { - "@smithy/chunked-blob-reader": "^5.0.0", - "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.3.1", + "@smithy/chunked-blob-reader": "^5.2.2", + "@smithy/chunked-blob-reader-native": "^4.2.3", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14439,14 +15747,14 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", + "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.13.1", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14454,13 +15762,13 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", - "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.12.tgz", + "integrity": "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.13.1", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14468,12 +15776,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", + "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14481,9 +15789,9 @@ } }, "node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", + "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14493,13 +15801,13 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", - "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.12.tgz", + "integrity": "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.13.1", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14507,13 +15815,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", + "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14521,18 +15829,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.14.tgz", - "integrity": "sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.7.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "version": "4.4.26", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.26.tgz", + "integrity": "sha512-8Qfikvd2GVKSm8S6IbjfwFlRY9VlMrj0Dp4vTwAuhqbX7NhJKE5DQc2bnfJIcY0B+2YKMDBWfvexbSZeejDgeg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.12", + "@smithy/middleware-serde": "^4.2.15", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-middleware": "^4.2.12", "tslib": "^2.6.2" }, "engines": { @@ -14540,46 +15848,34 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.15.tgz", - "integrity": "sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "version": "4.4.43", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.43.tgz", + "integrity": "sha512-ZwsifBdyuNHrFGmbc7bAfP2b54+kt9J2rhFd18ilQGAB+GDiP4SrawqyExbB7v455QVR7Psyhb2kjULvBPIhvA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/service-error-classification": "^4.2.12", + "@smithy/smithy-client": "^4.12.6", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.2.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.15.tgz", + "integrity": "sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/core": "^3.23.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14587,12 +15883,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", + "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14600,14 +15896,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", + "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14615,15 +15911,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", - "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.0.tgz", + "integrity": "sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14631,12 +15927,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", + "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14644,12 +15940,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", + "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14657,13 +15953,13 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", + "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/types": "^4.13.1", + "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14671,12 +15967,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", + "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14684,24 +15980,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", + "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1" + "@smithy/types": "^4.13.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", + "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14709,18 +16005,18 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", + "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-uri-escape": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14728,17 +16024,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.6.tgz", - "integrity": "sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ==", + "version": "4.12.6", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.6.tgz", + "integrity": "sha512-aib3f0jiMsJ6+cvDnXipBsGDL7ztknYSVqJs1FdN9P+u9tr/VzOR7iygSh6EUOdaBeMCMSh3N0VdyYsG4o91DQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.7.0", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@smithy/core": "^3.23.12", + "@smithy/middleware-endpoint": "^4.4.26", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.20", "tslib": "^2.6.2" }, "engines": { @@ -14746,9 +16042,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", + "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14758,13 +16054,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", + "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14772,13 +16068,13 @@ } }, "node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14786,9 +16082,9 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14798,9 +16094,9 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14810,12 +16106,12 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", + "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/is-array-buffer": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14823,9 +16119,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14835,15 +16131,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.22.tgz", - "integrity": "sha512-hjElSW18Wq3fUAWVk6nbk7pGrV7ZT14DL1IUobmqhV3lxcsIenr5FUsDe2jlTVaS8OYBI3x+Og9URv5YcKb5QA==", + "version": "4.3.42", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.42.tgz", + "integrity": "sha512-0vjwmcvkWAUtikXnWIUOyV6IFHTEeQUYh3JUZcDgcszF+hD/StAsQ3rCZNZEPHgI9kVNcbnyc8P2CBHnwgmcwg==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14851,17 +16146,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.22.tgz", - "integrity": "sha512-7B8mfQBtwwr2aNRRmU39k/bsRtv9B6/1mTMrGmmdJFKmLAH+KgIiOuhaqfKOBGh9sZ/VkZxbvm94rI4MMYpFjQ==", + "version": "4.2.45", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.45.tgz", + "integrity": "sha512-q5dOqqfTgUcLe38TAGiFn9srToKj2YCHJ34QGOLzM+xYLLA+qRZv7N+33kl1MERVusue36ZHnlNaNEvY/PzSrw==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", + "@smithy/config-resolver": "^4.4.11", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14869,13 +16164,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", + "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14883,9 +16178,9 @@ } }, "node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14895,12 +16190,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", + "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14908,13 +16203,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", + "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/service-error-classification": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -14922,18 +16217,18 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "version": "4.5.20", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.20.tgz", + "integrity": "sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.5.0", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14941,9 +16236,9 @@ } }, "node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", + "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14953,12 +16248,12 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", + "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -14966,13 +16261,25 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz", - "integrity": "sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.13.tgz", + "integrity": "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -15002,15 +16309,16 @@ } }, "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "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/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -15026,6 +16334,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -15041,6 +16350,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -15056,6 +16366,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -15071,6 +16382,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -15086,6 +16398,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -15101,6 +16414,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -15116,6 +16430,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -15131,6 +16446,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", @@ -15156,6 +16472,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15175,6 +16492,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", "dependencies": { "@babel/types": "^7.21.3", "entities": "^4.4.0" @@ -15191,6 +16509,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15253,11 +16572,12 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", + "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.8.0" } }, "node_modules/@szmarczak/http-timer": { @@ -15273,24 +16593,25 @@ } }, "node_modules/@tailwindcss/forms": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", - "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", + "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", "dev": true, + "license": "MIT", "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, "node_modules/@tanstack/react-virtual": { - "version": "3.13.19", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", - "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", + "version": "3.13.23", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", + "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.13.19" + "@tanstack/virtual-core": "3.13.23" }, "funding": { "type": "github", @@ -15302,9 +16623,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.13.19", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", - "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==", + "version": "3.13.23", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", + "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", "funding": { "type": "github", @@ -15312,19 +16633,20 @@ } }, "node_modules/@tantaman/api-extractor": { - "version": "7.52.13", - "resolved": "https://registry.npmjs.org/@tantaman/api-extractor/-/api-extractor-7.52.13.tgz", - "integrity": "sha512-R/++OYrkWViuV2VEDkR+7ofEROh78qFFCt9NCll9ltusNPNWxSbA8pABLJLLMhCjR3XPjJU50tJ9JbB+KcZg8A==", + "version": "7.55.0", + "resolved": "https://registry.npmjs.org/@tantaman/api-extractor/-/api-extractor-7.55.0.tgz", + "integrity": "sha512-62EM3QnYmCmyWPSXoYyfT2F14CDW4dl32i5Ckb8W9/yd1XTQzslbKcm/oJv2sXXaEv8YFovy12HnNXe8kC9AuA==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.30.7", - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.14.0", - "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.16.0", - "@rushstack/ts-command-line": "5.0.3", + "@microsoft/api-extractor-model": "7.32.0", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.18.0", + "@rushstack/rig-package": "0.6.0", + "@rushstack/terminal": "0.19.3", + "@rushstack/ts-command-line": "5.1.3", + "diff": "~8.0.2", "lodash": "~4.17.15", "minimatch": "10.0.3", "resolve": "~1.22.1", @@ -15336,20 +16658,17 @@ "api-extractor": "bin/api-extractor" } }, - "node_modules/@tantaman/api-extractor/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "node_modules/@tantaman/api-extractor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "license": "ISC", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, "node_modules/@tantaman/api-extractor/node_modules/semver": { @@ -15392,19 +16711,27 @@ "node": ">=14.17" } }, + "node_modules/@tantaman/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/@testcontainers/postgresql": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-10.9.0.tgz", - "integrity": "sha512-Z3K/TFkl/PVE2v8A6yKqgF4pSFk9ilFG02yeGhPswUjmBlcig/rpVOjBQOkQ/yJCcQ/r2RrX3RR+7vr+UO4QlQ==", + "version": "10.28.0", + "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-10.28.0.tgz", + "integrity": "sha512-NN25rruG5D4Q7pCNIJuHwB+G85OSeJ3xHZ2fWx0O6sPoPEfCYwvpj8mq99cyn68nxFkFYZeyrZJtSFO+FnydiA==", "dev": true, + "license": "MIT", "dependencies": { - "testcontainers": "^10.9.0" + "testcontainers": "^10.28.0" } }, "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", "dependencies": { @@ -15412,9 +16739,9 @@ "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", - "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", + "picocolors": "1.1.1", "pretty-format": "^27.0.2" }, "engines": { @@ -15456,15 +16783,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@ts-morph/common": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", @@ -15477,25 +16795,57 @@ "path-browserify": "^1.0.1" } }, + "node_modules/@ts-morph/common/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT" }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT" }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", @@ -15522,9 +16872,9 @@ "license": "MIT" }, "node_modules/@types/aws-lambda": { - "version": "8.10.150", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.150.tgz", - "integrity": "sha512-AX+AbjH/rH5ezX1fbK8onC/a+HyQHo7QGmvoxAE42n22OsciAxvZoZNEr22tbXs8WfP1nIsBjKDpgPm3HjOZbA==", + "version": "8.10.152", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.152.tgz", + "integrity": "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==", "license": "MIT" }, "node_modules/@types/babel__core": { @@ -15532,6 +16882,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -15541,37 +16892,41 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.28.2" } }, "node_modules/@types/basic-auth": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/@types/basic-auth/-/basic-auth-1.1.8.tgz", "integrity": "sha512-dKcUeixGuZn8pBjcUrf1N7x5K6lWuKuwHHitM2IZ4vwZUDWEhhNtwCWiba8jTA9zn0GQQ+fTFkWpKx8pOU/enw==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -15622,9 +16977,10 @@ "license": "MIT" }, "node_modules/@types/command-line-usage": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.2.tgz", - "integrity": "sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg==" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "license": "MIT" }, "node_modules/@types/connect": { "version": "3.4.38", @@ -15708,6 +17064,7 @@ "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -15731,9 +17088,9 @@ } }, "node_modules/@types/dockerode": { - "version": "3.3.44", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.44.tgz", - "integrity": "sha512-fUpIHlsbYpxAJb285xx3vp7q5wf5mjqSn3cYwl/MhiM+DB99OdO5sOCPlO0PjO+TyOtphPs7tMVLU/RtOo/JjA==", + "version": "3.3.47", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.47.tgz", + "integrity": "sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==", "dev": true, "license": "MIT", "dependencies": { @@ -15772,6 +17129,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -15789,9 +17147,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -15821,6 +17179,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -15838,9 +17197,9 @@ "license": "MIT" }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", "license": "MIT" }, "node_modules/@types/http-errors": { @@ -15886,23 +17245,27 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", - "dev": true + "dev": true, + "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==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, "node_modules/@types/k6": { "version": "0.53.2", "resolved": "https://registry.npmjs.org/@types/k6/-/k6-0.53.2.tgz", "integrity": "sha512-TxFJbeSfD/RfQe+GeMbpdwiOOySRTj3vfHvcA4yoLQ3wvGPjyppCqmyKXgktf3535T+YAc41bB7GkhuCPRmfUg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -15929,9 +17292,10 @@ "license": "MIT" }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" }, "node_modules/@types/mysql": { "version": "2.15.27", @@ -15943,29 +17307,14 @@ } }, "node_modules/@types/node": { - "version": "22.18.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", - "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "version": "22.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", + "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, - "node_modules/@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, "node_modules/@types/oracledb": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-6.5.2.tgz", @@ -15976,9 +17325,9 @@ } }, "node_modules/@types/pg": { - "version": "8.15.4", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", - "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.18.0.tgz", + "integrity": "sha512-gT+oueVQkqnj6ajGJXblFR4iavIXWsGAFCk3dP4Kki5+a9R4NMt0JARdk6s8cUKcfUoqP5dAtDSLU8xYUTFV+Q==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -15990,7 +17339,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/pg-format/-/pg-format-1.0.5.tgz", "integrity": "sha512-i+oEEJEC+1I3XAhgqtVp45Faj8MBbV0Aoq4rHsHD7avgLjyDkaWKObd514g0Q/DOUkdxU0P4CQ0iq2KR4SoJcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/pg-pool": { "version": "2.0.6", @@ -16009,21 +17359,21 @@ "license": "MIT" }, "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -16033,13 +17383,13 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { @@ -16100,10 +17450,11 @@ } }, "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", - "dev": true + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "1.2.1", @@ -16164,10 +17515,11 @@ } }, "node_modules/@types/ssh2-streams": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz", - "integrity": "sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.13.tgz", + "integrity": "sha512-faHyY3brO9oLEA0QlcO8N2wT7R0+1sHWZvQ+y3rMLwdY1ZyS1z0W3t65j9PqT4HmQ6ALzNe7RZlNuCNE0wBSWA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -16182,6 +17534,13 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -16210,7 +17569,8 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", @@ -16218,25 +17578,19 @@ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "license": "MIT" - }, "node_modules/@types/ws": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", - "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -16254,33 +17608,6 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, - "node_modules/@urql/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", - "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@0no-co/graphql.web": "^1.0.13", - "wonka": "^6.3.2" - } - }, - "node_modules/@urql/exchange-retry": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", - "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@urql/core": "^5.1.2", - "wonka": "^6.3.2" - }, - "peerDependencies": { - "@urql/core": "^5.0.0" - } - }, "node_modules/@vercel/build-utils": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-8.7.0.tgz", @@ -16332,11 +17659,33 @@ "node": ">= 8.0.0" } }, + "node_modules/@vercel/nft/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@vercel/nft/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@vercel/nft/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==", + "license": "MIT" + }, "node_modules/@vercel/nft/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -16353,6 +17702,39 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@vercel/nft/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@vercel/nft/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vercel/nft/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@vercel/node": { "version": "3.2.29", "resolved": "https://registry.npmjs.org/@vercel/node/-/node-3.2.29.tgz", @@ -16473,15 +17855,6 @@ "node": ">=4.2.0" } }, - "node_modules/@vercel/oidc": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", - "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, "node_modules/@vercel/static-config": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.0.0.tgz", @@ -16509,75 +17882,64 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@vercel/static-config/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/@vitejs/plugin-react": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", - "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.28.5", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.53", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" + "@rolldown/pluginutils": "1.0.0-rc.7" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } } }, "node_modules/@vitest/browser": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", - "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.0.tgz", + "integrity": "sha512-tG/iOrgbiHQks0ew7CdelUyNEHkv8NLrt+CqdTivIuoSnXvO7scWMn4Kqo78/UGY1NJ6Hv+vp8BvRnED/bjFdQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/mocker": "4.0.15", - "@vitest/utils": "4.0.15", + "@blazediff/core": "1.9.1", + "@vitest/mocker": "4.1.0", + "@vitest/utils": "4.1.0", "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", "pngjs": "^7.0.0", "sirv": "^3.0.2", "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" + "ws": "^8.19.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.0.15" + "vitest": "4.1.0" } }, "node_modules/@vitest/browser-playwright": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", - "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.0.tgz", + "integrity": "sha512-2RU7pZELY9/aVMLmABNy1HeZ4FX23FXGY1jRuHLHgWa2zaAE49aNW2GLzebW+BmbTZIKKyFF1QXvk7DEWViUCQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/browser": "4.0.15", - "@vitest/mocker": "4.0.15", + "@vitest/browser": "4.1.0", + "@vitest/mocker": "4.1.0", "tinyrainbow": "^3.0.3" }, "funding": { @@ -16585,7 +17947,7 @@ }, "peerDependencies": { "playwright": "*", - "vitest": "4.0.15" + "vitest": "4.1.0" }, "peerDependenciesMeta": { "playwright": { @@ -16593,41 +17955,30 @@ } } }, - "node_modules/@vitest/browser/node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.19.0" - } - }, "node_modules/@vitest/coverage-v8": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.15.tgz", - "integrity": "sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.0.tgz", + "integrity": "sha512-nDWulKeik2bL2Va/Wl4x7DLuTKAXa906iRFooIRPR+huHkcvp9QDkPQ2RJdmjOFrqOqvNfoSQLF68deE3xC3CQ==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.0.15", - "ast-v8-to-istanbul": "^0.3.8", + "@vitest/utils": "4.1.0", + "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.2.0", - "magicast": "^0.5.1", + "magicast": "^0.5.2", "obug": "^2.1.1", - "std-env": "^3.10.0", + "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.0.15", - "vitest": "4.0.15" + "@vitest/browser": "4.1.0", + "vitest": "4.1.0" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -16636,17 +17987,17 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz", - "integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.0.0", + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.15", - "@vitest/utils": "4.0.15", - "chai": "^6.2.1", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "chai": "^6.2.2", "tinyrainbow": "^3.0.3" }, "funding": { @@ -16654,13 +18005,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", - "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.15", + "@vitest/spy": "4.1.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -16669,7 +18020,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -16680,20 +18031,10 @@ } } }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz", - "integrity": "sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", "dev": true, "license": "MIT", "dependencies": { @@ -16704,13 +18045,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz", - "integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.15", + "@vitest/utils": "4.1.0", "pathe": "^2.0.3" }, "funding": { @@ -16718,13 +18059,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz", - "integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.15", + "@vitest/pretty-format": "4.1.0", + "@vitest/utils": "4.1.0", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -16733,45 +18075,24 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz", - "integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.15.tgz", - "integrity": "sha512-sxSyJMaKp45zI0u+lHrPuZM1ZJQ8FaVD35k+UxVrha1yyvQ+TZuUYllUixwvQXlB7ixoDc7skf3lQPopZIvaQw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.15", - "fflate": "^0.8.2", - "flatted": "^3.3.3", - "pathe": "^2.0.3", - "sirv": "^3.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3" - }, "funding": { "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.15" } }, "node_modules/@vitest/utils": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.15.tgz", - "integrity": "sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.15", + "@vitest/pretty-format": "4.1.0", + "convert-source-map": "^2.0.0", "tinyrainbow": "^3.0.3" }, "funding": { @@ -16948,12 +18269,12 @@ "license": "Apache-2.0" }, "node_modules/@xyflow/react": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.8.2.tgz", - "integrity": "sha512-VifLpxOy74ck283NQOtBn1e8igmB7xo7ADDKxyBHkKd8IKpyr16TgaYOhzqVwNMdB4NT+m++zfkic530L+gEXw==", + "version": "12.10.1", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.1.tgz", + "integrity": "sha512-5eSWtIK/+rkldOuFbOOz44CRgQRjtS9v5nufk77DV+XBnfCGL9HAQ8PG00o2ZYKqkEU/Ak6wrKC95Tu+2zuK3Q==", "license": "MIT", "dependencies": { - "@xyflow/system": "0.0.66", + "@xyflow/system": "0.0.75", "classcat": "^5.0.3", "zustand": "^4.4.0" }, @@ -16963,9 +18284,9 @@ } }, "node_modules/@xyflow/system": { - "version": "0.0.66", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.66.tgz", - "integrity": "sha512-TTxESDwPsATnuDMUeYYtKe4wt9v8bRO29dgYBhR8HyhSCzipnAdIL/1CDfFd+WqS1srVreo24u6zZeVIDk4r3Q==", + "version": "0.0.75", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.75.tgz", + "integrity": "sha512-iXs+AGFLi8w/VlAoc/iSxk+CxfT6o64Uw/k0CKASOPqjqz6E0rb5jFZgJtXGZCpfQI6OQpu5EnumP5fGxQheaQ==", "license": "MIT", "dependencies": { "@types/d3-drag": "^3.0.7", @@ -17001,7 +18322,8 @@ "node_modules/abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" }, "node_modules/accepts": { "version": "1.3.8", @@ -17047,9 +18369,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -17062,10 +18384,23 @@ "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==", + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -17076,9 +18411,13 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -17114,43 +18453,42 @@ "node": ">=8" } }, - "node_modules/ai": { - "version": "5.0.113", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.113.tgz", - "integrity": "sha512-26vivpSO/mzZj0k1Si2IpsFspp26ttQICHRySQiMrtWcRd5mnJMX2a8sG28vmZ38C+JUn1cWmfZrsLMxkSMw9g==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/gateway": "2.0.21", - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", - "@opentelemetry/api": "1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "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" + "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/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -17163,64 +18501,47 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "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/ajv-formats/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==" - }, "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/algoliasearch": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", - "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.12.0", - "@algolia/client-abtesting": "5.46.0", - "@algolia/client-analytics": "5.46.0", - "@algolia/client-common": "5.46.0", - "@algolia/client-insights": "5.46.0", - "@algolia/client-personalization": "5.46.0", - "@algolia/client-query-suggestions": "5.46.0", - "@algolia/client-search": "5.46.0", - "@algolia/ingestion": "1.46.0", - "@algolia/monitoring": "1.46.0", - "@algolia/recommend": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", + "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.15.2", + "@algolia/client-abtesting": "5.49.2", + "@algolia/client-analytics": "5.49.2", + "@algolia/client-common": "5.49.2", + "@algolia/client-insights": "5.49.2", + "@algolia/client-personalization": "5.49.2", + "@algolia/client-query-suggestions": "5.49.2", + "@algolia/client-search": "5.49.2", + "@algolia/ingestion": "1.49.2", + "@algolia/monitoring": "1.49.2", + "@algolia/recommend": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz", - "integrity": "sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.0.tgz", + "integrity": "sha512-GBN0xsxGggaCPElZq24QzMdfphrjIiV2xA+hRXE4/UMpN3nsF2WrM8q+x80OGvGpJWtB7F+4Hq5eSfWwuejXrg==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -17250,6 +18571,26 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -17293,20 +18634,19 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -17316,12 +18656,14 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -17330,10 +18672,22 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", "license": "ISC" }, "node_modules/archiver": { @@ -17374,6 +18728,23 @@ "node": ">= 14" } }, + "node_modules/archiver-utils/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/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/archiver-utils/node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -17399,6 +18770,68 @@ "ieee754": "^1.2.1" } }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/archiver-utils/node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -17416,6 +18849,21 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/archiver/node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/archiver/node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -17459,13 +18907,14 @@ } }, "node_modules/archiver/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", "dev": true, "license": "MIT", "dependencies": { "b4a": "^1.6.4", + "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } @@ -17485,14 +18934,19 @@ } }, "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/aria-query": { "version": "5.3.0", @@ -17508,6 +18962,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", "engines": { "node": ">=12.17" } @@ -17540,6 +18995,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } @@ -17548,7 +19004,6 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.6", @@ -17587,31 +19042,21 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", - "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", + "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" + "js-tokens": "^10.0.0" } }, "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, @@ -17631,14 +19076,6 @@ "dev": true, "license": "MIT" }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/async-listen": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz", @@ -17648,6 +19085,13 @@ "node": ">= 14" } }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "dev": true, + "license": "MIT" + }, "node_modules/async-mutex": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", @@ -17668,6 +19112,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -17682,9 +19127,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "funding": [ { "type": "opencollective", @@ -17702,7 +19147,7 @@ "license": "MIT", "dependencies": { "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", + "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -17733,9 +19178,20 @@ } }, "node_modules/avvio": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.0.0.tgz", - "integrity": "sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", + "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { "@fastify/error": "^4.0.0", "fastq": "^1.17.1" @@ -17758,21 +19214,6 @@ "node": ">= 6.0.0" } }, - "node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -17796,6 +19237,55 @@ "@babel/core": "^7.8.0" } }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-loader": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", @@ -17840,45 +19330,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", @@ -17897,9 +19348,9 @@ } }, "node_modules/babel-plugin-jsx-dom-expressions": { - "version": "0.39.8", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.39.8.tgz", - "integrity": "sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==", + "version": "0.40.5", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.5.tgz", + "integrity": "sha512-8TFKemVLDYezqqv4mWz+PhRrkryTzivTGu0twyLrOkVZ0P63COx2Y04eVsUjFlwSOXui1z3P3Pn209dokWnirg==", "dev": true, "license": "MIT", "dependencies": { @@ -17907,8 +19358,7 @@ "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", - "parse5": "^7.1.2", - "validate-html-nesting": "^1.2.1" + "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" @@ -17927,21 +19377,14 @@ "node": ">=6.9.0" } }, - "node_modules/babel-plugin-jsx-dom-expressions/node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true, - "license": "MIT" - }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { @@ -17958,25 +19401,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -17994,24 +19437,13 @@ } }, "node_modules/babel-plugin-react-native-web": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", - "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", + "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", "dev": true, "license": "MIT", "peer": true }, - "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", - "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-parser": "0.29.1" - } - }, "node_modules/babel-plugin-transform-flow-enums": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", @@ -18070,16 +19502,22 @@ } }, "node_modules/babel-preset-solid": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.6.tgz", - "integrity": "sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.10.tgz", + "integrity": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jsx-dom-expressions": "^0.39.8" + "babel-plugin-jsx-dom-expressions": "^0.40.3" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0", + "solid-js": "^1.9.10" + }, + "peerDependenciesMeta": { + "solid-js": { + "optional": true + } } }, "node_modules/backo2": { @@ -18093,20 +19531,27 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "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==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/bare-events": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.0.tgz", - "integrity": "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -18119,12 +19564,11 @@ } }, "node_modules/bare-fs": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.10.tgz", - "integrity": "sha512-arqVF+xX/rJHwrONZaSPhlzleT2gXwVs9rsAe1p1mIVwWZI2A76/raio+KwwxfWMO8oV9Wo90EaUkS2QwVmy4w==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.5.tgz", + "integrity": "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", @@ -18145,12 +19589,11 @@ } }, "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz", + "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==", "dev": true, "license": "Apache-2.0", - "optional": true, "engines": { "bare": ">=1.14.0" } @@ -18161,20 +19604,19 @@ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-os": "^3.0.1" } }, "node_modules/bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.1.tgz", + "integrity": "sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { - "streamx": "^2.21.0" + "streamx": "^2.21.0", + "teex": "^1.0.1" }, "peerDependencies": { "bare-buffer": "*", @@ -18190,12 +19632,11 @@ } }, "node_modules/bare-url": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.0.tgz", - "integrity": "sha512-c+RCqMSZbkz97Mw1LWR0gcOqwK82oyYKfLoHJ8k13ybi1+I80ffdDzUy0TdAburdrR/kI0/VuN8YgEnJqX+Nyw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-path": "^3.0.0" } @@ -18226,21 +19667,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz", - "integrity": "sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==", + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", "dependencies": { "safe-buffer": "5.1.2" }, @@ -18248,15 +19694,10 @@ "node": ">= 0.8" } }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/basic-ftp": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", - "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", + "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", "dev": true, "license": "MIT", "engines": { @@ -18274,6 +19715,7 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } @@ -18281,7 +19723,8 @@ "node_modules/before-after-hook": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "license": "Apache-2.0" }, "node_modules/better-opn": { "version": "3.0.2", @@ -18327,17 +19770,22 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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==", + "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" } @@ -18346,6 +19794,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -18394,41 +19843,12 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/body-parser/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -18446,9 +19866,9 @@ "license": "ISC" }, "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", "license": "MIT" }, "node_modules/boxen": { @@ -18473,95 +19893,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/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==", - "license": "MIT" - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12.20" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/bplist-creator": { @@ -18590,13 +19962,17 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -18683,6 +20059,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -18701,12 +20078,13 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" }, "node_modules/buildcheck": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", - "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz", + "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==", "dev": true, "optional": true, "engines": { @@ -18733,6 +20111,7 @@ "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -18746,6 +20125,15 @@ "node": ">= 0.8" } }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -18832,49 +20220,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -18893,6 +20243,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -18905,6 +20256,7 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -18922,9 +20274,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", "funding": [ { "type": "opencollective", @@ -18945,15 +20297,16 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chai": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", - "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { @@ -18961,30 +20314,27 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", + "license": "MIT", "dependencies": { - "chalk": "^4.1.2" + "chalk": "^5.2.0" }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/chalk/chalk-template?sponsor=1" @@ -18999,10 +20349,21 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -19081,34 +20442,33 @@ "regexp-to-ast": "0.5.0" } }, + "node_modules/chevrotain/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, "node_modules/chrome-launcher": { "version": "0.15.2", @@ -19183,7 +20543,8 @@ "node_modules/cjs-module-lexer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" }, "node_modules/classcat": { "version": "5.0.5", @@ -19194,7 +20555,8 @@ "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" }, "node_modules/clean-css": { "version": "5.3.3", @@ -19257,6 +20619,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -19280,6 +20643,26 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/client-simulator": { "resolved": "tools/client-simulator", "link": true @@ -19288,6 +20671,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -19297,6 +20681,58 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -19339,22 +20775,6 @@ "node": ">=20 <=24" } }, - "node_modules/cloudevents/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "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/cloudevents/node_modules/ajv-formats": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", @@ -19372,16 +20792,11 @@ } } }, - "node_modules/cloudevents/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/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" } @@ -19464,6 +20879,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz", "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==", + "license": "MIT", "dependencies": { "array-back": "^6.2.2", "find-replace": "^5.0.2", @@ -19483,23 +20899,86 @@ } }, "node_modules/command-line-usage": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", - "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.4.tgz", + "integrity": "sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==", + "license": "MIT", "dependencies": { "array-back": "^6.2.2", "chalk-template": "^0.4.0", - "table-layout": "^4.1.0", - "typical": "^7.1.1" + "table-layout": "^4.1.1", + "typical": "^7.3.0" }, "engines": { "node": ">=12.20.0" } }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/command-line-usage/node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } }, "node_modules/common-path-prefix": { "version": "3.0.0", @@ -19520,7 +20999,8 @@ "node_modules/compare-utf8": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/compare-utf8/-/compare-utf8-0.1.1.tgz", - "integrity": "sha512-bND8Irz+KrF96w4Tkm1m8u5q8iE2fnvP196sHGy7XNrGNXlhyl07VnsCRYrXgEhhf/lM7hyCKRnMeh8Icis4Sw==" + "integrity": "sha512-bND8Irz+KrF96w4Tkm1m8u5q8iE2fnvP196sHGy7XNrGNXlhyl07VnsCRYrXgEhhf/lM7hyCKRnMeh8Icis4Sw==", + "license": "Apache-2.0" }, "node_modules/compress-commons": { "version": "6.0.2", @@ -19594,9 +21074,9 @@ } }, "node_modules/compressible/node_modules/mime-db": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -19644,15 +21124,36 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "dev": true, "license": "MIT" }, @@ -19828,19 +21329,26 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", @@ -19866,18 +21374,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/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==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/copy-webpack-plugin/node_modules/globby": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", @@ -19910,9 +21406,9 @@ } }, "node_modules/core-js": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", - "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -19921,12 +21417,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", - "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "license": "MIT", "dependencies": { - "browserslist": "^4.28.0" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", @@ -19934,9 +21430,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", - "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.49.0.tgz", + "integrity": "sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -19947,12 +21443,13 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "dev": true, "license": "MIT", "dependencies": { @@ -19961,6 +21458,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cors-gate": { @@ -19974,6 +21475,7 @@ "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -20082,17 +21584,8 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -20108,6 +21601,27 @@ "node": ">= 8" } }, + "node_modules/cross-spawn/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/cross-spawn/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/crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -20140,6 +21654,7 @@ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -20154,9 +21669,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", - "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz", + "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==", "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" @@ -20170,6 +21685,7 @@ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -20267,6 +21783,7 @@ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "dev": true, + "license": "CC0-1.0", "bin": { "css-prefers-color-scheme": "dist/cli.cjs" }, @@ -20307,9 +21824,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -20332,12 +21849,14 @@ "type": "github", "url": "https://github.com/sponsors/csstools" } - ] + ], + "license": "CC0-1.0" }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -20442,18 +21961,6 @@ "postcss": "^8.4.31" } }, - "node_modules/cssnano/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -20487,20 +21994,6 @@ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "license": "CC0-1.0" }, - "node_modules/cssstyle": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^3.2.0", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -20622,57 +22115,6 @@ "node": ">= 14" } }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/datadog": { "resolved": "packages/datadog", "link": true @@ -20684,9 +22126,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -20700,17 +22142,11 @@ } } }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -20719,19 +22155,11 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decode-named-character-reference/node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -20746,6 +22174,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -20770,9 +22199,9 @@ } }, "node_modules/default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -20913,6 +22342,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -20947,9 +22377,10 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "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" } @@ -20981,6 +22412,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -20993,7 +22425,18 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } }, "node_modules/dir-glob": { "version": "3.0.1", @@ -21011,7 +22454,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dns-packet": { "version": "5.6.1", @@ -21025,11 +22469,20 @@ "node": ">=6" } }, + "node_modules/dnssd-advertise": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.3.tgz", + "integrity": "sha512-XENsHi3MBzWOCAXif3yZvU1Ah0l+nhJj1sjWL6TnOAYKvGiFhbTx32xHN7+wLMLUOCj7Nr0evADWG4R8JtqCDA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/docker-compose": { "version": "0.24.8", "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", "dev": true, + "license": "MIT", "dependencies": { "yaml": "^2.2.2" }, @@ -21072,6 +22525,25 @@ "node": ">= 8.0" } }, + "node_modules/dockerode/node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/dockerode/node_modules/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", @@ -21180,6 +22652,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -21210,9 +22683,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -21221,163 +22694,62 @@ "url": "https://dotenvx.com" } }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/drizzle-kit": { - "version": "0.31.5", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.5.tgz", - "integrity": "sha512-+CHgPFzuoTQTt7cOYCV6MOw2w8vqEn/ap1yv4bpZOWL03u7rlVRQhUY0WYT3rHsgVTXwYQDZaSUJSQrMBUKuWg==", + "version": "0.31.10", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", + "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", "dev": true, "license": "MIT", "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", - "esbuild-register": "^3.5.0" + "tsx": "^4.21.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, - "node_modules/drizzle-orm": { - "version": "0.44.5", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.44.5.tgz", - "integrity": "sha512-jBe37K7d8ZSKptdKfakQFdeljtu3P2Cbo7tJoJSVZADzIKOBo9IAJPOmMsH2bZl90bZgh8FQlD8BjxXA/zuBkQ==", + "node_modules/drizzle-kit/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=4", - "@electric-sql/pglite": ">=0.2.0", - "@libsql/client": ">=0.10.0", - "@libsql/client-wasm": ">=0.10.0", - "@neondatabase/serverless": ">=0.10.0", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1.13", - "@prisma/client": "*", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/sql.js": "*", - "@upstash/redis": ">=1.34.7", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=14.0.0", - "gel": ">=2", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "sql.js": ">=1", - "sqlite3": ">=5" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@libsql/client-wasm": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "gel": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "prisma": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/dunder-proto": { @@ -21404,6 +22776,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", @@ -21414,18 +22787,19 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" }, "node_modules/eciesjs": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.14.tgz", - "integrity": "sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.18.tgz", + "integrity": "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==", "license": "MIT", "dependencies": { - "@ecies/ciphers": "^0.2.2", - "@noble/ciphers": "^1.0.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0" + "@ecies/ciphers": "^0.2.5", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.7", + "@noble/hashes": "^1.8.0" }, "engines": { "bun": ">=1", @@ -21501,27 +22875,28 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", "license": "ISC" }, "node_modules/emoji-picker-element": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/emoji-picker-element/-/emoji-picker-element-1.22.8.tgz", - "integrity": "sha512-EFgRjrlIcdA1ilyMH/f9KjB0Pi/vynrojNgMDZfU1Jv2YLrhdLJWx6xCehizPyxm4/NUuB8DfFvIT4v+1njjPQ==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/emoji-picker-element/-/emoji-picker-element-1.29.1.tgz", + "integrity": "sha512-TOiHzu9Dqib3x4MwcAi3wi3RdyT4SoeB4b15AvH1ks4SBwTl7DeebhZ0d3x6dNi4XfNU7IGRZ7NBQllj0RqwrQ==", "license": "Apache-2.0" }, "node_modules/emoji-picker-element-data": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/emoji-picker-element-data/-/emoji-picker-element-data-1.6.1.tgz", - "integrity": "sha512-VYXjjqWYy12/uUA3q5X6Di0zROXp8TGwPiikXkhs97n3d3q3OaRV2sxGtUUColoSMPp5lfASZB9E4W+yN40qUg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/emoji-picker-element-data/-/emoji-picker-element-data-1.8.0.tgz", + "integrity": "sha512-VfRuRJNEDLS1JKlNS4olaqhjX5S1nnZ+ZHG73b/dV8QeZyi0yPruTPEE72EmF6XO3k/9hj3lybMIYMOYXb/57A==", "license": "Apache-2.0" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" }, "node_modules/emojilib": { "version": "2.4.0", @@ -21568,21 +22943,22 @@ } }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -21600,21 +22976,11 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-editor": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -21649,9 +23015,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -21699,9 +23065,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -21711,32 +23077,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" } }, "node_modules/esbuild-android-64": { @@ -21995,19 +23361,6 @@ "node": ">=12" } }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, "node_modules/esbuild-sunos-64": { "version": "0.14.47", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", @@ -22072,6 +23425,422 @@ "node": ">=12" } }, + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -22158,6 +23927,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -22183,6 +23953,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -22194,6 +23965,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -22202,6 +23974,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -22235,19 +24008,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/estree-util-build-jsx/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/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -22309,10 +24074,13 @@ } }, "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==", - "license": "MIT" + "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/esutils": { "version": "2.0.3", @@ -22367,14 +24135,16 @@ } }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -22389,23 +24159,6 @@ "bare-events": "^2.7.0" } }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/exec-async": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", - "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -22433,6 +24186,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", "engines": { "node": ">=6" } @@ -22448,24 +24202,57 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", - "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", + "version": "55.0.9", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-55.0.9.tgz", + "integrity": "sha512-OXIrxSYKlT/1Av1AMyUWeSTW1GChGofWV14sB73o5eFbfuz6ocv18fnKx+Ji67ZC7a0RztDctcZTuEQK84S4iw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { + "@expo/require-utils": "^55.0.2", "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", - "commander": "^7.2.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" + "commander": "^7.2.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, + "node_modules/expo-modules-autolinking/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expo-modules-autolinking/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/expo-modules-autolinking/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -22477,10 +24264,24 @@ "node": ">= 10" } }, + "node_modules/expo-modules-autolinking/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/expo-server": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", - "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-55.0.6.tgz", + "integrity": "sha512-xI72FTm469FfuuBL2R5aNtthgH+GR7ygOpsx/KcPS0K8AZaZd7VjtEExbzn9/qyyYkWW3T+3dAmCDKOMX8gdmQ==", "dev": true, "license": "MIT", "peer": true, @@ -22563,6 +24364,12 @@ "node": ">= 0.6" } }, + "node_modules/express/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -22593,6 +24400,26 @@ "node": ">= 0.6" } }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/exsolve": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", @@ -22603,7 +24430,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", @@ -22659,12 +24487,14 @@ "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==" + "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==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-fifo": { "version": "1.3.2", @@ -22689,6 +24519,18 @@ "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", @@ -22699,69 +24541,77 @@ "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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" }, "node_modules/fast-json-stringify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.0.0.tgz", - "integrity": "sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz", + "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { - "@fastify/merge-json-schemas": "^0.1.1", + "@fastify/merge-json-schemas": "^0.2.0", "ajv": "^8.12.0", "ajv-formats": "^3.0.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.3.0", - "json-schema-ref-resolver": "^1.0.1", + "fast-uri": "^3.0.0", + "json-schema-ref-resolver": "^3.0.0", "rfdc": "^1.2.0" } }, - "node_modules/fast-json-stringify/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "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/fast-json-stringify/node_modules/ajv/node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" - }, - "node_modules/fast-json-stringify/node_modules/fast-uri": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", - "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==" - }, - "node_modules/fast-json-stringify/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==" - }, "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-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-builder": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } }, "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", "funding": [ { "type": "github", @@ -22770,16 +24620,17 @@ ], "license": "MIT", "dependencies": { - "strnum": "^2.1.0" + "fast-xml-builder": "^1.0.0", + "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "node_modules/fastify": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.6.1.tgz", - "integrity": "sha512-WjjlOciBF0K8pDUPZoGPhqhKrQJ02I8DKaDIfO51EL0kbSMwQFl85cRwhOvmSDWoukNOdTo27gLN549pLCcH7Q==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.2.tgz", + "integrity": "sha512-lZmt3navvZG915IE+f7/TIVamxIwmBd+OMB+O9WBzcpIwOo6F0LTh0sluoMFk5VkrKTvvrwIaoJPkir4Z+jtAg==", "funding": [ { "type": "github", @@ -22792,7 +24643,7 @@ ], "license": "MIT", "dependencies": { - "@fastify/ajv-compiler": "^4.0.0", + "@fastify/ajv-compiler": "^4.0.5", "@fastify/error": "^4.0.0", "@fastify/fast-json-stringify-compiler": "^5.0.0", "@fastify/proxy-addr": "^5.0.0", @@ -22801,7 +24652,7 @@ "fast-json-stringify": "^6.0.0", "find-my-way": "^9.0.0", "light-my-request": "^6.0.0", - "pino": "^9.0.0", + "pino": "^9.14.0 || ^10.1.0", "process-warning": "^5.0.0", "rfdc": "^1.3.1", "secure-json-parse": "^4.0.0", @@ -22810,14 +24661,26 @@ } }, "node_modules/fastify-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.0.0.tgz", - "integrity": "sha512-0725fmH/yYi8ugsjszLci+lLnGBK6cG+WSxM7edY2OXJEU7gr2JiGBoieL2h9mhTych1vFsEfXsAsGGDJ/Rd5w==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -22872,6 +24735,23 @@ "bser": "2.1.1" } }, + "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/feed": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", @@ -22884,12 +24764,13 @@ "node": ">=0.4.0" } }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "node_modules/fetch-nodeshim": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.9.tgz", + "integrity": "sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/figures": { "version": "3.2.0", @@ -22935,6 +24816,37 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/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==", + "license": "MIT" + }, "node_modules/file-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -22968,7 +24880,8 @@ "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==" + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" }, "node_modules/fill-range": { "version": "7.1.1", @@ -23015,15 +24928,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/find-cache-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", @@ -23041,22 +24945,23 @@ } }, "node_modules/find-my-way": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.0.1.tgz", - "integrity": "sha512-/5NN/R0pFWuff16TMajeKt2JyiW+/OE8nOO8vo1DwZTxLaIURb7lcBYPIgRPh61yCNh9l8voeKwcrkUzmB00vw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz", + "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^4.0.0" + "safe-regex2": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/find-process": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.10.tgz", - "integrity": "sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==", + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.11.tgz", + "integrity": "sha512-mAOh9gGk9WZ4ip5UjV0o6Vb4SrfnAmtsFNzkMRH9HQiFXVQnDyQFrSHTK5UoG6E+KV+s+cIznbtwpfN41l2nFA==", "license": "MIT", "dependencies": { "chalk": "~4.1.2", @@ -23067,6 +24972,37 @@ "find-process": "bin/find-process.js" } }, + "node_modules/find-process/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/find-process/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/find-process/node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -23076,10 +25012,23 @@ "node": ">=18" } }, + "node_modules/find-process/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-replace": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -23109,9 +25058,9 @@ } }, "node_modules/find-up-simple": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, "license": "MIT", "engines": { @@ -23121,15 +25070,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -23139,13 +25079,6 @@ "flat": "cli.js" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, "node_modules/flow-enums-runtime": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", @@ -23219,6 +25152,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -23271,17 +25205,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/freeport-async": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", - "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -23294,12 +25217,13 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -23310,15 +25234,6 @@ "node": ">=14.14" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -23343,6 +25258,12 @@ "node": ">=8" } }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -23350,10 +25271,11 @@ "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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" @@ -23366,6 +25288,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -23391,6 +25314,26 @@ "node": ">=10" } }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gaxios": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", @@ -23444,10 +25387,20 @@ "is-property": "^1.0.2" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -23456,6 +25409,7 @@ "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.*" } @@ -23514,9 +25468,9 @@ } }, "node_modules/get-port-please": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", - "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", + "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", "dev": true, "license": "MIT" }, @@ -23546,9 +25500,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -23604,7 +25558,8 @@ "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" }, "node_modules/github-slugger": { "version": "1.5.0", @@ -23613,34 +25568,34 @@ "license": "ISC" }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regex.js": { @@ -23662,28 +25617,21 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -23733,13 +25681,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true, - "license": "MIT" - }, "node_modules/google-logging-utils": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", @@ -23799,9 +25740,10 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "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.12", @@ -23810,15 +25752,21 @@ "dev": true, "license": "MIT" }, + "node_modules/graphmatch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/graphmatch/-/graphmatch-1.1.1.tgz", + "integrity": "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==", + "dev": true, + "license": "MIT" + }, "node_modules/graphql": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", - "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", + "version": "15.10.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", + "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + "node": ">= 10.x" } }, "node_modules/graphql-http": { @@ -23837,6 +25785,19 @@ "graphql": ">=0.11 <=16" } }, + "node_modules/graphql-subscriptions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", + "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "iterall": "^1.3.0" + }, + "peerDependencies": { + "graphql": "^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, "node_modules/graphql-tag": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", @@ -23868,15 +25829,6 @@ "node": ">=6.0" } }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/gray-matter/node_modules/js-yaml": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", @@ -23978,9 +25930,10 @@ } }, "node_modules/hash-wasm": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", - "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.12.0.tgz", + "integrity": "sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==", + "license": "MIT" }, "node_modules/hasown": { "version": "2.0.2", @@ -23995,15 +25948,16 @@ } }, "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" @@ -24013,19 +25967,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-from-parse5/node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -24035,9 +25981,10 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", - "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -24058,22 +26005,14 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-raw/node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/hast-util-sanitize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.1.tgz", - "integrity": "sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", + "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.2.0", + "@ungap/structured-clone": "^1.0.0", "unist-util-position": "^5.0.0" }, "funding": { @@ -24109,20 +26048,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-estree/node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -24134,9 +26064,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" }, @@ -24146,14 +26076,15 @@ } }, "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" @@ -24163,19 +26094,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-parse5/node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -24185,14 +26108,15 @@ } }, "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" }, "funding": { @@ -24210,30 +26134,30 @@ } }, "node_modules/hermes-compiler": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", - "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", + "version": "250829098.0.9", + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.9.tgz", + "integrity": "sha512-hZ5O7PDz1vQ99TS7HD3FJ9zVynfU1y+VWId6U1Pldvd8hmAYrNec/XLPYJKD3dLOW6NXak6aAQAuMuSo3ji0tQ==", "dev": true, "license": "MIT", "peer": true }, "node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, "license": "MIT", "peer": true }, "node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "hermes-estree": "0.29.1" + "hermes-estree": "0.32.0" } }, "node_modules/history": { @@ -24266,15 +26190,37 @@ "license": "MIT" }, "node_modules/hono": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", - "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", + "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "dev": true, "license": "MIT", "engines": { "node": ">=16.9.0" } }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -24308,12 +26254,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -24323,23 +26263,18 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "7.2.0", @@ -24384,9 +26319,10 @@ } }, "node_modules/html-url-attributes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", - "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -24396,15 +26332,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", + "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -24483,9 +26420,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { @@ -24495,9 +26432,9 @@ "license": "MIT" }, "node_modules/http-encoding": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/http-encoding/-/http-encoding-2.1.1.tgz", - "integrity": "sha512-3QaTIBHWLcmq63sSKHVGiUExX+XnOQx1szJJH6wJgyWyXDpSdmKiaBXN/5xF74eToh0VujfJGFBF3tunaK2ZQA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http-encoding/-/http-encoding-2.2.0.tgz", + "integrity": "sha512-sotL89NNHWS7TjaoswmKkNKf57+nAYCg3fbGCclpNLriVGkOSgrAWQ9DLqahnwacY+gednJk+HFdZrpKw/Ff6w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -24523,19 +26460,23 @@ } }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { @@ -24596,6 +26537,18 @@ } } }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/http-proxy/node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -24680,7 +26633,8 @@ "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" }, "node_modules/ieee754": { "version": "1.2.1", @@ -24699,7 +26653,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.2", @@ -24711,15 +26666,10 @@ } }, "node_modules/image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", "license": "MIT", - "peer": true, - "dependencies": { - "queue": "6.0.2" - }, "bin": { "image-size": "bin/image-size.js" }, @@ -24728,9 +26678,10 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -24742,18 +26693,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, "node_modules/import-in-the-middle": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", - "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", @@ -24774,6 +26718,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -24810,12 +26755,14 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/inline-style-parser": { "version": "0.2.7", @@ -24894,12 +26841,14 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -24956,17 +26905,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -24995,6 +26933,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -25003,18 +26942,20 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "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" }, @@ -25029,6 +26970,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -25105,9 +27047,9 @@ } }, "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", + "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", "license": "MIT", "engines": { "node": ">=16" @@ -25124,9 +27066,9 @@ "license": "MIT" }, "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -25157,17 +27099,18 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -25185,13 +27128,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -25296,12 +27232,17 @@ "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" }, "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/isobject": { "version": "3.0.1", @@ -25327,6 +27268,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -25375,18 +27317,17 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/istanbul-reports": { @@ -25415,6 +27356,7 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -25504,16 +27446,37 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } @@ -25542,6 +27505,20 @@ "license": "MIT", "peer": true }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", @@ -25586,6 +27563,61 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", @@ -25605,16 +27637,37 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } @@ -25643,6 +27696,20 @@ "license": "MIT", "peer": true }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -25658,21 +27725,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jimp-compact": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", @@ -25682,9 +27734,10 @@ "peer": true }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -25700,6 +27753,7 @@ "version": "17.13.3", "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -25708,15 +27762,11 @@ "@sideway/pinpoint": "^2.0.0" } }, - "node_modules/joi/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, "node_modules/jose": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.3.tgz", - "integrity": "sha512-egLIoYSpcd+QUF+UHgobt5YzI2Pkw/H39ou9suW687MY6PmCwPmkNV/4TNjn1p2tX5xO3j0d0sq5hiYE24bSlg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } @@ -25725,6 +27775,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", "engines": { "node": ">=14" } @@ -25732,20 +27783,23 @@ "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-xxhash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-xxhash/-/js-xxhash-4.0.0.tgz", "integrity": "sha512-3Q2eIqG6s1KEBBmkj9tGM9lef8LJbuRyTVBdI3GpTnrvtytunjLPO0wqABp5qhtMzfA32jYn1FlnIV7GH1RAHQ==", + "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -25753,6 +27807,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, "node_modules/jsc-safe-url": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", @@ -25761,96 +27821,6 @@ "license": "0BSD", "peer": true }, - "node_modules/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/jsdom/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -25881,33 +27851,32 @@ "node_modules/json-custom-numbers": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/json-custom-numbers/-/json-custom-numbers-3.1.1.tgz", - "integrity": "sha512-rYIAIuiIRy58aax2tuZb7HawKFATBG848PiguybJh/R+pvC8jxjEOVBQHj4J3U2D4/Y4acBCO4A/glILW8wPoA==" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT", - "peer": true + "integrity": "sha512-rYIAIuiIRy58aax2tuZb7HawKFATBG848PiguybJh/R+pvC8jxjEOVBQHj4J3U2D4/Y4acBCO4A/glILW8wPoA==", + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-ref-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", - "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", + "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "dequal": "^2.0.3" } }, "node_modules/json-schema-to-ts": { @@ -25921,9 +27890,10 @@ } }, "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==" + "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-stringify-safe": { "version": "5.0.1", @@ -25936,6 +27906,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -25944,9 +27915,9 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -25955,19 +27926,11 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/kasi": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kasi/-/kasi-1.1.0.tgz", - "integrity": "sha512-SvmC8+vhkDariSTz2182qyQ+mhwZ4W8TWaIHJcz358bYBeccQ8WBYj7uTtzHoCmpPHaoCm3PaOhzRg7Z8F4Lww==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/kasi/-/kasi-1.1.2.tgz", + "integrity": "sha512-Q2N8EHdkJFKdzq8fxzDNSXb4RE8xzcPHwZuT7N1/wJY3XaMkoGXkzGZcEnNODzQXJNOd9inReEW2V1V4svAf/Q==", + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", @@ -25987,10 +27950,19 @@ "node": ">=0.10.0" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/lan-network": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", - "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.2.0.tgz", + "integrity": "sha512-EZgbsXMrGS+oK+Ta12mCjzBFse+SIewGdwrSTr5g+MSymnjpox2x05ceI20PQejJOFvOgzcXrfDk/SdY7dSCtw==", "dev": true, "license": "MIT", "peer": true, @@ -26014,9 +27986,9 @@ } }, "node_modules/launch-editor": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", - "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.1.tgz", + "integrity": "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==", "license": "MIT", "dependencies": { "picocolors": "^1.1.1", @@ -26059,13 +28031,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -26107,9 +28072,20 @@ } }, "node_modules/light-my-request/node_modules/process-warning": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", - "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" }, "node_modules/lighthouse-logger": { "version": "1.4.2", @@ -26143,12 +28119,10 @@ "peer": true }, "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "devOptional": true, + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "license": "MPL-2.0", - "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -26160,23 +28134,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", "cpu": [ "arm64" ], @@ -26185,7 +28159,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26195,9 +28168,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], @@ -26206,7 +28179,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26216,9 +28188,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", "cpu": [ "x64" ], @@ -26227,7 +28199,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26237,9 +28208,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", "cpu": [ "x64" ], @@ -26248,7 +28219,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26258,9 +28228,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", "cpu": [ "arm" ], @@ -26269,7 +28239,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26279,9 +28248,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", "cpu": [ "arm64" ], @@ -26290,7 +28259,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26300,9 +28268,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", "cpu": [ "arm64" ], @@ -26311,7 +28279,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26321,9 +28288,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "cpu": [ "x64" ], @@ -26332,7 +28299,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26342,9 +28308,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "cpu": [ "x64" ], @@ -26353,7 +28319,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26363,9 +28328,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "cpu": [ "arm64" ], @@ -26374,7 +28339,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26384,9 +28348,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "cpu": [ "x64" ], @@ -26395,7 +28359,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -26405,18 +28368,22 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.0", @@ -26433,12 +28400,16 @@ "link": true }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -26471,9 +28442,10 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -26629,6 +28601,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -26638,6 +28611,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -26649,6 +28623,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -26666,21 +28641,18 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/lru.min": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.3.tgz", - "integrity": "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", + "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", "dev": true, "license": "MIT", "engines": { @@ -26730,14 +28702,14 @@ } }, "node_modules/magicast": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", - "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, @@ -26760,7 +28732,8 @@ "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", @@ -26786,9 +28759,9 @@ } }, "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "dev": true, "license": "MIT", "dependencies": { @@ -26803,27 +28776,23 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, "node_modules/marky": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", @@ -26863,9 +28832,10 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -26881,6 +28851,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -26889,9 +28860,10 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -26911,6 +28883,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/mdast-util-frontmatter": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", @@ -26942,9 +28930,10 @@ } }, "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -26963,6 +28952,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -26975,10 +28965,47 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -26995,6 +29022,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -27009,6 +29037,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -27025,6 +29054,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -27057,6 +29087,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -27071,9 +29102,10 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", - "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -27097,6 +29129,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -27114,6 +29147,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -27124,9 +29158,10 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -27144,15 +29179,17 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" @@ -27166,6 +29203,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -27197,11 +29235,19 @@ } }, "node_modules/memfs": { - "version": "4.51.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.1.tgz", - "integrity": "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==", - "license": "Apache-2.0", - "dependencies": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.56.11.tgz", + "integrity": "sha512-/GodtwVeKVIHZKLUSr2ZdOxKBC5hHki4JNCU22DoCGPEHr5o2PD5U721zvESKyWwCfTfavFl9WZYgA13OAYK0g==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.56.11", + "@jsonjoy.com/fs-fsa": "4.56.11", + "@jsonjoy.com/fs-node": "4.56.11", + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-to-fsa": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "@jsonjoy.com/fs-print": "4.56.11", + "@jsonjoy.com/fs-snapshot": "4.56.11", "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", @@ -27212,6 +29258,9 @@ "funding": { "type": "github", "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/memoize-one": { @@ -27257,6 +29306,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -27271,9 +29321,9 @@ } }, "node_modules/metro": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", - "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", + "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", "peer": true, @@ -27293,24 +29343,24 @@ "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", - "hermes-parser": "0.29.1", + "hermes-parser": "0.32.0", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.1", - "metro-cache": "0.83.1", - "metro-cache-key": "0.83.1", - "metro-config": "0.83.1", - "metro-core": "0.83.1", - "metro-file-map": "0.83.1", - "metro-resolver": "0.83.1", - "metro-runtime": "0.83.1", - "metro-source-map": "0.83.1", - "metro-symbolicate": "0.83.1", - "metro-transform-plugins": "0.83.1", - "metro-transform-worker": "0.83.1", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", @@ -27327,16 +29377,16 @@ } }, "node_modules/metro-babel-transformer": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", - "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", + "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.29.1", + "hermes-parser": "0.32.0", "nullthrows": "^1.1.1" }, "engines": { @@ -27344,9 +29394,9 @@ } }, "node_modules/metro-cache": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", - "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", + "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", "peer": true, @@ -27354,16 +29404,16 @@ "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.1" + "metro-core": "0.83.3" }, "engines": { "node": ">=20.19.4" } }, "node_modules/metro-cache-key": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", - "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", + "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", "peer": true, @@ -27375,130 +29425,46 @@ } }, "node_modules/metro-config": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", - "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", + "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", - "metro": "0.83.1", - "metro-cache": "0.83.1", - "metro-core": "0.83.1", - "metro-runtime": "0.83.1" + "metro": "0.83.3", + "metro-cache": "0.83.3", + "metro-core": "0.83.3", + "metro-runtime": "0.83.3", + "yaml": "^2.6.1" }, "engines": { "node": ">=20.19.4" } }, - "node_modules/metro-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/metro-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/metro-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/metro-core": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", - "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", + "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.1" + "metro-resolver": "0.83.3" }, "engines": { "node": ">=20.19.4" } }, "node_modules/metro-file-map": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", - "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", + "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", "peer": true, @@ -27518,9 +29484,9 @@ } }, "node_modules/metro-minify-terser": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", - "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", + "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", "peer": true, @@ -27533,9 +29499,9 @@ } }, "node_modules/metro-resolver": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", - "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", + "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", "peer": true, @@ -27547,9 +29513,9 @@ } }, "node_modules/metro-runtime": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", - "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", + "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", "peer": true, @@ -27562,9 +29528,9 @@ } }, "node_modules/metro-source-map": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", - "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", + "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", "peer": true, @@ -27574,9 +29540,9 @@ "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.83.1", + "metro-symbolicate": "0.83.3", "nullthrows": "^1.1.1", - "ob1": "0.83.1", + "ob1": "0.83.3", "source-map": "^0.5.6", "vlq": "^1.0.0" }, @@ -27596,16 +29562,16 @@ } }, "node_modules/metro-symbolicate": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", - "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", + "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.83.1", + "metro-source-map": "0.83.3", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" @@ -27629,9 +29595,9 @@ } }, "node_modules/metro-transform-plugins": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", - "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", + "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", "peer": true, @@ -27648,9 +29614,9 @@ } }, "node_modules/metro-transform-worker": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", - "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", + "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", "peer": true, @@ -27660,19 +29626,54 @@ "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "metro": "0.83.1", - "metro-babel-transformer": "0.83.1", - "metro-cache": "0.83.1", - "metro-cache-key": "0.83.1", - "metro-minify-terser": "0.83.1", - "metro-source-map": "0.83.1", - "metro-transform-plugins": "0.83.1", + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-source-map": "0.83.3", + "metro-transform-plugins": "0.83.3", "nullthrows": "^1.1.1" }, "engines": { "node": ">=20.19.4" } }, + "node_modules/metro/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/metro/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/metro/node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -27681,6 +29682,23 @@ "license": "MIT", "peer": true }, + "node_modules/metro/node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/metro/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -27717,6 +29735,20 @@ "node": ">=0.10.0" } }, + "node_modules/metro/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/metro/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -27741,9 +29773,9 @@ } }, "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "funding": [ { "type": "GitHub Sponsors", @@ -27754,6 +29786,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -27775,9 +29808,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "funding": [ { "type": "GitHub Sponsors", @@ -27788,6 +29821,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -27807,6 +29841,62 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-extension-directive": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", @@ -27826,6 +29916,62 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-extension-frontmatter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", @@ -27842,10 +29988,47 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", @@ -27865,6 +30048,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -27876,10 +30060,47 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -27895,10 +30116,67 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -27912,10 +30190,27 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -27928,38 +30223,30 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27972,64 +30259,32 @@ ], "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/micromark-extension-mdx-md": { + "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "license": "MIT", "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" }, "funding": { @@ -28037,31 +30292,27 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -28072,16 +30323,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28092,17 +30343,32 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28117,19 +30383,18 @@ "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -28140,15 +30405,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28159,17 +30425,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28180,17 +30445,34 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -28201,15 +30483,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0", + "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28220,14 +30503,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28238,16 +30523,66 @@ "url": "https://opencollective.com/unified" } ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-util-combine-extensions": { + "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28258,15 +30593,32 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-decode-numeric-character-reference": { + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "funding": [ { "type": "GitHub Sponsors", @@ -28277,14 +30629,17 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28295,17 +30650,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28315,12 +30669,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "funding": [ { "type": "GitHub Sponsors", @@ -28333,19 +30688,16 @@ ], "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", + "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28355,12 +30707,17 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28371,14 +30728,12 @@ "url": "https://opencollective.com/unified" } ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", "funding": [ { "type": "GitHub Sponsors", @@ -28389,14 +30744,23 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "micromark-util-types": "^2.0.0" + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" } }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -28407,16 +30771,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28427,17 +30791,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28447,12 +30810,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "funding": [ { "type": "GitHub Sponsors", @@ -28462,1957 +30826,2191 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + ], "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", - "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "bin": { - "mini-svg-data-uri": "cli.js" + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mitata": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/mitata/-/mitata-1.0.34.tgz", - "integrity": "sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA==" - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/mnemonist": { - "version": "0.39.8", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", - "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", - "dependencies": { - "obliterator": "^2.0.1" - } - }, - "node_modules/mockttp": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/mockttp/-/mockttp-4.2.1.tgz", - "integrity": "sha512-pH9DtzfsHZrd7KkOpqpifkepcwhiBrAJwgoGmhQYp+5HzBa/ehMwmTFBEQ0+HCOUzLKWt1B0182Ovl5fdEp/Bw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@graphql-tools/schema": "^8.5.0", - "@graphql-tools/utils": "^8.8.0", - "@httptoolkit/httpolyglot": "^3.0.1", - "@httptoolkit/subscriptions-transport-ws": "^0.11.2", - "@httptoolkit/util": "^0.1.7", - "@httptoolkit/websocket-stream": "^6.0.1", - "@peculiar/asn1-pkcs8": "^2.5.0", - "@peculiar/asn1-schema": "^2.3.15", - "@peculiar/asn1-x509": "^2.3.15", - "@peculiar/x509": "^1.12.3", - "@types/cors": "^2.8.6", - "@types/node": "*", - "async-mutex": "^0.5.0", - "base64-arraybuffer": "^0.1.5", - "body-parser": "^1.15.2", - "cacheable-lookup": "^6.0.0", - "common-tags": "^1.8.0", - "connect": "^3.7.0", - "cors": "^2.8.4", - "cors-gate": "^1.1.3", - "cross-fetch": "^3.1.5", - "destroyable-server": "^1.1.1", - "express": "^4.14.0", - "fast-json-patch": "^3.1.1", - "graphql": "^14.0.2 || ^15.5", - "graphql-http": "^1.22.0", - "graphql-subscriptions": "^1.1.0", - "graphql-tag": "^2.12.6", - "http-encoding": "^2.0.1", - "http2-wrapper": "^2.2.1", - "https-proxy-agent": "^5.0.1", - "isomorphic-ws": "^4.0.1", - "lodash": "^4.16.4", - "lru-cache": "^7.14.0", - "native-duplexpair": "^1.0.0", - "pac-proxy-agent": "^7.0.0", - "parse-multipart-data": "^1.4.0", - "performance-now": "^2.1.0", - "portfinder": "^1.0.32", - "read-tls-client-hello": "^1.1.0", - "semver": "^7.5.3", - "socks-proxy-agent": "^7.0.0", - "typed-error": "^3.0.2", - "urlpattern-polyfill": "^8.0.0", - "ws": "^8.8.0" - }, - "bin": { - "mockttp": "dist/admin/admin-bin.js" - }, - "engines": { - "node": ">=20.0.0" - } + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/mockttp/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mockttp/node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=10.6.0" + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/mockttp/node_modules/graphql": { - "version": "15.10.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", - "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.x" - } + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/mockttp/node_modules/graphql-subscriptions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", - "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", - "dev": true, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "iterall": "^1.3.0" - }, - "peerDependencies": { - "graphql": "^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/mockttp/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mockttp/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mockttp/node_modules/urlpattern-polyfill": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", - "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", - "dev": true, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "node_modules/monaco-editor": { - "version": "0.52.2", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" } }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "license": "MIT", - "engines": { - "node": ">=10" - } + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "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==", + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/mysql2": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", - "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "aws-ssl-profiles": "^1.1.1", - "denque": "^2.1.0", - "generate-function": "^2.3.1", - "iconv-lite": "^0.7.0", - "long": "^5.2.1", - "lru.min": "^1.0.0", - "named-placeholders": "^1.1.3", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "engines": { - "node": ">= 8.0" - } + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "dev": true, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "micromark-util-types": "^2.0.0" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/named-placeholders": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", - "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", - "dev": true, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "lru.min": "^1.1.0" - }, - "engines": { - "node": ">=8.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "dev": true, - "optional": true + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "node_modules/native-duplexpair": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", - "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", - "dev": true, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/nested-error-stacks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/netmask": { + "node_modules/micromark-util-types": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.4.0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/nock": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.4.tgz", - "integrity": "sha512-86fh+gIKH8H02+y0/HKAOZZXn6OwgzXvl6JYwfjvKkoKxUWz54wIIDU/+w24xzMvk/R8pNVXOrvTubyl+Ml6cg==", - "dev": true, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { - "@mswjs/interceptors": "^0.38.5", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=18.20.0 <20 || >=20.12.1" + "node": ">=8.6" } }, - "node_modules/nock/node_modules/@mswjs/interceptors": { - "version": "0.38.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.38.6.tgz", - "integrity": "sha512-qFlpmObPqeUs4u3oFYv/OM/xyX+pNa5TRAjqjvMhbGYlyMhzSrE5UfncL2rUcEeVfD9Gebgff73hPwqcOwJQNA==", - "dev": true, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, "engines": { - "node": ">=18" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", - "dependencies": { - "semver": "^7.3.5" + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, "engines": { - "node": ">=18" + "node": ">= 0.6" } }, - "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==", + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "mime-db": "~1.33.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "dev": true, - "license": "MIT" + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", - "license": "(BSD-3-Clause OR GPL-2.0)", + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { - "node": ">= 6.13.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/mini-css-extract-plugin": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.1.tgz", + "integrity": "sha512-k7G3Y5QOegl380tXmZ68foBRRjE9Ljavx835ObdvmZjQ639izvZD8CS7BkWw1qKPPzHsGL/JDhl0uyU1zc2rJw==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", "dev": true, "license": "MIT", - "peer": true + "bin": { + "mini-svg-data-uri": "cli.js" + } }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "license": "MIT" + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, "license": "ISC", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", - "engines": { - "node": ">=14.16" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "peer": true, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", "dependencies": { - "lru-cache": "^10.0.1" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", - "peer": true - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "node_modules/mitata": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/mitata/-/mitata-1.0.34.tgz", + "integrity": "sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA==", "license": "MIT" }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": ">=10" } }, - "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/mnemonist": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.40.0.tgz", + "integrity": "sha512-kdd8AFNig2AD5Rkih7EPCXhu/iMvwevQFX/uEiGhZyPZi7fHqOoF4V4kHLpCfysxXMgQ4B52kdPMCwARshKvEg==", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "obliterator": "^2.0.4" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/nwsapi": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", - "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/nypm": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", - "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "node_modules/mockttp": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/mockttp/-/mockttp-4.2.3.tgz", + "integrity": "sha512-UZoO+wQqptZNBnCxvmtUKALeRZTryhDB/viFWS0Dg584WwXvAeacvFmkwa5+lxbdh8AihnEoUcD61Oy1V0N75A==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.2", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "tinyexec": "^1.0.1" + "@graphql-tools/schema": "^8.5.0", + "@graphql-tools/utils": "^8.8.0", + "@httptoolkit/httpolyglot": "^3.0.1", + "@httptoolkit/subscriptions-transport-ws": "^0.11.2", + "@httptoolkit/util": "^0.1.7", + "@httptoolkit/websocket-stream": "^6.0.1", + "@peculiar/asn1-pkcs8": "^2.5.0", + "@peculiar/asn1-schema": "^2.3.15", + "@peculiar/asn1-x509": "^2.3.15", + "@peculiar/x509": "^1.12.3", + "@types/cors": "^2.8.6", + "@types/node": "*", + "async-mutex": "^0.5.0", + "base64-arraybuffer": "^0.1.5", + "body-parser": "^1.15.2", + "cacheable-lookup": "^6.0.0", + "common-tags": "^1.8.0", + "connect": "^3.7.0", + "cors": "^2.8.4", + "cors-gate": "^1.1.3", + "destroyable-server": "^1.1.1", + "express": "^4.14.0", + "fast-json-patch": "^3.1.1", + "graphql": "^14.0.2 || ^15.5", + "graphql-http": "^1.22.0", + "graphql-subscriptions": "^1.1.0", + "graphql-tag": "^2.12.6", + "http-encoding": "^2.0.1", + "http2-wrapper": "^2.2.1", + "https-proxy-agent": "^5.0.1", + "isomorphic-ws": "^4.0.1", + "lodash": "^4.16.4", + "lru-cache": "^7.14.0", + "native-duplexpair": "^1.0.0", + "pac-proxy-agent": "^7.0.0", + "parse-multipart-data": "^1.4.0", + "performance-now": "^2.1.0", + "portfinder": "^1.0.32", + "read-tls-client-hello": "^1.1.0", + "semver": "^7.5.3", + "socks-proxy-agent": "^7.0.0", + "typed-error": "^3.0.2", + "urlpattern-polyfill": "^8.0.0", + "ws": "^8.8.0" }, "bin": { - "nypm": "dist/cli.mjs" + "mockttp": "dist/admin/admin-bin.js" }, "engines": { - "node": "^14.16.0 || >=16.10.0" + "node": ">=20.0.0" } }, - "node_modules/ob1": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", - "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", + "node_modules/mockttp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "flow-enums-runtime": "^0.0.6" + "debug": "4" }, "engines": { - "node": ">=20.19.4" + "node": ">= 6.0.0" } }, - "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==", + "node_modules/mockttp/node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10.6.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/mockttp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { "node": ">= 6" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", + "node_modules/mockttp/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "node_modules/mockttp/node_modules/urlpattern-polyfill": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", + "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", + "dev": true, + "license": "MIT" }, - "node_modules/object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/monaco-editor": { + "version": "0.52.2", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "license": "MIT" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=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==", + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "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": ">=10" } }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "dev": true, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" }, - "engines": { - "node": ">= 0.8" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "node_modules/multitars": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/multitars/-/multitars-0.2.4.tgz", + "integrity": "sha512-XgLbg1HHchFauMCQPRwMj6MSyDd5koPlTA1hM3rUFkeXzGpjU/I9fP3to7yrObE9jcN8ChIOQGrM0tV0kUZaKg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } + "peer": true }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/mysql2": { + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", + "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", + "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.0", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8.0" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=12" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "lru.min": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/ora/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/nan": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", + "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "optional": true + }, + "node_modules/nanoid": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.7.tgz", + "integrity": "sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": ">=4" + "node": "^18 || >=20" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/native-duplexpair": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", + "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "1.1.3" + "engines": { + "node": ">= 0.6" } }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT", - "peer": true + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" }, - "node_modules/ora/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4.0" } }, - "node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/nock": { + "version": "14.0.11", + "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.11.tgz", + "integrity": "sha512-u5xUnYE+UOOBA6SpELJheMCtj2Laqx15Vl70QxKo43Wz/6nMHXS7PrEioXLjXAwhmawdEMNImwKCcPhBJWbKVw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-regex": "^4.1.0" + "@mswjs/interceptors": "^0.41.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=18.20.0 <20 || >=20.12.1" } }, - "node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/node-abi": { + "version": "3.89.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", "license": "MIT", - "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/otel": { - "resolved": "packages/otel", - "link": true - }, - "node_modules/otel-proxy": { - "resolved": "apps/otel-proxy", - "link": true - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, - "license": "MIT" - }, - "node_modules/oxc-parser": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.94.0.tgz", - "integrity": "sha512-refms9HQoAlTYIazONYkuX5A3rFGPddbD6Otyc+A0/pj1WTttR8TsZRlMzQxCfhexxfrbinqd7ebkEoYNuCmLQ==", + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "license": "MIT", "dependencies": { - "@oxc-project/types": "^0.94.0" + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-parser/binding-android-arm64": "0.94.0", - "@oxc-parser/binding-darwin-arm64": "0.94.0", - "@oxc-parser/binding-darwin-x64": "0.94.0", - "@oxc-parser/binding-freebsd-x64": "0.94.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.94.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.94.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.94.0", - "@oxc-parser/binding-linux-arm64-musl": "0.94.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.94.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.94.0", - "@oxc-parser/binding-linux-x64-gnu": "0.94.0", - "@oxc-parser/binding-linux-x64-musl": "0.94.0", - "@oxc-parser/binding-wasm32-wasi": "0.94.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.94.0", - "@oxc-parser/binding-win32-x64-msvc": "0.94.0" + "node": ">=18" } }, - "node_modules/oxlint": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.50.0.tgz", - "integrity": "sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==", - "dev": true, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" + "dependencies": { + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" + "node": "4.x || >=6.0.0" }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.50.0", - "@oxlint/binding-android-arm64": "1.50.0", - "@oxlint/binding-darwin-arm64": "1.50.0", - "@oxlint/binding-darwin-x64": "1.50.0", - "@oxlint/binding-freebsd-x64": "1.50.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.50.0", - "@oxlint/binding-linux-arm-musleabihf": "1.50.0", - "@oxlint/binding-linux-arm64-gnu": "1.50.0", - "@oxlint/binding-linux-arm64-musl": "1.50.0", - "@oxlint/binding-linux-ppc64-gnu": "1.50.0", - "@oxlint/binding-linux-riscv64-gnu": "1.50.0", - "@oxlint/binding-linux-riscv64-musl": "1.50.0", - "@oxlint/binding-linux-s390x-gnu": "1.50.0", - "@oxlint/binding-linux-x64-gnu": "1.50.0", - "@oxlint/binding-linux-x64-musl": "1.50.0", - "@oxlint/binding-openharmony-arm64": "1.50.0", - "@oxlint/binding-win32-arm64-msvc": "1.50.0", - "@oxlint/binding-win32-ia32-msvc": "1.50.0", - "@oxlint/binding-win32-x64-msvc": "1.50.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=0.14.1" + "peerDependencies": { + "encoding": "^0.1.0" }, "peerDependenciesMeta": { - "oxlint-tsgolint": { + "encoding": { "optional": true } } }, - "node_modules/oxlint-tsgolint": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.14.2.tgz", - "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", "dev": true, - "license": "MIT", - "bin": { - "tsgolint": "bin/tsgolint.js" - }, - "optionalDependencies": { - "@oxlint-tsgolint/darwin-arm64": "0.14.2", - "@oxlint-tsgolint/darwin-x64": "0.14.2", - "@oxlint-tsgolint/linux-arm64": "0.14.2", - "@oxlint-tsgolint/linux-x64": "0.14.2", - "@oxlint-tsgolint/win32-arm64": "0.14.2", - "@oxlint-tsgolint/win32-x64": "0.14.2" - } + "license": "MIT" }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "license": "MIT", + "node_modules/node-forge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "peer": true, "engines": { - "node": ">=12.20" + "node": ">= 6.13.0" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "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==", "license": "MIT", - "engines": { - "node": ">=4" + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "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==", + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "peer": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", "dependencies": { - "yocto-queue": "^0.1.0" + "abbrev": "1" }, - "engines": { - "node": ">=10" + "bin": { + "nopt": "bin/nopt.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "license": "MIT", - "engines": { - "node": ">=12.20" + "node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "node_modules/null-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" + "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": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/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==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { - "p-finally": "^1.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } + "peer": true }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "node_modules/nypm": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", + "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" + "citty": "^0.2.0", + "pathe": "^2.0.3", + "tinyexec": "^1.0.2" + }, + "bin": { + "nypm": "dist/cli.mjs" }, "engines": { - "node": ">= 14" + "node": ">=18" } }, - "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "node_modules/nypm/node_modules/citty": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz", + "integrity": "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ob1": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", + "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">= 14" + "node": ">=20.19.4" } }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/package-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/package-up/-/package-up-5.0.0.tgz", - "integrity": "sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA==", - "dev": true, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { - "find-up-simple": "^1.0.0" + "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": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">= 0.8" } }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-multipart-data": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/parse-multipart-data/-/parse-multipart-data-1.5.0.tgz", - "integrity": "sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==", - "dev": true, - "license": "MIT" - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", - "license": "ISC" + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } }, - "node_modules/parse-png": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", - "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "pngjs": "^3.3.0" + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/parse-prometheus-text-format": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-prometheus-text-format/-/parse-prometheus-text-format-1.1.1.tgz", - "integrity": "sha512-dBlhYVACjRdSqLMFe4/Q1l/Gd3UmXm8ruvsTi7J6ul3ih45AkzkVpI5XHV4aZ37juGZW5+3dGU5lwk+QLM9XJA==", - "license": "Apache-2.0", - "dependencies": { - "shallow-equal": "^1.2.0" + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "entities": "^4.5.0" + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "node_modules/ora/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "color-name": "1.1.3" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" + "node_modules/ora/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "peer": true }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/ora/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/ora/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" - }, - "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==", - "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==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" + "node_modules/otel": { + "resolved": "packages/otel", + "link": true }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, - "license": "MIT" + "node_modules/otel-proxy": { + "resolved": "apps/otel-proxy", + "link": true }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true, "license": "MIT" }, - "node_modules/pg": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "node_modules/oxc-parser": { + "version": "0.94.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.94.0.tgz", + "integrity": "sha512-refms9HQoAlTYIazONYkuX5A3rFGPddbD6Otyc+A0/pj1WTttR8TsZRlMzQxCfhexxfrbinqd7ebkEoYNuCmLQ==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", - "pg-types": "2.2.0", - "pgpass": "1.0.5" + "@oxc-project/types": "^0.94.0" }, "engines": { - "node": ">= 16.0.0" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "pg-cloudflare": "^1.2.7" + "@oxc-parser/binding-android-arm64": "0.94.0", + "@oxc-parser/binding-darwin-arm64": "0.94.0", + "@oxc-parser/binding-darwin-x64": "0.94.0", + "@oxc-parser/binding-freebsd-x64": "0.94.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.94.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.94.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.94.0", + "@oxc-parser/binding-linux-arm64-musl": "0.94.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.94.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.94.0", + "@oxc-parser/binding-linux-x64-gnu": "0.94.0", + "@oxc-parser/binding-linux-x64-musl": "0.94.0", + "@oxc-parser/binding-wasm32-wasi": "0.94.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.94.0", + "@oxc-parser/binding-win32-x64-msvc": "0.94.0" + } + }, + "node_modules/oxc-parser/node_modules/@oxc-project/types": { + "version": "0.94.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.94.0.tgz", + "integrity": "sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/oxlint": { + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.56.0.tgz", + "integrity": "sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" }, - "peerDependencies": { - "pg-native": ">=3.0.1" + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.56.0", + "@oxlint/binding-android-arm64": "1.56.0", + "@oxlint/binding-darwin-arm64": "1.56.0", + "@oxlint/binding-darwin-x64": "1.56.0", + "@oxlint/binding-freebsd-x64": "1.56.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.56.0", + "@oxlint/binding-linux-arm-musleabihf": "1.56.0", + "@oxlint/binding-linux-arm64-gnu": "1.56.0", + "@oxlint/binding-linux-arm64-musl": "1.56.0", + "@oxlint/binding-linux-ppc64-gnu": "1.56.0", + "@oxlint/binding-linux-riscv64-gnu": "1.56.0", + "@oxlint/binding-linux-riscv64-musl": "1.56.0", + "@oxlint/binding-linux-s390x-gnu": "1.56.0", + "@oxlint/binding-linux-x64-gnu": "1.56.0", + "@oxlint/binding-linux-x64-musl": "1.56.0", + "@oxlint/binding-openharmony-arm64": "1.56.0", + "@oxlint/binding-win32-arm64-msvc": "1.56.0", + "@oxlint/binding-win32-ia32-msvc": "1.56.0", + "@oxlint/binding-win32-x64-msvc": "1.56.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.15.0" }, "peerDependenciesMeta": { - "pg-native": { + "oxlint-tsgolint": { "optional": true } } }, - "node_modules/pg-cloudflare": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", + "node_modules/oxlint-tsgolint": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.17.0.tgz", + "integrity": "sha512-TdrKhDZCgEYqONFo/j+KvGan7/k3tP5Ouz88wCqpOvJtI2QmcLfGsm1fcMvDnTik48Jj6z83IJBqlkmK9DnY1A==", + "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", - "license": "MIT" - }, - "node_modules/pg-format": { - "name": "pg-format-fix", - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pg-format-fix/-/pg-format-fix-1.0.5.tgz", - "integrity": "sha512-HcXVy9Zk4kn87P0+U9XSxGtenNyknbPB87NreixSBk0lYJy89u+d/zQbS+f/aTTxABQ/B6FH1KdBB5EsGzRS2w==", - "engines": { - "node": ">=4.0" + "bin": { + "tsgolint": "bin/tsgolint.js" + }, + "optionalDependencies": { + "@oxlint-tsgolint/darwin-arm64": "0.17.0", + "@oxlint-tsgolint/darwin-x64": "0.17.0", + "@oxlint-tsgolint/linux-arm64": "0.17.0", + "@oxlint-tsgolint/linux-x64": "0.17.0", + "@oxlint-tsgolint/win32-arm64": "0.17.0", + "@oxlint-tsgolint/win32-x64": "0.17.0" } }, - "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", + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=12.20" } }, - "node_modules/pg-pool": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" + "engines": { + "node": ">=4" } }, - "node_modules/pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", - "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==", + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "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" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "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==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "p-limit": "^4.0.0" + }, "engines": { - "node": ">=8.6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pidusage": { + "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-4.0.0.tgz", - "integrity": "sha512-89hVJc5gq157puLYZaO3CH0qfGyDfbDG1KFCE4lCSwK0l1EuEbNa4pIJJXL93ltU5SsYia/DHJUgMY2qE4XRQg==", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", "dependencies": { - "safe-buffer": "^5.2.1" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pino": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.13.1.tgz", - "integrity": "sha512-Szuj+ViDTjKPQYiKumGmEn3frdl+ZPSdosHyt9SnUevFosOkMY2b7ipxlEctNKPmMD/VibeBI+ZcZCJK+4DPuw==", + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "license": "MIT", "dependencies": { - "atomic-sleep": "^1.0.0", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^5.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "slow-redact": "^0.3.0", - "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" }, - "bin": { - "pino": "bin.js" + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pino-abstract-transport": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "license": "MIT", "dependencies": { - "split2": "^4.0.0" + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/pixelmatch": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", - "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "pngjs": "^7.0.0" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, - "bin": { - "pixelmatch": "bin/pixelmatch" + "engines": { + "node": ">= 14" } }, - "node_modules/pixelmatch/node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, "engines": { - "node": ">=14.19.0" + "node": ">= 14" } }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", "license": "MIT", "dependencies": { - "find-up": "^6.3.0" + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" }, "engines": { "node": ">=14.16" @@ -30421,65 +33019,131 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/package-up/-/package-up-5.0.0.tgz", + "integrity": "sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/playwright": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", - "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", - "license": "Apache-2.0", + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", "dependencies": { - "playwright-core": "1.53.2" - }, - "bin": { - "playwright": "cli.js" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" }, "engines": { - "node": ">=18" + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" }, - "optionalDependencies": { - "fsevents": "2.3.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/playwright-core": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz", - "integrity": "sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==", - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-multipart-data": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/parse-multipart-data/-/parse-multipart-data-1.5.0.tgz", + "integrity": "sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse-png": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", + "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" + "pngjs": "^3.3.0" }, "engines": { - "node": ">=10.4.0" + "node": ">=10" } }, - "node_modules/pngjs": { + "node_modules/parse-png/node_modules/pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", @@ -30490,33 +33154,568 @@ "node": ">=4.0.0" } }, - "node_modules/portfinder": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", - "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", - "dev": true, + "node_modules/parse-prometheus-text-format": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-prometheus-text-format/-/parse-prometheus-text-format-1.1.1.tgz", + "integrity": "sha512-dBlhYVACjRdSqLMFe4/Q1l/Gd3UmXm8ruvsTi7J6ul3ih45AkzkVpI5XHV4aZ37juGZW5+3dGU5lwk+QLM9XJA==", + "license": "Apache-2.0", + "dependencies": { + "shallow-equal": "^1.2.0" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "async": "^3.2.6", - "debug": "^4.3.6" + "entities": "^6.0.0" }, - "engines": { - "node": ">= 10.12" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "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==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "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==", + "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==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "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.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", + "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.12.0", + "pg-pool": "^3.13.0", + "pg-protocol": "^1.13.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", + "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", + "license": "MIT" + }, + "node_modules/pg-format": { + "name": "pg-format-fix", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pg-format-fix/-/pg-format-fix-1.0.5.tgz", + "integrity": "sha512-HcXVy9Zk4kn87P0+U9XSxGtenNyknbPB87NreixSBk0lYJy89u+d/zQbS+f/aTTxABQ/B6FH1KdBB5EsGzRS2w==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "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-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-pool": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", + "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", + "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", + "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.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidusage": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-4.0.1.tgz", + "integrity": "sha512-yCH2dtLHfEBnzlHUJymR/Z1nN2ePG3m392Mv8TFlTP1B0xkpMQNHAnfkY0n2tAi6ceKO6YWhxYfZ96V4vVkh/g==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pidusage/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pino": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", + "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pkijs": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", + "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "funding": [ { "type": "opencollective", @@ -30546,6 +33745,7 @@ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -30580,6 +33780,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -30595,6 +33796,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -30614,6 +33816,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -30633,6 +33836,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -30686,6 +33890,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -30705,6 +33910,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -30724,6 +33930,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -30743,6 +33950,7 @@ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -30825,6 +34033,7 @@ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -30845,6 +34054,7 @@ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -30860,6 +34070,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -30875,6 +34086,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -30889,6 +34101,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" } @@ -30898,6 +34111,7 @@ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -30914,6 +34128,7 @@ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -30933,6 +34148,7 @@ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -30950,15 +34166,43 @@ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" } }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, "node_modules/postcss-lab-function": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -30975,30 +34219,44 @@ } }, "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.1.1" }, "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">= 18" }, "peerDependencies": { + "jiti": ">=1.21.0", "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { + "jiti": { + "optional": true + }, "postcss": { "optional": true }, - "ts-node": { + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } @@ -31030,6 +34288,7 @@ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -31042,6 +34301,7 @@ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -31249,20 +34509,27 @@ } }, "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^6.1.1" }, "engines": { "node": ">=12.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.2.14" } @@ -31272,6 +34539,7 @@ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -31435,6 +34703,7 @@ "url": "https://liberapay.com/mrcgrtz" } ], + "license": "MIT", "engines": { "node": "^12 || ^14 || >=16" }, @@ -31463,6 +34732,7 @@ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -31481,6 +34751,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", "peerDependencies": { "postcss": "^8" } @@ -31490,6 +34761,7 @@ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -31509,6 +34781,7 @@ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-cascade-layers": "^1.1.1", "@csstools/postcss-color-function": "^1.1.1", @@ -31576,6 +34849,7 @@ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -31640,6 +34914,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" } @@ -31649,6 +34924,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -31725,7 +35001,8 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/postcss-zindex": { "version": "6.0.2", @@ -31739,6 +35016,24 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/postgres": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", @@ -31762,9 +35057,9 @@ } }, "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "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" @@ -31791,17 +35086,26 @@ "node": ">=0.10.0" } }, + "node_modules/postgres-range": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", + "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", + "dev": true, + "license": "MIT" + }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -31831,20 +35135,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -31870,19 +35160,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/pretty-ms": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", @@ -31921,17 +35198,17 @@ } }, "node_modules/prisma": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", - "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.5.0.tgz", + "integrity": "sha512-n30qZpWehaYQzigLjmuPisyEsvOzHt7bZeRyg8gZ5DvJo9FGjD+gNaY59Ns3hlLD5/jZH5GBeftIss0jDbUoLg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "7.2.0", - "@prisma/dev": "0.17.0", - "@prisma/engines": "7.2.0", - "@prisma/studio-core": "0.9.0", + "@prisma/config": "7.5.0", + "@prisma/dev": "0.20.0", + "@prisma/engines": "7.5.0", + "@prisma/studio-core": "0.21.1", "mysql2": "3.15.3", "postgres": "3.4.7" }, @@ -31978,6 +35255,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -31985,7 +35263,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/process-tracker": { "resolved": "tools/process-tracker", @@ -32037,6 +35316,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -32045,14 +35325,6 @@ "node": ">= 6" } }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -32085,6 +35357,7 @@ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", @@ -32096,6 +35369,7 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -32105,6 +35379,7 @@ "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.3.0.tgz", "integrity": "sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==", "dev": true, + "license": "MIT", "dependencies": { "mkdirp": "^1.0.4" }, @@ -32117,9 +35392,9 @@ } }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "license": "MIT", "funding": { "type": "github", @@ -32133,9 +35408,9 @@ "license": "ISC" }, "node_modules/protobufjs": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", - "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -32179,9 +35454,10 @@ } }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -32207,9 +35483,9 @@ } }, "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" @@ -32235,13 +35511,13 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/pvtsutils": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.8.1" @@ -32251,26 +35527,15 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "dev": true, "license": "MIT", "engines": { "node": ">=16.0.0" } }, - "node_modules/qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true, - "peer": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -32310,12 +35575,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", @@ -32371,39 +35638,11 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -32418,6 +35657,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -32494,9 +35734,9 @@ } }, "node_modules/react-dropzone": { - "version": "14.3.8", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.8.tgz", - "integrity": "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==", + "version": "14.4.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.4.1.tgz", + "integrity": "sha512-QDuV76v3uKbHiH34SpwifZ+gOLi1+RdsCO1kl5vxMT4wW8R82+sthjvBw4th3NHF/XX6FBsqDYZVNN+pnhaw0g==", "license": "MIT", "dependencies": { "attr-accept": "^2.2.4", @@ -32583,11 +35823,13 @@ } }, "node_modules/react-markdown": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", - "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", @@ -32619,9 +35861,9 @@ } }, "node_modules/react-resizable-panels": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.4.tgz", - "integrity": "sha512-8Y4KNgV94XhUvI2LeByyPIjoUJb71M/0hyhtzkHaqpVHs+ZQs8b627HmzyhmVYi3C9YP6R+XD1KmG7hHjEZXFQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.6.tgz", + "integrity": "sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==", "license": "MIT", "peerDependencies": { "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", @@ -32679,15 +35921,6 @@ "react": ">=15" } }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, "node_modules/react-router/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -32695,9 +35928,10 @@ "license": "MIT" }, "node_modules/react-textarea-autosize": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", - "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", + "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", @@ -32707,7 +35941,7 @@ "node": ">=10" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-toastify": { @@ -32728,6 +35962,7 @@ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -32748,6 +35983,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -32767,6 +36003,13 @@ "minimatch": "^5.1.0" } }, + "node_modules/readdir-glob/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/readdir-glob/node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -32778,9 +36021,9 @@ } }, "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -32791,20 +36034,23 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", "engines": { "node": ">= 12.13.0" } @@ -32880,7 +36126,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true, "license": "Apache-2.0" }, "node_modules/regenerate": { @@ -32902,10 +36147,12 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/regexp-to-ast": { "version": "0.5.0", @@ -32918,6 +36165,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -32940,12 +36188,12 @@ } }, "node_modules/registry-auth-token": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.3.tgz", - "integrity": "sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "@pnpm/npm-conf": "^3.0.2" }, "engines": { "node": ">=14" @@ -32988,6 +36236,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", @@ -33017,6 +36266,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-sanitize": "^5.0.0" @@ -33027,9 +36277,9 @@ } }, "node_modules/rehype-video": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rehype-video/-/rehype-video-2.3.0.tgz", - "integrity": "sha512-wBt/TIpSMQf6U2vH9bNij435fCYdIj/Prt0dMqexP0rk+Ix6nT8beQyu3XYXd7qLIOassHAbBBJxfZgwG+zL9A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/rehype-video/-/rehype-video-2.3.1.tgz", + "integrity": "sha512-KnDlv9s2KpsI1B9/HGMpe49GDRpfXjJZhQTiSuvsLlYSSmdUDqAhojdprQLms4d3SmQty4jysSy3abGkX1aQcA==", "dev": true, "license": "MIT", "dependencies": { @@ -33101,9 +36351,10 @@ } }, "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -33135,6 +36386,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -33147,9 +36399,10 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -33166,6 +36419,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -33177,13 +36431,13 @@ } }, "node_modules/remeda": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.21.3.tgz", - "integrity": "sha512-XXrZdLA10oEOQhLLzEJEiFFSKi21REGAkHdImIb4rt/XXy8ORGXh5HCcpUOsElfPNDb+X6TA/+wkh+p2KffYmg==", + "version": "2.33.4", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.33.4.tgz", + "integrity": "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^4.39.1" + "funding": { + "url": "https://github.com/sponsors/remeda" } }, "node_modules/renderkid": { @@ -33311,6 +36565,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -33319,6 +36574,7 @@ "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" } @@ -33327,6 +36583,7 @@ "version": "7.5.2", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", @@ -33344,32 +36601,6 @@ "node": "*" } }, - "node_modules/requireg": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", - "dev": true, - "peer": true, - "dependencies": { - "nested-error-stacks": "~2.0.1", - "rc": "~1.2.7", - "resolve": "~1.7.1" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/requireg/node_modules/resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "path-parse": "^1.0.5" - } - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -33403,38 +36634,10 @@ "license": "MIT" }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global/node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", - "peer": true, - "dependencies": { - "ini": "^1.3.4" - }, "engines": { "node": ">=4" } @@ -33449,29 +36652,19 @@ "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/resolve-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", - "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz", + "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", "dev": true, "license": "MIT", "peer": true }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/responselike": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", @@ -33531,6 +36724,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "license": "MIT", "engines": { "node": ">=10" } @@ -33545,23 +36739,27 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -33572,11 +36770,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -33593,11 +36807,65 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", + "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.115.0", + "@rolldown/pluginutils": "1.0.0-rc.9" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-x64": "1.0.0-rc.9", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", + "license": "MIT" + }, "node_modules/rollup": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", - "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33609,36 +36877,34 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.46.2", - "@rollup/rollup-android-arm64": "4.46.2", - "@rollup/rollup-darwin-arm64": "4.46.2", - "@rollup/rollup-darwin-x64": "4.46.2", - "@rollup/rollup-freebsd-arm64": "4.46.2", - "@rollup/rollup-freebsd-x64": "4.46.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", - "@rollup/rollup-linux-arm-musleabihf": "4.46.2", - "@rollup/rollup-linux-arm64-gnu": "4.46.2", - "@rollup/rollup-linux-arm64-musl": "4.46.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", - "@rollup/rollup-linux-ppc64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-musl": "4.46.2", - "@rollup/rollup-linux-s390x-gnu": "4.46.2", - "@rollup/rollup-linux-x64-gnu": "4.46.2", - "@rollup/rollup-linux-x64-musl": "4.46.2", - "@rollup/rollup-win32-arm64-msvc": "4.46.2", - "@rollup/rollup-win32-ia32-msvc": "4.46.2", - "@rollup/rollup-win32-x64-msvc": "4.46.2", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" - }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -33687,28 +36953,16 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.1.0", @@ -33728,17 +36982,32 @@ } }, "node_modules/safe-regex2": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-4.0.0.tgz", - "integrity": "sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.0.tgz", + "integrity": "sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw==", + "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/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", "engines": { "node": ">=10" } @@ -33746,25 +37015,16 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=v12.22.7" + "node": ">=11.0.0" } }, "node_modules/scheduler": { @@ -33783,9 +37043,9 @@ "license": "Apache-2.0" }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -33801,22 +37061,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "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/schema-utils/node_modules/ajv-formats": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", @@ -33834,24 +37078,6 @@ } } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/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/search-insights": { "version": "2.17.3", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", @@ -33895,22 +37121,22 @@ "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "license": "MIT", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -33935,24 +37161,24 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -33973,15 +37199,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -34018,19 +37235,21 @@ } }, "node_modules/seroval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", - "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.1.tgz", + "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/seroval-plugins": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.1.1.tgz", - "integrity": "sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.1.tgz", + "integrity": "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -34039,20 +37258,48 @@ } }, "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "mime-types": "2.1.18", - "minimatch": "3.1.2", + "minimatch": "3.1.5", "path-is-inside": "1.0.2", "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, + "node_modules/serve-handler/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/serve-handler/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", @@ -34060,21 +37307,25 @@ "license": "MIT" }, "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "license": "MIT", "dependencies": { - "accepts": "~1.3.4", + "accepts": "~1.3.8", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" }, "engines": { "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-index/node_modules/debug": { @@ -34096,25 +37347,41 @@ } }, "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "license": "MIT", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", @@ -34122,12 +37389,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" - }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -34138,15 +37399,15 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -34159,9 +37420,10 @@ "license": "ISC" }, "node_modules/set-cookie-parser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", - "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" }, "node_modules/set-function-length": { "version": "1.2.2", @@ -34218,6 +37480,7 @@ "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" }, @@ -34229,6 +37492,7 @@ "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" } @@ -34327,7 +37591,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" }, "node_modules/simple-concat": { "version": "1.0.1", @@ -34346,7 +37611,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/simple-get": { "version": "4.0.1", @@ -34366,6 +37632,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -34376,6 +37643,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/simple-oauth2/-/simple-oauth2-5.1.0.tgz", "integrity": "sha512-gWDa38Ccm4MwlG5U7AlcJxPv3lvr80dU7ARJWrGdgvOKyzSj1gr3GBPN1rABTedAYvC/LsGYoFuFxwDBPtGEbw==", + "license": "Apache-2.0", "dependencies": { "@hapi/hoek": "^11.0.4", "@hapi/wreck": "^18.0.0", @@ -34383,6 +37651,12 @@ "joi": "^17.6.4" } }, + "node_modules/simple-oauth2/node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "license": "BSD-3-Clause" + }, "node_modules/simple-plist": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", @@ -34414,12 +37688,13 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" }, "node_modules/sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", + "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", "license": "MIT", "dependencies": { "@types/node": "^17.0.5", @@ -34441,12 +37716,6 @@ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", "license": "MIT" }, - "node_modules/sitemap/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, "node_modules/skin-tone": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", @@ -34463,20 +37732,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/slow-redact": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/slow-redact/-/slow-redact-0.3.2.tgz", - "integrity": "sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==", - "license": "MIT" - }, "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.8.tgz", + "integrity": "sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA==", "dev": true, "license": "MIT", "peer": true, @@ -34499,6 +37763,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -34559,15 +37824,15 @@ } }, "node_modules/solid-js": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", - "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", + "version": "1.9.11", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.11.tgz", + "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.1.0", - "seroval": "^1.1.0", - "seroval-plugins": "^1.1.0" + "seroval": "~1.5.0", + "seroval-plugins": "~1.5.0" } }, "node_modules/solid-refresh": { @@ -34586,9 +37851,10 @@ } }, "node_modules/sonic-boom": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", - "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -34615,6 +37881,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -34689,6 +37956,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { "node": ">= 10.x" } @@ -34730,6 +37998,7 @@ "resolved": "https://registry.npmjs.org/ssh-remote-port-forward/-/ssh-remote-port-forward-1.0.4.tgz", "integrity": "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ssh2": "^0.5.48", "ssh2": "^1.4.0" @@ -34740,15 +38009,16 @@ "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/ssh2-streams": "*" } }, "node_modules/ssh2": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.15.0.tgz", - "integrity": "sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz", + "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -34759,8 +38029,8 @@ "node": ">=10.16.0" }, "optionalDependencies": { - "cpu-features": "~0.0.9", - "nan": "^2.18.0" + "cpu-features": "~0.0.10", + "nan": "^2.23.0" } }, "node_modules/stack-utils": { @@ -34835,17 +38105,19 @@ "license": "MIT" }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, "license": "MIT" }, "node_modules/stream-buffers": { @@ -34862,7 +38134,8 @@ "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" }, "node_modules/streamx": { "version": "2.23.0", @@ -34887,10 +38160,31 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -34902,16 +38196,20 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -34920,6 +38218,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -34929,10 +38228,45 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/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/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -34960,6 +38294,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -34973,6 +38308,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -35002,6 +38338,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -35010,9 +38347,9 @@ } }, "node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", "funding": [ { "type": "github", @@ -35091,20 +38428,24 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-hyperlinks": { @@ -35122,10 +38463,25 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -35136,21 +38492,22 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" }, "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.0.0", + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo" @@ -35172,19 +38529,6 @@ "node": ">= 10" } }, - "node_modules/swr": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.7.tgz", - "integrity": "sha512-ZEquQ82QvalqTxhBVv/DlAg2mbmUjF4UgpPg9wwk4ufb9rQnZXh1iKyyKBqV6bQGu1Ie7L1QwSYO07qFIa1p+g==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -35195,22 +38539,17 @@ "node": ">=0.10.0" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "license": "MIT" }, "node_modules/table-layout": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", + "license": "MIT", "dependencies": { "array-back": "^6.2.2", "wordwrapjs": "^5.1.0" @@ -35220,33 +38559,34 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, + "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", - "chokidar": "^3.5.3", + "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.3.0", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", @@ -35256,56 +38596,88 @@ "node": ">=14.0.0" } }, - "node_modules/tailwindcss/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/tailwindcss/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==", + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=10.13.0" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/tailwindcss/node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "node_modules/tailwindcss/node_modules/chokidar/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": { - "camelcase-css": "^2.0.1" + "is-glob": "^4.0.1" }, "engines": { - "node": "^12 || ^14 || >= 16" + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" }, - "peerDependencies": { - "postcss": "^8.4.21" + "engines": { + "node": ">=8.10.0" } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -35335,6 +38707,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -35364,15 +38737,20 @@ "node": ">=8" } }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/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", - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "streamx": "^2.12.5" } }, "node_modules/terminal-link": { @@ -35394,13 +38772,13 @@ } }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", + "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -35412,15 +38790,14 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -35459,19 +38836,83 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/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", + "peer": true + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "*" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/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", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/testcontainers": { @@ -35498,16 +38939,25 @@ "undici": "^5.29.0" } }, - "node_modules/testcontainers/node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "dev": true + "node_modules/testcontainers/node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/testcontainers/node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", "dev": true, "license": "MIT", "dependencies": { @@ -35520,13 +38970,14 @@ } }, "node_modules/testcontainers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", "dev": true, "license": "MIT", "dependencies": { "b4a": "^1.6.4", + "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } @@ -35545,20 +38996,36 @@ } }, "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "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/text-decoder/node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -35568,6 +39035,7 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, + "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -35592,11 +39060,15 @@ } }, "node_modules/thread-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.0.2.tgz", - "integrity": "sha512-cBL4xF2A3lSINV4rD5tyqnKH4z/TgWPvT+NaVhJDSwK962oo/Ye7cHSMbDzwcu7tAE1SfU6Q4XtV6Hucmi6Hlw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", + "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", + "license": "MIT", "dependencies": { "real-require": "^0.2.0" + }, + "engines": { + "node": ">=20" } }, "node_modules/throat": { @@ -35607,18 +39079,6 @@ "license": "MIT", "peer": true }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -35660,9 +39120,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true, "license": "MIT", "engines": { @@ -35685,35 +39145,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/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/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinypool": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", @@ -35724,35 +39155,15 @@ } }, "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" } }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, - "license": "MIT" - }, "node_modules/tmp": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", @@ -35787,6 +39198,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", "engines": { "node": ">=12" } @@ -35800,6 +39212,14 @@ "node": ">=0.6" } }, + "node_modules/toqr": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz", + "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -35835,6 +39255,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -35844,6 +39265,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -35853,7 +39275,8 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/ts-morph": { "version": "12.0.0", @@ -35869,6 +39292,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -35907,10 +39331,17 @@ } } }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -35921,27 +39352,6 @@ "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", "license": "Apache-2.0" }, - "node_modules/tsconfck": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz", - "integrity": "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -35967,482 +39377,10 @@ "fsevents": "~2.3.3" } }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/tsx/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/tsyringe": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "dev": true, "license": "MIT", "dependencies": { "tslib": "^1.9.3" @@ -36455,13 +39393,13 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, "license": "0BSD" }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -36470,27 +39408,27 @@ } }, "node_modules/turbo": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.4.4.tgz", - "integrity": "sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.8.17.tgz", + "integrity": "sha512-YwPsNSqU2f/RXU/+Kcb7cPkPZARxom4+me7LKEdN5jsvy2tpfze3zDZ4EiGrJnvOm9Avu9rK0aaYsP7qZ3iz7A==", "dev": true, "license": "MIT", "bin": { "turbo": "bin/turbo" }, "optionalDependencies": { - "turbo-darwin-64": "2.4.4", - "turbo-darwin-arm64": "2.4.4", - "turbo-linux-64": "2.4.4", - "turbo-linux-arm64": "2.4.4", - "turbo-windows-64": "2.4.4", - "turbo-windows-arm64": "2.4.4" + "turbo-darwin-64": "2.8.17", + "turbo-darwin-arm64": "2.8.17", + "turbo-linux-64": "2.8.17", + "turbo-linux-arm64": "2.8.17", + "turbo-windows-64": "2.8.17", + "turbo-windows-arm64": "2.8.17" } }, "node_modules/turbo-darwin-64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.4.4.tgz", - "integrity": "sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.8.17.tgz", + "integrity": "sha512-ZFkv2hv7zHpAPEXBF6ouRRXshllOavYc+jjcrYyVHvxVTTwJWsBZwJ/gpPzmOKGvkSjsEyDO5V6aqqtZzwVF+Q==", "cpu": [ "x64" ], @@ -36502,9 +39440,9 @@ ] }, "node_modules/turbo-darwin-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.4.4.tgz", - "integrity": "sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.8.17.tgz", + "integrity": "sha512-5DXqhQUt24ycEryXDfMNKEkW5TBHs+QmU23a2qxXwwFDaJsWcPo2obEhBxxdEPOv7qmotjad+09RGeWCcJ9JDw==", "cpu": [ "arm64" ], @@ -36516,9 +39454,9 @@ ] }, "node_modules/turbo-linux-64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.4.4.tgz", - "integrity": "sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.8.17.tgz", + "integrity": "sha512-KLUbz6w7F73D/Ihh51hVagrKR0/CTsPEbRkvXLXvoND014XJ4BCrQUqSxlQ4/hu+nqp1v5WlM85/h3ldeyujuA==", "cpu": [ "x64" ], @@ -36530,9 +39468,9 @@ ] }, "node_modules/turbo-linux-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.4.4.tgz", - "integrity": "sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.8.17.tgz", + "integrity": "sha512-pJK67XcNJH40lTAjFu7s/rUlobgVXyB3A3lDoq+/JccB3hf+SysmkpR4Itlc93s8LEaFAI4mamhFuTV17Z6wOg==", "cpu": [ "arm64" ], @@ -36544,9 +39482,9 @@ ] }, "node_modules/turbo-windows-64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.4.4.tgz", - "integrity": "sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.8.17.tgz", + "integrity": "sha512-EijeQ6zszDMmGZLP2vT2RXTs/GVi9rM0zv2/G4rNu2SSRSGFapgZdxgW4b5zUYLVaSkzmkpWlGfPfj76SW9yUg==", "cpu": [ "x64" ], @@ -36558,9 +39496,9 @@ ] }, "node_modules/turbo-windows-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.4.4.tgz", - "integrity": "sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.8.17.tgz", + "integrity": "sha512-crpfeMPkfECd4V1PQ/hMoiyVcOy04+bWedu/if89S15WhOalHZ2BYUi6DOJhZrszY+mTT99OwpOsj4wNfb/GHQ==", "cpu": [ "arm64" ], @@ -36575,7 +39513,8 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/type-detect": { "version": "4.0.8", @@ -36589,13 +39528,12 @@ } }, "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=16" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -36636,9 +39574,9 @@ } }, "node_modules/typed-error": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typed-error/-/typed-error-3.2.2.tgz", - "integrity": "sha512-Z48LU67/qJ+vyA7lh3ozELqpTp3pvQoY5RtLi5wQ/UGSrEidBhlVSqhjr8B3iqbGpjqAoJYrtSYXWMDtidWGkA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/typed-error/-/typed-error-3.2.3.tgz", + "integrity": "sha512-xmXIbAyEOYeRg11jY3AzjyB9clkxVfzBlHs3JgD3N6vPMMVBX+xNtQft4pKb1oM9lASdTISA+pOj1EejFr2SgQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -36656,9 +39594,9 @@ } }, "node_modules/typedoc": { - "version": "0.28.15", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.15.tgz", - "integrity": "sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==", + "version": "0.28.17", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", + "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -36690,9 +39628,9 @@ } }, "node_modules/typedoc-plugin-markdown": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", - "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.10.0.tgz", + "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", "dev": true, "license": "MIT", "engines": { @@ -36702,6 +39640,13 @@ "typedoc": "0.28.x" } }, + "node_modules/typedoc/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/typedoc/node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -36713,13 +39658,13 @@ } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -36729,11 +39674,10 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -36743,9 +39687,10 @@ } }, "node_modules/typical": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.2.0.tgz", - "integrity": "sha512-W1+HdVRUl8fS3MZ9ogD51GOb46xMmhAZzR0WPw5jcgIZQJVvkddYzAl4YTU6g5w33Y1iRQLdIi2/1jhi2RNL0g==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "license": "MIT", "engines": { "node": ">=12.17" } @@ -36770,10 +39715,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -36829,6 +39773,7 @@ "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -36843,17 +39788,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unified/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", @@ -36870,9 +39804,10 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -36885,6 +39820,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -36910,6 +39846,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -36919,9 +39856,10 @@ } }, "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -36933,9 +39871,10 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -36946,9 +39885,19 @@ } }, "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" + "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/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } }, "node_modules/unpipe": { "version": "1.0.0", @@ -36960,9 +39909,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -37017,30 +39966,6 @@ "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "node_modules/update-notifier/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/update-notifier/node_modules/boxen": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", @@ -37075,97 +40000,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/update-notifier/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==", - "license": "MIT" - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -37189,6 +40036,37 @@ } } }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/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==", + "license": "MIT" + }, "node_modules/url-loader/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -37244,17 +40122,24 @@ "license": "MIT" }, "node_modules/use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", + "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/use-debounce": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.4.tgz", - "integrity": "sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.1.0.tgz", + "integrity": "sha512-lu87Za35V3n/MyMoEpD5zJv0k7hCn0p+V/fK2kWD+3k2u3kOCwO593UArbczg1fhfs2rqPEnHpULJ3KmGdDzvg==", + "license": "MIT", "engines": { "node": ">= 16.0.0" }, @@ -37263,11 +40148,12 @@ } }, "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -37276,14 +40162,15 @@ } }, "node_modules/use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", + "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", + "license": "MIT", "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -37292,18 +40179,18 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/usehooks-ts": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-3.1.0.tgz", - "integrity": "sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-3.1.1.tgz", + "integrity": "sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA==", "license": "MIT", "dependencies": { "lodash.debounce": "^4.0.8" @@ -37312,7 +40199,7 @@ "node": ">=16.15.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" + "react": "^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "node_modules/util": { @@ -37331,7 +40218,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", @@ -37369,7 +40257,8 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" }, "node_modules/valibot": { "version": "1.2.0", @@ -37386,13 +40275,6 @@ } } }, - "node_modules/validate-html-nesting": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/validate-html-nesting/-/validate-html-nesting-1.2.3.tgz", - "integrity": "sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==", - "dev": true, - "license": "ISC" - }, "node_modules/validate-npm-package-name": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", @@ -37437,6 +40319,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" @@ -37450,6 +40333,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -37460,9 +40344,10 @@ } }, "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -37473,21 +40358,23 @@ } }, "node_modules/vite": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", - "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", - "dev": true, + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" + "@oxc-project/runtime": "0.115.0", + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.9", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -37496,14 +40383,15 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.0.0-alpha.31", + "esbuild": "^0.27.0", "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "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" @@ -37512,13 +40400,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { @@ -37545,9 +40436,9 @@ } }, "node_modules/vite-bundle-analyzer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-1.3.1.tgz", - "integrity": "sha512-39J8a+d1KTi9fPt0a7MqqEJibMekdIDCW2nohiyQPSiww+xEBRHKSX4fdpwSvia9KDiFg7THjQRTs0xefzB+lg==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-1.3.6.tgz", + "integrity": "sha512-elFXkF9oGy4CJEeOdP1DSEHRDKWfmaEDfT9/GuF4jmyfmUF6nC//iN+ythqMEVvrtchOEHGKLumZwnu1NjoI0w==", "dev": true, "license": "MIT", "bin": { @@ -37555,9 +40446,9 @@ } }, "node_modules/vite-plugin-solid": { - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.7.tgz", - "integrity": "sha512-5TgK1RnE449g0Ryxb9BXqem89RSy7fE8XGVCo+Gw84IHgPuPVP7nYNP6WBVAaY/0xw+OqfdQee+kusL0y3XYNg==", + "version": "2.11.11", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.11.tgz", + "integrity": "sha512-YMZCXsLw9kyuvQFEdwLP27fuTQJLmjNoHy90AOJnbRuJ6DwShUxKFo38gdFrWn9v11hnGicKCZEaeI/TFs6JKw==", "dev": true, "license": "MIT", "dependencies": { @@ -37571,7 +40462,7 @@ "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@testing-library/jest-dom": { @@ -37594,32 +40485,19 @@ "vite": ">=2.6.0" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vitefu": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.7.tgz", - "integrity": "sha512-eRWXLBbJjW3X5z5P5IHcSm2yYbYRPb2kQuc+oqsbAl99WB5kVsPbiiox+cymo8twTzifA6itvhr2CmjnaZZp0Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", "dev": true, "license": "MIT", "workspaces": [ "tests/deps/*", - "tests/projects/*" + "tests/projects/*", + "tests/projects/workspace/packages/*" ], "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" }, "peerDependenciesMeta": { "vite": { @@ -37628,31 +40506,31 @@ } }, "node_modules/vitest": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz", - "integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.15", - "@vitest/mocker": "4.0.15", - "@vitest/pretty-format": "4.0.15", - "@vitest/runner": "4.0.15", - "@vitest/snapshot": "4.0.15", - "@vitest/spy": "4.0.15", - "@vitest/utils": "4.0.15", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", + "@vitest/expect": "4.1.0", + "@vitest/mocker": "4.1.0", + "@vitest/pretty-format": "4.1.0", + "@vitest/runner": "4.1.0", + "@vitest/snapshot": "4.1.0", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "std-env": "^3.10.0", + "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -37668,12 +40546,13 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.15", - "@vitest/browser-preview": "4.0.15", - "@vitest/browser-webdriverio": "4.0.15", - "@vitest/ui": "4.0.15", + "@vitest/browser-playwright": "4.1.0", + "@vitest/browser-preview": "4.1.0", + "@vitest/browser-webdriverio": "4.1.0", + "@vitest/ui": "4.1.0", "happy-dom": "*", - "jsdom": "*" + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -37702,22 +40581,12 @@ }, "jsdom": { "optional": true + }, + "vite": { + "optional": false } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", @@ -37726,19 +40595,6 @@ "license": "MIT", "peer": true }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -37751,9 +40607,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -37783,6 +40639,16 @@ "defaults": "^1.0.3" } }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -37790,34 +40656,36 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.105.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", + "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" @@ -37969,14 +40837,14 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", + "@types/express": "^4.17.25", "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", @@ -37986,9 +40854,9 @@ "bonjour-service": "^1.2.1", "chokidar": "^3.6.0", "colorette": "^2.0.10", - "compression": "^1.7.4", + "compression": "^1.8.1", "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", + "express": "^4.22.1", "graceful-fs": "^4.2.6", "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", @@ -37996,7 +40864,7 @@ "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", + "selfsigned": "^5.5.0", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -38025,6 +40893,30 @@ } } }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -38037,6 +40929,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/webpack-dev-server/node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", @@ -38055,6 +40959,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/webpack-merge": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", @@ -38070,20 +40998,14 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/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/webpack/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -38105,24 +41027,6 @@ "node": ">= 0.6" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpackbar": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", @@ -38145,6 +41049,43 @@ "webpack": "3 || 4 || 5" } }, + "node_modules/webpackbar/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpackbar/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/webpackbar/node_modules/markdown-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", @@ -38158,6 +41099,55 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/webpackbar/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/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -38181,32 +41171,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", @@ -38215,16 +41179,6 @@ "license": "MIT", "peer": true }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -38235,51 +41189,33 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/whatwg-url-without-unicode": { - "version": "8.0.0-3", - "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", - "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", + "node_modules/whatwg-url-minimum": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.1.tgz", + "integrity": "sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "buffer": "^5.4.3", - "punycode": "^2.1.1", - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/whatwg-url-without-unicode/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=8" - } + "peer": true }, "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { - "node-which": "bin/node-which" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 8" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -38323,69 +41259,39 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/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==", + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "string-width": "^5.0.1" }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/wildcard": { @@ -38394,26 +41300,19 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" }, - "node_modules/wonka": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", - "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/wordwrapjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", - "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", + "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", + "license": "MIT", "engines": { "node": ">=12.17" } }, "node_modules/wouter": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.7.1.tgz", - "integrity": "sha512-od5LGmndSUzntZkE2R5CHhoiJ7YMuTIbiXsa0Anytc2RATekgv4sfWRAxLEULBrp7ADzinWQw8g470lkT8+fOw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.9.0.tgz", + "integrity": "sha512-sF/od/PIgqEQBQcrN7a2x3MX6MQE6nW0ygCfy9hQuUkuB28wEZuu/6M5GyqkrrEu9M6jxdkgE12yDFsQMKos4Q==", "license": "Unlicense", "dependencies": { "mitt": "^3.0.1", @@ -38425,17 +41324,17 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -38447,6 +41346,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -38459,10 +41359,88 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -38477,9 +41455,9 @@ } }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -38513,9 +41491,9 @@ } }, "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -38528,9 +41506,10 @@ } }, "node_modules/xbytes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xbytes/-/xbytes-1.8.0.tgz", - "integrity": "sha512-o/8qiLr54dYJaX/OB47vvb6cfkqFCdoXXhQdzPc8pF7ulsBGOHRTjgFqVceaw+EcjX1fskToTdFHAUhoeZB6xg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/xbytes/-/xbytes-1.9.1.tgz", + "integrity": "sha512-29E0ygMFWrM5JW2W1ypmezjyR2FOS5aCszdLe620ymSJBoZzL0/RCLJKCoUFu3DfQGhZ/FWykEBp5dfEy6+hjA==", + "license": "Apache-2.0", "engines": { "node": ">=1" } @@ -38585,16 +41564,6 @@ "xml-js": "bin/cli.js" } }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, "node_modules/xml2js": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", @@ -38632,13 +41601,6 @@ "node": ">=8.0" } }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -38652,14 +41614,16 @@ "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": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yaml": { "version": "2.8.2", @@ -38681,6 +41645,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -38703,22 +41668,42 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", "engines": { "node": ">=6" } }, "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, - "peer": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -38733,13 +41718,14 @@ "link": true }, "node_modules/zeptomatch": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.0.2.tgz", - "integrity": "sha512-H33jtSKf8Ijtb5BW6wua3G5DhnFjbFML36eFu+VdOoVY4HD9e7ggjqdM6639B+L87rjnR6Y+XeRzBXZdy52B/g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.1.0.tgz", + "integrity": "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==", "dev": true, "license": "MIT", "dependencies": { - "grammex": "^3.1.10" + "grammex": "^3.1.11", + "graphmatch": "^1.1.0" } }, "node_modules/zero-cache": { @@ -38840,26 +41826,14 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", - "dev": true, - "license": "ISC", - "peer": true, - "peerDependencies": { - "zod": "^3.24.1" - } - }, "node_modules/zql": { "resolved": "packages/zql", "link": true @@ -38923,6 +41897,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -38938,7 +41913,7 @@ "ast-to-zql": "0.0.0", "otel": "0.0.0", "shared": "0.0.0", - "vitest": "4.0.15", + "vitest": "4.1.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", @@ -38947,27 +41922,6 @@ "zqlite": "0.0.0" } }, - "packages/analyze-query/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/anaylze-query": { - "name": "analyze-query", - "version": "0.0.0", - "extraneous": true, - "devDependencies": { - "@rocicorp/eslint-config": "^0.7.0", - "@rocicorp/prettier-config": "^0.3.0" - } - }, "packages/ast-to-zql": { "version": "0.0.0", "dependencies": { @@ -38982,45 +41936,15 @@ "zero-types": "0.0.0" } }, - "packages/cf-shared": { - "version": "0.0.0", - "extraneous": true, - "dependencies": { - "@rocicorp/logger": "^5.2.2" - }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20231010.0", - "@rocicorp/eslint-config": "^0.5.1", - "@rocicorp/prettier-config": "^0.2.0", - "@vitest/browser": "^2.0.3", - "typescript": "^5.5.3", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.0.3" - } - }, "packages/datadog": { "version": "0.0.0", "devDependencies": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15" - } - }, - "packages/datadog/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "vitest": "4.1.0" } }, "packages/otel": { @@ -39032,16 +41956,6 @@ "shared": "0.0.0" } }, - "packages/pg-sdk": { - "version": "0.0.0", - "extraneous": true, - "dependencies": { - "vitest": "^2.1.5" - }, - "devDependencies": { - "@faker-js/faker": "^9.4.0" - } - }, "packages/replicache": { "version": "15.2.1", "license": "Apache-2.0", @@ -39058,16 +41972,16 @@ "@op-engineering/op-sqlite": ">=15", "@rocicorp/zero-sqlite3": "^1.0.15", "@types/command-line-usage": "^5.0.2", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", "compare-utf8": "^0.1.1", - "esbuild": "^0.25.10", + "esbuild": "^0.27.4", "expo-sqlite": ">=15", "playwright": "^1.53.2", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15" + "vitest": "4.1.0" }, "peerDependencies": { "@op-engineering/op-sqlite": ">=15", @@ -39105,35 +42019,21 @@ "@docusaurus/types": "3.9.2", "docusaurus-plugin-typedoc": "^1.4.2", "replicache": "15.2.1", - "typedoc": "^0.28.15", - "typedoc-plugin-markdown": "^4.9.0", + "typedoc": "^0.28.17", + "typedoc-plugin-markdown": "^4.10.0", "typescript": "~5.9.3" }, "engines": { "node": ">=22" } }, - "packages/replicache-doc/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "packages/replicache-perf": { "dependencies": { "@types/command-line-args": "^5.2.3", "@types/command-line-usage": "^5.0.2", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", - "esbuild": "^0.25.10", + "esbuild": "^0.27.4", "get-port": "^7.0.0", "hash-wasm": "^4.9.0", "idb": "^7.0.1", @@ -39142,169 +42042,39 @@ "shared": "0.0.0", "tsx": "^4.21.0", "typescript": "~5.9.3", - "vite": "7.2.7", + "vite": "8.0.0", "xbytes": "^1.7.0" } }, - "packages/replicache-perf/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 - } - } - }, - "packages/replicache-perf/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" - } - }, - "packages/replicache-perf/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "packages/replicache-perf/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/replicache-perf/node_modules/vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "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", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.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 - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "packages/replicache/node_modules/@expo/cli": { - "version": "54.0.22", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", - "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.16.tgz", + "integrity": "sha512-rp1mBnA5msGDPTfFuqVl+9RsJOtuA0cXsWSJpHdvsIxcSVg0oJyF/rgvrwsFrNQCLXzkMXm+o3CsY9iL1D/CDA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", + "@expo/config": "~55.0.8", + "@expo/config-plugins": "~55.0.6", "@expo/devcert": "^1.2.1", - "@expo/env": "~2.0.8", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", + "@expo/env": "~2.1.1", + "@expo/image-utils": "^0.8.12", + "@expo/json-file": "^10.0.12", + "@expo/log-box": "55.0.7", "@expo/metro": "~54.2.0", - "@expo/metro-config": "~54.0.14", - "@expo/osascript": "^2.3.8", - "@expo/package-manager": "^1.9.10", - "@expo/plist": "^0.4.8", - "@expo/prebuild-config": "^54.0.8", - "@expo/schema-utils": "^0.1.8", + "@expo/metro-config": "~55.0.9", + "@expo/osascript": "^2.4.2", + "@expo/package-manager": "^1.10.3", + "@expo/plist": "^0.5.2", + "@expo/prebuild-config": "^55.0.8", + "@expo/require-utils": "^55.0.2", + "@expo/router-server": "^55.0.10", + "@expo/schema-utils": "^55.0.2", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.81.5", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", + "@expo/xcpretty": "^4.4.0", + "@react-native/dev-middleware": "0.83.2", "accepts": "^1.3.8", "arg": "^5.0.2", "better-opn": "~3.0.2", @@ -39315,38 +42085,32 @@ "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", - "env-editor": "^0.4.1", - "expo-server": "^1.0.5", - "freeport-async": "^2.0.0", + "dnssd-advertise": "^1.1.3", + "expo-server": "^55.0.6", + "fetch-nodeshim": "^0.4.6", "getenv": "^2.0.0", "glob": "^13.0.0", - "lan-network": "^0.1.6", - "minimatch": "^9.0.0", + "lan-network": "^0.2.0", + "multitars": "^0.2.3", "node-forge": "^1.3.3", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "^5.6.0", + "picomatch": "^4.0.3", "pretty-format": "^29.7.0", "progress": "^2.0.3", "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", "semver": "^7.6.0", "send": "^0.19.0", "slugify": "^1.3.4", "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", - "tar": "^7.5.2", "terminal-link": "^2.1.1", - "undici": "^6.18.2", + "toqr": "^0.1.1", "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" + "ws": "^8.12.1", + "zod": "^3.25.76" }, "bin": { "expo-internal": "build/bin/cli" @@ -39365,21 +42129,10 @@ } } }, - "packages/replicache/node_modules/@expo/code-signing-certificates": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", - "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "node-forge": "^1.3.3" - } - }, "packages/replicache/node_modules/@expo/devtools": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", - "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.2.tgz", + "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", "dev": true, "license": "MIT", "peer": true, @@ -39399,58 +42152,42 @@ } } }, - "packages/replicache/node_modules/@expo/fingerprint": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", - "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", + "packages/replicache/node_modules/@expo/dom-webview": { + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.3.tgz", + "integrity": "sha512-bY4/rfcZ0f43DvOtMn8/kmPlmo01tex5hRoc5hKbwBwQjqWQuQt0ACwu7akR9IHI4j0WNG48eL6cZB6dZUFrzg==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - }, - "bin": { - "fingerprint": "bin/cli.js" + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "packages/replicache/node_modules/@expo/metro": { - "version": "54.2.0", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", - "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", + "packages/replicache/node_modules/@expo/log-box": { + "version": "55.0.7", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.7.tgz", + "integrity": "sha512-m7V1k2vlMp4NOj3fopjOg4zl/ANXyTRF3HMTMep2GZAKsPiDzgOQ41nm8CaU50/HlDIGXlCObss07gOn20UpHQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3" + "@expo/dom-webview": "^55.0.3", + "anser": "^1.4.9", + "stacktrace-parser": "^0.1.10" + }, + "peerDependencies": { + "@expo/dom-webview": "^55.0.3", + "expo": "*", + "react": "*", + "react-native": "*" } }, "packages/replicache/node_modules/@expo/metro-config": { - "version": "54.0.14", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", - "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", + "version": "55.0.9", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.9.tgz", + "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", "dev": true, "license": "MIT", "peer": true, @@ -39458,22 +42195,20 @@ "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8", - "@expo/json-file": "~10.0.8", + "@expo/config": "~55.0.8", + "@expo/env": "~2.1.1", + "@expo/json-file": "~10.0.12", "@expo/metro": "~54.2.0", "@expo/spawn-async": "^1.7.2", "browserslist": "^4.25.0", "chalk": "^4.1.0", "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", "getenv": "^2.0.0", "glob": "^13.0.0", - "hermes-parser": "^0.29.1", + "hermes-parser": "^0.32.0", "jsc-safe-url": "^0.2.4", "lightningcss": "^1.30.1", - "minimatch": "^9.0.0", + "picomatch": "^4.0.3", "postcss": "~8.4.32", "resolve-from": "^5.0.0" }, @@ -39487,19 +42222,19 @@ } }, "packages/replicache/node_modules/@expo/prebuild-config": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", - "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.8.tgz", + "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/config-types": "^54.0.10", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", - "@react-native/normalize-colors": "0.81.5", + "@expo/config": "~55.0.8", + "@expo/config-plugins": "~55.0.6", + "@expo/config-types": "^55.0.5", + "@expo/image-utils": "^0.8.12", + "@expo/json-file": "^10.0.12", + "@react-native/normalize-colors": "0.83.2", "debug": "^4.3.1", "resolve-from": "^5.0.0", "semver": "^7.6.0", @@ -39509,10 +42244,46 @@ "expo": "*" } }, + "packages/replicache/node_modules/@expo/router-server": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.10.tgz", + "integrity": "sha512-NZQzHwkaedufNPayVfPxsZGEMngOD3gDvYx9lld4sitRexrKDx5sHmmNHi6IByGbmCb4jwLXub5sIyWh6z1xPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "@expo/metro-runtime": "^55.0.6", + "expo": "*", + "expo-constants": "^55.0.7", + "expo-font": "^55.0.4", + "expo-router": "*", + "expo-server": "^55.0.6", + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" + }, + "peerDependenciesMeta": { + "@expo/metro-runtime": { + "optional": true + }, + "expo-router": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, "packages/replicache/node_modules/@expo/vector-icons": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", - "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", + "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", "dev": true, "license": "MIT", "peer": true, @@ -39523,31050 +42294,2076 @@ } }, "packages/replicache/node_modules/@op-engineering/op-sqlite": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.0.3.tgz", - "integrity": "sha512-vAUrw2hg2TQTDNM6tAsjtxQiyNTZCynjbV6F+FsiSYgbmfuqIL7gRu94IqmLM5/dPvqbBaDZdo4a9n6KMGN8RQ==", + "version": "15.2.7", + "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.2.7.tgz", + "integrity": "sha512-rXpzEt6FL0syAHa2QqBaB7DhhXwxEOs05cTIhv0RI+iur66XcuM73SpUSD8gnh8opHJu+Hw6Nu3IM4EDWxEdng==", "dev": true, "license": "MIT", "workspaces": [ - "example" + "example", + "node" ], "peerDependencies": { "react": "*", "react-native": "*" } }, - "packages/replicache/node_modules/@react-native/assets-registry": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", - "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", + "packages/replicache/node_modules/@react-native/codegen": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.84.1.tgz", + "integrity": "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "hermes-parser": "0.32.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "tinyglobby": "^0.2.15", + "yargs": "^17.6.2" + }, "engines": { "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" } }, - "packages/replicache/node_modules/@react-native/babel-plugin-codegen": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", - "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", + "packages/replicache/node_modules/@react-native/virtualized-lists": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.84.1.tgz", + "integrity": "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.81.5" + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" }, "engines": { "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.2.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "packages/replicache/node_modules/@react-native/babel-preset": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", - "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", + "packages/replicache/node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "dependencies": { - "@babel/core": "^7.25.2", + "csstype": "^3.2.2" + } + }, + "packages/replicache/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hermes-parser": "0.32.0" + } + }, + "packages/replicache/node_modules/babel-preset-expo": { + "version": "55.0.11", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.11.tgz", + "integrity": "sha512-ti8t4xufD6gUQQh+qY+b+VT/1zyA0n1PBnwOzCkPUyEDiIVBpaOixR+BzVH68hqu9mH2wDfzoFuGgv+2LfRdqw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/generator": "^7.20.5", + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.81.5", - "babel-plugin-syntax-hermes-parser": "0.29.1", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.83.2", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.32.0", "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">= 20.19.4" + "debug": "^4.3.4", + "resolve-from": "^5.0.0" }, "peerDependencies": { - "@babel/core": "*" + "@babel/runtime": "^7.20.0", + "expo": "*", + "expo-widgets": "^55.0.4", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + }, + "expo-widgets": { + "optional": true + } } }, - "packages/replicache/node_modules/@react-native/codegen": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", - "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", + "packages/replicache/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.29.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 20.19.4" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "*" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "packages/replicache/node_modules/@react-native/codegen/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "packages/replicache/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "packages/replicache/node_modules/@react-native/codegen/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "packages/replicache/node_modules/@react-native/codegen/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "packages/replicache/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, - "license": "ISC", + "license": "MIT", "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=18" } }, - "packages/replicache/node_modules/@react-native/community-cli-plugin": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", - "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", + "packages/replicache/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "packages/replicache/node_modules/expo": { + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.6.tgz", + "integrity": "sha512-gaF8bh5beWmrptz3d4Gr138CiPoLJtzjNbqNSOQ8kdQm3wMW8lJGT1dsY5NPJTZ7MNJBTN+pcRwshr4BMK4OiA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@react-native/dev-middleware": "0.83.1", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.83.3", - "metro-config": "^0.83.3", - "metro-core": "^0.83.3", - "semver": "^7.1.3" + "@babel/runtime": "^7.20.0", + "@expo/cli": "55.0.16", + "@expo/config": "~55.0.8", + "@expo/config-plugins": "~55.0.6", + "@expo/devtools": "55.0.2", + "@expo/fingerprint": "0.16.6", + "@expo/local-build-cache-provider": "55.0.6", + "@expo/log-box": "55.0.7", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "55.0.9", + "@expo/vector-icons": "^15.0.2", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~55.0.11", + "expo-asset": "~55.0.8", + "expo-constants": "~55.0.7", + "expo-file-system": "~55.0.10", + "expo-font": "~55.0.4", + "expo-keep-awake": "~55.0.4", + "expo-modules-autolinking": "55.0.9", + "expo-modules-core": "55.0.15", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-minimum": "^0.1.1" }, - "engines": { - "node": ">= 20.19.4" + "bin": { + "expo": "bin/cli", + "expo-modules-autolinking": "bin/autolinking", + "fingerprint": "bin/fingerprint" }, "peerDependencies": { - "@react-native-community/cli": "*", - "@react-native/metro-config": "*" + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-native": "*", + "react-native-webview": "*" }, "peerDependenciesMeta": { - "@react-native-community/cli": { + "@expo/dom-webview": { "optional": true }, - "@react-native/metro-config": { + "@expo/metro-runtime": { + "optional": true + }, + "react-native-webview": { "optional": true } } }, - "packages/replicache/node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", - "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "packages/replicache/node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", - "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", + "packages/replicache/node_modules/expo-asset": { + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.8.tgz", + "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.83.1", - "@react-native/debugger-shell": "0.83.1", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^7.5.10" + "@expo/image-utils": "^0.8.12", + "expo-constants": "~55.0.7" }, - "engines": { - "node": ">= 20.19.4" + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "packages/replicache/node_modules/@react-native/community-cli-plugin/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "packages/replicache/node_modules/expo-constants": { + "version": "55.0.7", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.7.tgz", + "integrity": "sha512-kdcO4TsQRRqt0USvjaY5vgQMO9H52K3kBZ/ejC7F6rz70mv08GoowrZ1CYOr5O4JpPDRlIpQfZJUucaS/c+KWQ==", "dev": true, "license": "MIT", "peer": true, - "engines": { - "node": ">=8.3.0" + "dependencies": { + "@expo/config": "~55.0.8", + "@expo/env": "~2.1.1" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "expo": "*", + "react-native": "*" } }, - "packages/replicache/node_modules/@react-native/debugger-frontend": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", - "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", + "packages/replicache/node_modules/expo-file-system": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.10.tgz", + "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "peer": true, - "engines": { - "node": ">= 20.19.4" + "peerDependencies": { + "expo": "*", + "react-native": "*" } }, - "packages/replicache/node_modules/@react-native/debugger-shell": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", - "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", + "packages/replicache/node_modules/expo-font": { + "version": "55.0.4", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.4.tgz", + "integrity": "sha512-ZKeGTFffPygvY5dM/9ATM2p7QDkhsaHopH7wFAWgP2lKzqUMS9B/RxCvw5CaObr9Ro7x9YptyeRKX2HmgmMfrg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "cross-spawn": "^7.0.6", - "fb-dotslash": "0.5.8" + "fontfaceobserver": "^2.1.0" }, - "engines": { - "node": ">= 20.19.4" + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "packages/replicache/node_modules/@react-native/dev-middleware": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", - "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", + "packages/replicache/node_modules/expo-keep-awake": { + "version": "55.0.4", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.4.tgz", + "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.81.5", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" - }, - "engines": { - "node": ">= 20.19.4" + "peerDependencies": { + "expo": "*", + "react": "*" } }, - "packages/replicache/node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "packages/replicache/node_modules/expo-modules-core": { + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.15.tgz", + "integrity": "sha512-MAGz1SYSVgQbwVeUysWgPtLh8ozbBwORatXoA4w0NZqZBZzEyBgUQNhuwaroaIi9W8Ir3wy1McmZcDYDJNGmVw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "packages/replicache/node_modules/@react-native/gradle-plugin": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", - "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "packages/replicache/node_modules/@react-native/js-polyfills": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", - "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.4" + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "packages/replicache/node_modules/@react-native/normalize-colors": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", - "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/@react-native/virtualized-lists": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", - "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", + "packages/replicache/node_modules/expo-sqlite": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-55.0.10.tgz", + "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 20.19.4" + "await-lock": "^2.2.2" }, "peerDependencies": { - "@types/react": "^19.2.0", + "expo": "*", "react": "*", "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } } }, - "packages/replicache/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "packages/replicache/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "peer": true, - "engines": { - "node": ">=10" + "bin": { + "nanoid": "bin/nanoid.cjs" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "packages/replicache/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/babel-preset-expo": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", - "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", + "packages/replicache/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.81.5", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "@babel/runtime": "^7.20.0", - "expo": "*", - "react-refresh": ">=0.14.0 <1.0.0" + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, - "peerDependenciesMeta": { - "@babel/runtime": { - "optional": true - }, - "expo": { - "optional": true - } + "engines": { + "node": "^10 || ^12 || >=14" } }, - "packages/replicache/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "packages/replicache/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "balanced-match": "^1.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "packages/replicache/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==", + "packages/replicache/node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "packages/replicache/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "packages/replicache/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10" - } + "peer": true }, - "packages/replicache/node_modules/expo": { - "version": "54.0.32", - "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.32.tgz", - "integrity": "sha512-yL9eTxiQ/QKKggVDAWO5CLjUl6IS0lPYgEvC3QM4q4fxd6rs7ks3DnbXSGVU3KNFoY/7cRNYihvd0LKYP+MCXA==", + "packages/replicache/node_modules/react-native": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.84.1.tgz", + "integrity": "sha512-0PjxOyXRu3tZ8EobabxSukvhKje2HJbsZikR0U+pvS0pYZza2hXKjcSBiBdFN4h9D0S3v6a8kkrDK6WTRKMwzg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/runtime": "^7.20.0", - "@expo/cli": "54.0.22", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/devtools": "0.1.8", - "@expo/fingerprint": "0.15.4", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "54.0.14", - "@expo/vector-icons": "^15.0.3", - "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~54.0.10", - "expo-asset": "~12.0.12", - "expo-constants": "~18.0.13", - "expo-file-system": "~19.0.21", - "expo-font": "~14.0.11", - "expo-keep-awake": "~15.0.8", - "expo-modules-autolinking": "3.0.24", - "expo-modules-core": "3.0.29", + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/assets-registry": "0.84.1", + "@react-native/codegen": "0.84.1", + "@react-native/community-cli-plugin": "0.84.1", + "@react-native/gradle-plugin": "0.84.1", + "@react-native/js-polyfills": "0.84.1", + "@react-native/normalize-colors": "0.84.1", + "@react-native/virtualized-lists": "0.84.1", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "0.32.0", + "base64-js": "^1.5.1", + "commander": "^12.0.0", + "flow-enums-runtime": "^0.0.6", + "hermes-compiler": "250829098.0.9", + "invariant": "^2.2.4", + "jest-environment-node": "^29.7.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.83.3", + "metro-source-map": "^0.83.3", + "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", - "react-refresh": "^0.14.2", - "whatwg-url-without-unicode": "8.0.0-3" + "promise": "^8.3.0", + "react-devtools-core": "^6.1.5", + "react-refresh": "^0.14.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.27.0", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "tinyglobby": "^0.2.15", + "whatwg-fetch": "^3.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" }, "bin": { - "expo": "bin/cli", - "expo-modules-autolinking": "bin/autolinking", - "fingerprint": "bin/fingerprint" + "react-native": "cli.js" + }, + "engines": { + "node": ">= 20.19.4" }, "peerDependencies": { - "@expo/dom-webview": "*", - "@expo/metro-runtime": "*", - "react": "*", - "react-native": "*", - "react-native-webview": "*" + "@types/react": "^19.1.1", + "react": "^19.2.3" }, "peerDependenciesMeta": { - "@expo/dom-webview": { - "optional": true - }, - "@expo/metro-runtime": { - "optional": true - }, - "react-native-webview": { + "@types/react": { "optional": true } } }, - "packages/replicache/node_modules/expo-asset": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", - "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", + "packages/replicache/node_modules/react-native/node_modules/@react-native/normalize-colors": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.1.tgz", + "integrity": "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@expo/image-utils": "^0.8.8", - "expo-constants": "~18.0.12" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } + "peer": true }, - "packages/replicache/node_modules/expo-constants": { - "version": "18.0.13", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", - "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", + "packages/replicache/node_modules/react-native/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8" + "engines": { + "node": ">=8.3.0" }, "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "packages/replicache/node_modules/expo-file-system": { - "version": "19.0.21", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", - "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react-native": "*" + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "packages/replicache/node_modules/expo-font": { - "version": "14.0.11", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", - "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", + "packages/replicache/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "fontfaceobserver": "^2.1.0" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" + "engines": { + "node": ">=8" } }, - "packages/replicache/node_modules/expo-keep-awake": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", - "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", + "packages/replicache/node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react": "*" - } + "peer": true }, - "packages/replicache/node_modules/expo-modules-autolinking": { - "version": "3.0.24", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", - "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", + "packages/replicache/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "bin": { - "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + "engines": { + "node": ">=8" } }, - "packages/replicache/node_modules/expo-modules-core": { - "version": "3.0.29", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", - "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", + "packages/replicache/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "invariant": "^2.2.4" + "has-flag": "^4.0.0" }, - "peerDependencies": { - "react": "*", - "react-native": "*" + "engines": { + "node": ">=8" } }, - "packages/replicache/node_modules/expo-sqlite": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-16.0.10.tgz", - "integrity": "sha512-tUOKxE9TpfneRG3eOfbNfhN9236SJ7IiUnP8gCqU7umd9DtgDGB/5PhYVVfl+U7KskgolgNoB9v9OZ9iwXN8Eg==", + "packages/replicache/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", - "dependencies": { - "await-lock": "^2.2.2" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/replicache/node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", - "dev": true, - "license": "BlueOak-1.0.0", "peer": true, "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "packages/replicache/node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "packages/replicache/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "peer": true, "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "20 || >=22" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "packages/replicache/node_modules/hermes-compiler": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", - "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "packages/replicache/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "license": "BlueOak-1.0.0", "peer": true, - "engines": { - "node": "20 || >=22" + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "packages/replicache/node_modules/metro": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", - "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", - "dev": true, - "license": "MIT", - "peer": true, + "packages/shared": { + "version": "0.0.0", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.32.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" + "@badrap/valita": "0.3.11", + "@dotenvx/dotenvx": "^1.39.0", + "@rocicorp/logger": "^5.4.0", + "@rocicorp/resolver": "^1.0.2", + "chalk-template": "^1.1.0", + "command-line-args": "^6.0.1", + "command-line-usage": "^7.0.3", + "defu": "^6.1.4", + "js-xxhash": "^4.0.0", + "kasi": "^1.1.0", + "semver": "^7.5.4" }, - "engines": { - "node": ">=20.19.4" + "devDependencies": { + "@types/semver": "^7.5.1", + "@types/strip-ansi": "^3.0.0", + "@vitest/runner": "4.1.0", + "compare-utf8": "^0.1.1", + "fast-check": "^3.18.0", + "package-up": "^5.0.0", + "playwright": "^1.53.2", + "type-fest": "^4.30.0", + "typescript": "~5.9.3", + "vitest": "4.1.0" } }, - "packages/replicache/node_modules/metro-babel-transformer": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", - "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", + "packages/shared/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.32.0", - "nullthrows": "^1.1.1" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.32.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/replicache/node_modules/metro-cache": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", - "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", - "dev": true, - "license": "MIT", - "peer": true, + "packages/z2s": { + "version": "0.0.0", "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.3" + "@databases/escape-identifier": "^1.0.3", + "@databases/sql": "^3.3.0" }, - "engines": { - "node": ">=20.19.4" + "devDependencies": { + "@faker-js/faker": "^9.6.0", + "@types/pg": "^8.11.11", + "@vitest/runner": "4.1.0", + "pg": "^8.16.3", + "shared": "0.0.0", + "vitest": "4.1.0", + "zero-cache": "0.0.0", + "zero-protocol": "0.0.0", + "zero-schema": "0.0.0", + "zero-types": "0.0.0", + "zql": "0.0.0" } }, - "packages/replicache/node_modules/metro-cache-key": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", - "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-config": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", - "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.83.3", - "metro-cache": "0.83.3", - "metro-core": "0.83.3", - "metro-runtime": "0.83.3", - "yaml": "^2.6.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-core": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", - "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-file-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", - "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-minify-terser": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", - "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-resolver": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", - "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-runtime": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", - "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-source-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", - "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.83.3", - "nullthrows": "^1.1.1", - "ob1": "0.83.3", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-symbolicate": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", - "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", - "dev": true, - "license": "MIT", - "peer": true, + "packages/zero": { + "name": "@rocicorp/zero", + "version": "0.26.2", + "license": "Apache-2.0", "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.83.3", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" + "@badrap/valita": "0.3.11", + "@databases/escape-identifier": "^1.0.3", + "@databases/sql": "^3.3.0", + "@dotenvx/dotenvx": "^1.39.0", + "@drdgvhbh/postgres-error-codes": "^0.0.6", + "@fastify/cors": "^10.0.0", + "@fastify/websocket": "^11.0.0", + "@google-cloud/precise-date": "^4.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.203.0", + "@opentelemetry/auto-instrumentations-node": "^0.62.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", + "@opentelemetry/resources": "^2.0.1", + "@opentelemetry/sdk-metrics": "^2.0.1", + "@opentelemetry/sdk-node": "^0.203.0", + "@opentelemetry/sdk-trace-node": "^2.0.1", + "@postgresql-typed/oids": "^0.2.0", + "@rocicorp/lock": "^1.0.4", + "@rocicorp/logger": "^5.4.0", + "@rocicorp/resolver": "^1.0.2", + "@rocicorp/zero-sqlite3": "^1.0.15", + "@standard-schema/spec": "^1.0.0", + "@types/basic-auth": "^1.1.8", + "@types/ws": "^8.5.12", + "basic-auth": "^2.0.1", + "chalk": "^5.3.0", + "chalk-template": "^1.1.0", + "chokidar": "^4.0.1", + "cloudevents": "^10.0.0", + "command-line-args": "^6.0.1", + "command-line-usage": "^7.0.3", + "compare-utf8": "^0.1.1", + "defu": "^6.1.4", + "eventemitter3": "^5.0.1", + "fastify": "^5.0.0", + "is-in-subnet": "^4.0.1", + "jose": "^5.9.3", + "js-xxhash": "^4.0.0", + "json-custom-numbers": "^3.1.1", + "kasi": "^1.1.0", + "nanoid": "^5.1.2", + "parse-prometheus-text-format": "^1.1.1", + "pg-format": "npm:pg-format-fix@^1.0.5", + "postgres": "3.4.7", + "prettier": "^3.8.1", + "semver": "^7.5.4", + "tsx": "^4.21.0", + "url-pattern": "^1.0.3", + "urlpattern-polyfill": "^10.1.0", + "ws": "^8.18.1" }, "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-transform-plugins": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", - "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" + "analyze-query": "out/zero/src/analyze-query.js", + "ast-to-zql": "out/zero/src/ast-to-zql.js", + "transform-query": "out/zero/src/transform-query.js", + "zero-build-schema": "out/zero/src/build-schema.js", + "zero-cache": "out/zero/src/cli.js", + "zero-cache-dev": "out/zero/src/zero-cache-dev.js", + "zero-deploy-permissions": "out/zero/src/deploy-permissions.js", + "zero-out": "out/zero/src/zero-out.js" }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro-transform-worker": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", - "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-source-map": "0.83.3", - "metro-transform-plugins": "0.83.3", - "nullthrows": "^1.1.1" + "devDependencies": { + "@op-engineering/op-sqlite": ">=15", + "@vitest/runner": "4.1.0", + "analyze-query": "0.0.0", + "ast-to-zql": "0.0.0", + "expo-sqlite": ">=15", + "replicache": "15.2.1", + "shared": "0.0.0", + "typedoc": "^0.28.17", + "typedoc-plugin-markdown": "^4.10.0", + "typescript": "~5.9.3", + "vite": "8.0.0", + "vitest": "4.1.0", + "zero-cache": "0.0.0", + "zero-client": "0.0.0", + "zero-pg": "0.0.0", + "zero-react": "0.0.0", + "zero-server": "0.0.0", + "zero-solid": "0.0.0", + "zqlite": "0.0.0" }, "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/metro/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.32.0" - } - }, - "packages/replicache/node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.3.0" + "node": ">=22" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "@op-engineering/op-sqlite": ">=15", + "expo-sqlite": ">=15" }, "peerDependenciesMeta": { - "bufferutil": { + "@op-engineering/op-sqlite": { "optional": true }, - "utf-8-validate": { + "expo-sqlite": { "optional": true } } }, - "packages/replicache/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "packages/replicache/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "packages/replicache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/replicache/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==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "packages/replicache/node_modules/ob1": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", - "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "packages/replicache/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/replicache/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/replicache/node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "packages/replicache/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, + "packages/zero-cache": { + "version": "0.0.0", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "@databases/sql": "^3.3.0", + "@drdgvhbh/postgres-error-codes": "^0.0.6", + "@fastify/cors": "^10.0.0", + "@fastify/websocket": "^11.0.0", + "@google-cloud/precise-date": "^4.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.203.0", + "@opentelemetry/auto-instrumentations-node": "^0.62.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", + "@opentelemetry/resources": "^2.0.1", + "@opentelemetry/sdk-metrics": "^2.0.1", + "@opentelemetry/sdk-node": "^0.203.0", + "@opentelemetry/sdk-trace-node": "^2.0.1", + "@postgresql-typed/oids": "^0.2.0", + "@rocicorp/lock": "^1.0.4", + "@rocicorp/logger": "^5.4.0", + "@rocicorp/resolver": "^1.0.2", + "@rocicorp/zero-sqlite3": "^1.0.15", + "@types/basic-auth": "^1.1.8", + "basic-auth": "^2.0.1", + "chalk": "^5.3.0", + "cloudevents": "^10.0.0", + "compare-utf8": "^0.1.1", + "defu": "^6.1.4", + "eventemitter3": "^5.0.1", + "fastify": "^5.0.0", + "is-in-subnet": "^4.0.1", + "jose": "^5.9.3", + "json-custom-numbers": "^3.1.1", + "nanoid": "^5.1.2", + "parse-prometheus-text-format": "^1.1.1", + "pg-format": "npm:pg-format-fix@^1.0.5", + "postgres": "3.4.7", + "tsx": "^4.21.0", + "url-pattern": "^1.0.3", + "urlpattern-polyfill": "^10.1.0", + "ws": "^8.18.1", + "zero-protocol": "0.0.0", + "zero-types": "0.0.0", + "zql": "0.0.0", + "zqlite": "0.0.0" }, - "engines": { - "node": "^10 || ^12 || >=14" + "devDependencies": { + "@rocicorp/zero-events": "0.0.4", + "@testcontainers/postgresql": "^10.9.0", + "@types/node": "^22.10.5", + "@types/pg-format": "^1.0.5", + "@types/strip-ansi": "^3.0.0", + "@types/ws": "^8.5.12", + "@vitest/runner": "4.1.0", + "mockttp": "^4.2.1", + "nock": "^14.0.4", + "otel": "0.0.0", + "shared": "0.0.0", + "typescript": "~5.9.3", + "vitest": "4.1.0", + "zero-protocol": "0.0.0", + "zero-schema": "0.0.0", + "zql": "0.0.0" } }, - "packages/replicache/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "peer": true, + "packages/zero-client": { + "version": "0.0.0", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/replicache/node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/replicache/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/react-native": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.83.1.tgz", - "integrity": "sha512-mL1q5HPq5cWseVhWRLl+Fwvi5z1UO+3vGOpjr+sHFwcUletPRZ5Kv+d0tUfqHmvi73/53NjlQqX1Pyn4GguUfA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.83.1", - "@react-native/codegen": "0.83.1", - "@react-native/community-cli-plugin": "0.83.1", - "@react-native/gradle-plugin": "0.83.1", - "@react-native/js-polyfills": "0.83.1", - "@react-native/normalize-colors": "0.83.1", - "@react-native/virtualized-lists": "0.83.1", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.32.0", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "hermes-compiler": "0.14.0", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.3", - "metro-source-map": "^0.83.3", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.27.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.1", - "react": "^19.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/replicache/node_modules/react-native/node_modules/@react-native/codegen": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", - "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.32.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "packages/replicache/node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", - "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-parser": "0.32.0" - } - }, - "packages/replicache/node_modules/react-native/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "packages/replicache/node_modules/react-native/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "packages/replicache/node_modules/react-native/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/replicache/node_modules/react-native/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.32.0" - } - }, - "packages/replicache/node_modules/react-native/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "packages/replicache/node_modules/react-native/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "packages/replicache/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/replicache/node_modules/tar": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", - "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "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" - } - }, - "packages/replicache/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/replicache/node_modules/undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18.17" - } - }, - "packages/replicache/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==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "packages/shared": { - "version": "0.0.0", - "dependencies": { - "@badrap/valita": "0.3.11", - "@dotenvx/dotenvx": "^1.39.0", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "chalk-template": "^1.1.0", - "command-line-args": "^6.0.1", - "command-line-usage": "^7.0.3", - "defu": "^6.1.4", - "js-xxhash": "^4.0.0", - "kasi": "^1.1.0", - "semver": "^7.5.4" - }, - "devDependencies": { - "@types/semver": "^7.5.1", - "@types/strip-ansi": "^3.0.0", - "@vitest/runner": "4.0.15", - "compare-utf8": "^0.1.1", - "fast-check": "^3.18.0", - "package-up": "^5.0.0", - "playwright": "^1.53.2", - "type-fest": "^4.30.0", - "typescript": "~5.9.3", - "vitest": "4.0.15" - } - }, - "packages/shared/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/shared/node_modules/chalk-template": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", - "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "packages/shared/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/z2s": { - "version": "0.0.0", - "dependencies": { - "@databases/escape-identifier": "^1.0.3", - "@databases/sql": "^3.3.0" - }, - "devDependencies": { - "@faker-js/faker": "^9.6.0", - "@types/pg": "^8.11.11", - "@vitest/runner": "4.0.15", - "pg": "^8.16.3", - "shared": "0.0.0", - "vitest": "4.0.15", - "zero-cache": "0.0.0", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "packages/zero": { - "name": "@rocicorp/zero", - "version": "0.26.2", - "license": "Apache-2.0", - "dependencies": { - "@badrap/valita": "0.3.11", - "@databases/escape-identifier": "^1.0.3", - "@databases/sql": "^3.3.0", - "@dotenvx/dotenvx": "^1.39.0", - "@drdgvhbh/postgres-error-codes": "^0.0.6", - "@fastify/cors": "^10.0.0", - "@fastify/websocket": "^11.0.0", - "@google-cloud/precise-date": "^4.0.0", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/auto-instrumentations-node": "^0.62.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", - "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-metrics": "^2.0.1", - "@opentelemetry/sdk-node": "^0.203.0", - "@opentelemetry/sdk-trace-node": "^2.0.1", - "@postgresql-typed/oids": "^0.2.0", - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "@rocicorp/zero-sqlite3": "^1.0.15", - "@standard-schema/spec": "^1.0.0", - "@types/basic-auth": "^1.1.8", - "@types/ws": "^8.5.12", - "basic-auth": "^2.0.1", - "chalk": "^5.3.0", - "chalk-template": "^1.1.0", - "chokidar": "^4.0.1", - "cloudevents": "^10.0.0", - "command-line-args": "^6.0.1", - "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", - "defu": "^6.1.4", - "eventemitter3": "^5.0.1", - "fastify": "^5.0.0", - "is-in-subnet": "^4.0.1", - "jose": "^5.9.3", - "js-xxhash": "^4.0.0", - "json-custom-numbers": "^3.1.1", - "kasi": "^1.1.0", - "nanoid": "^5.1.2", - "parse-prometheus-text-format": "^1.1.1", - "pg-format": "npm:pg-format-fix@^1.0.5", - "postgres": "3.4.7", - "prettier": "^3.8.1", - "semver": "^7.5.4", - "tsx": "^4.21.0", - "url-pattern": "^1.0.3", - "urlpattern-polyfill": "^10.1.0", - "ws": "^8.18.1" - }, - "bin": { - "analyze-query": "out/zero/src/analyze-query.js", - "ast-to-zql": "out/zero/src/ast-to-zql.js", - "transform-query": "out/zero/src/transform-query.js", - "zero-build-schema": "out/zero/src/build-schema.js", - "zero-cache": "out/zero/src/cli.js", - "zero-cache-dev": "out/zero/src/zero-cache-dev.js", - "zero-deploy-permissions": "out/zero/src/deploy-permissions.js", - "zero-out": "out/zero/src/zero-out.js" + "@rocicorp/lock": "^1.0.4", + "@rocicorp/logger": "^5.4.0", + "@rocicorp/resolver": "^1.0.2" }, "devDependencies": { - "@op-engineering/op-sqlite": ">=15", - "@vitest/runner": "4.0.15", - "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", - "expo-sqlite": ">=15", + "datadog": "0.0.0", + "esbuild": "^0.27.4", + "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", - "typedoc": "^0.28.15", - "typedoc-plugin-markdown": "^4.9.0", - "typescript": "~5.9.3", - "vite": "7.2.7", - "vitest": "4.0.15", - "zero-cache": "0.0.0", - "zero-client": "0.0.0", - "zero-pg": "0.0.0", - "zero-react": "0.0.0", - "zero-server": "0.0.0", - "zero-solid": "0.0.0", - "zqlite": "0.0.0" - }, - "engines": { - "node": ">=22" - }, - "peerDependencies": { - "@op-engineering/op-sqlite": ">=15", - "expo-sqlite": ">=15" - }, - "peerDependenciesMeta": { - "@op-engineering/op-sqlite": { - "optional": true - }, - "expo-sqlite": { - "optional": true - } - } - }, - "packages/zero-cache": { - "version": "0.0.0", - "dependencies": { - "@databases/sql": "^3.3.0", - "@drdgvhbh/postgres-error-codes": "^0.0.6", - "@fastify/cors": "^10.0.0", - "@fastify/websocket": "^11.0.0", - "@google-cloud/precise-date": "^4.0.0", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/auto-instrumentations-node": "^0.62.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", - "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-metrics": "^2.0.1", - "@opentelemetry/sdk-node": "^0.203.0", - "@opentelemetry/sdk-trace-node": "^2.0.1", - "@postgresql-typed/oids": "^0.2.0", - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "@rocicorp/zero-sqlite3": "^1.0.15", - "@types/basic-auth": "^1.1.8", - "basic-auth": "^2.0.1", - "chalk": "^5.3.0", - "cloudevents": "^10.0.0", - "compare-utf8": "^0.1.1", - "defu": "^6.1.4", - "eventemitter3": "^5.0.1", - "fastify": "^5.0.0", - "is-in-subnet": "^4.0.1", - "jose": "^5.9.3", - "json-custom-numbers": "^3.1.1", - "nanoid": "^5.1.2", - "parse-prometheus-text-format": "^1.1.1", - "pg-format": "npm:pg-format-fix@^1.0.5", - "postgres": "3.4.7", - "tsx": "^4.21.0", - "url-pattern": "^1.0.3", - "urlpattern-polyfill": "^10.1.0", - "ws": "^8.18.1", - "zero-protocol": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0", - "zqlite": "0.0.0" - }, - "devDependencies": { - "@rocicorp/zero-events": "0.0.4", - "@testcontainers/postgresql": "^10.9.0", - "@types/node": "^22.10.5", - "@types/pg-format": "^1.0.5", - "@types/strip-ansi": "^3.0.0", - "@types/ws": "^8.5.12", - "@vitest/runner": "4.0.15", - "mockttp": "^4.2.1", - "nock": "^14.0.4", - "otel": "0.0.0", - "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zql": "0.0.0" - } - }, - "packages/zero-cache/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/zero-cache/node_modules/nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "packages/zero-cache/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zero-client": { - "version": "0.0.0", - "dependencies": { - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2" - }, - "devDependencies": { - "@vitest/ui": "^4.0.15", - "ast-to-zql": "0.0.0", - "datadog": "0.0.0", - "esbuild": "^0.25.10", - "playwright": "^1.53.2", - "replicache": "15.2.1", - "shared": "0.0.0", - "typescript": "~5.9.3", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "packages/zero-client/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zero-events": { - "name": "@rocicorp/zero-events", - "version": "0.0.4", - "license": "Apache-2.0", - "devDependencies": { - "shared": "0.0.0", - "typescript": "~5.9.3" - } - }, - "packages/zero-events/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zero-expo": { - "version": "0.0.0", - "extraneous": true, - "dependencies": { - "@rocicorp/resolver": "^1.0.2" - }, - "devDependencies": { - "@rocicorp/eslint-config": "^0.7.0", - "@rocicorp/prettier-config": "^0.3.0", - "expo-sqlite": "^15.2.14" - }, - "peerDependencies": { - "expo-sqlite": "^15.2.14" - } - }, - "packages/zero-pg": { - "version": "0.0.0", - "dependencies": { - "@rocicorp/logger": "^5.4.0" - }, - "devDependencies": { - "@vitest/runner": "4.0.15", - "vitest": "4.0.15", - "zero-cache": "0.0.0", - "zero-server": "0.0.0" - } - }, - "packages/zero-protocol": { - "version": "0.0.0", - "dependencies": { - "@badrap/valita": "0.3.11" - }, - "devDependencies": { - "shared": "0.0.0", - "typescript": "~5.9.3", - "zero-types": "0.0.0" - } - }, - "packages/zero-protocol/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zero-react": { - "version": "0.0.0", - "devDependencies": { - "@testing-library/react": "^16.3.2", - "@types/react": "^18.3.18", - "react": "^18.3.1", - "shared": "0.0.0", - "zero-client": "0.0.0", - "zero-schema": "0.0.0", - "zql": "0.0.0" - }, - "peerDependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - } - }, - "packages/zero-react-native": { - "version": "0.0.0", - "dependencies": { - "@rocicorp/resolver": "^1.0.2" - }, - "devDependencies": { - "replicache": "15.2.1", - "shared": "0.0.0" - } - }, - "packages/zero-schema": { - "version": "0.0.0", - "devDependencies": { - "shared": "0.0.0", - "zero-protocol": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "packages/zero-server": { - "version": "0.0.0", - "hasInstallScript": true, - "dependencies": { - "@rocicorp/logger": "^5.4.0" - }, - "devDependencies": { - "@prisma/adapter-pg": "^7.2.0", - "@prisma/client": "^7.2.0", - "@vitest/runner": "4.0.15", - "drizzle-orm": "^0.44.2", - "pg": "^8.16.3", - "postgres": "3.4.7", - "prisma": "^7.2.0", - "shared": "0.0.0", - "vitest": "4.0.15", - "z2s": "0.0.0", - "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "packages/zero-solid": { - "version": "0.0.0", - "devDependencies": { - "@solidjs/testing-library": "^0.8.10", - "jsdom": "^26.1.0", - "shared": "0.0.0", - "solid-js": "^1.9.4", - "vite-plugin-solid": "^2.11.7", - "zero-client": "0.0.0" - }, - "peerDependencies": { - "solid-js": "^1.9.4" - } - }, - "packages/zero-types": { - "version": "0.0.0", - "devDependencies": { - "shared": "0.0.0", - "typescript": "~5.9.3", - "vitest": "4.0.15" - } - }, - "packages/zero-types/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zero/node_modules/@expo/cli": { - "version": "54.0.11", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", - "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@0no-co/graphql.web": "^1.0.8", - "@expo/code-signing-certificates": "^0.0.5", - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/devcert": "^1.1.2", - "@expo/env": "~2.0.7", - "@expo/image-utils": "^0.8.7", - "@expo/json-file": "^10.0.7", - "@expo/mcp-tunnel": "~0.0.7", - "@expo/metro": "~54.0.0", - "@expo/metro-config": "~54.0.6", - "@expo/osascript": "^2.3.7", - "@expo/package-manager": "^1.9.8", - "@expo/plist": "^0.4.7", - "@expo/prebuild-config": "^54.0.5", - "@expo/schema-utils": "^0.1.7", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.81.4", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "expo-server": "^1.0.1", - "freeport-async": "^2.0.0", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "lan-network": "^0.1.6", - "minimatch": "^9.0.0", - "node-forge": "^1.3.1", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "^5.6.0", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", - "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^7.4.3", - "terminal-link": "^2.1.1", - "undici": "^6.18.2", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" - }, - "bin": { - "expo-internal": "build/bin/cli" - }, - "peerDependencies": { - "expo": "*", - "expo-router": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "expo-router": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "packages/zero/node_modules/@expo/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/devtools": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", - "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^4.1.2" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "packages/zero/node_modules/@expo/devtools/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/metro-config": { - "version": "54.0.6", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", - "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~12.0.10", - "@expo/env": "~2.0.7", - "@expo/json-file": "~10.0.7", - "@expo/metro": "~54.0.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "hermes-parser": "^0.29.1", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "minimatch": "^9.0.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "expo": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, - "packages/zero/node_modules/@expo/metro-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/prebuild-config": { - "version": "54.0.5", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", - "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/config-types": "^54.0.8", - "@expo/image-utils": "^0.8.7", - "@expo/json-file": "^10.0.7", - "@react-native/normalize-colors": "0.81.4", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "packages/zero/node_modules/@expo/vector-icons": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", - "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "expo-font": ">=14.0.4", - "react": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/@op-engineering/op-sqlite": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.0.7.tgz", - "integrity": "sha512-EExQtz7QPxPWXQ00QjFiHvbohMOrpEzFbWbWZ1BXvZeDafbYJxS6DYRO08w5Q44WnaNbxBfmRc/1/seZuHMI/g==", - "dev": true, - "license": "MIT", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/@react-native/codegen": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", - "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.32.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "packages/zero/node_modules/@react-native/codegen/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "packages/zero/node_modules/@react-native/codegen/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/zero/node_modules/@react-native/codegen/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.32.0" - } - }, - "packages/zero/node_modules/@react-native/codegen/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "packages/zero/node_modules/@react-native/virtualized-lists": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", - "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.1", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/zero/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/babel-preset-expo": { - "version": "54.0.4", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", - "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.81.4", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "@babel/runtime": "^7.20.0", - "expo": "*", - "react-refresh": ">=0.14.0 <1.0.0" - }, - "peerDependenciesMeta": { - "@babel/runtime": { - "optional": true - }, - "expo": { - "optional": true - } - } - }, - "packages/zero/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/zero/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/zero/node_modules/chalk-template": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", - "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "packages/zero/node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "packages/zero/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==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "packages/zero/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "packages/zero/node_modules/expo": { - "version": "54.0.13", - "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.13.tgz", - "integrity": "sha512-F1puKXzw8ESnsbvaKdXtcIiyYLQ2kUHqP8LuhgtJS1wm6w55VhtOPg8yl/0i8kPbTA0YfD+KYdXjSfhPXgUPxw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.20.0", - "@expo/cli": "54.0.11", - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/devtools": "0.1.7", - "@expo/fingerprint": "0.15.1", - "@expo/metro": "~54.0.0", - "@expo/metro-config": "54.0.6", - "@expo/vector-icons": "^15.0.2", - "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~54.0.3", - "expo-asset": "~12.0.9", - "expo-constants": "~18.0.9", - "expo-file-system": "~19.0.17", - "expo-font": "~14.0.9", - "expo-keep-awake": "~15.0.7", - "expo-modules-autolinking": "3.0.15", - "expo-modules-core": "3.0.21", - "pretty-format": "^29.7.0", - "react-refresh": "^0.14.2", - "whatwg-url-without-unicode": "8.0.0-3" - }, - "bin": { - "expo": "bin/cli", - "expo-modules-autolinking": "bin/autolinking", - "fingerprint": "bin/fingerprint" - }, - "peerDependencies": { - "@expo/dom-webview": "*", - "@expo/metro-runtime": "*", - "react": "*", - "react-native": "*", - "react-native-webview": "*" - }, - "peerDependenciesMeta": { - "@expo/dom-webview": { - "optional": true - }, - "@expo/metro-runtime": { - "optional": true - }, - "react-native-webview": { - "optional": true - } - } - }, - "packages/zero/node_modules/expo-asset": { - "version": "12.0.9", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", - "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/image-utils": "^0.8.7", - "expo-constants": "~18.0.9" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/expo-constants": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", - "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config": "~12.0.9", - "@expo/env": "~2.0.7" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/expo-file-system": { - "version": "19.0.17", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", - "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/expo-font": { - "version": "14.0.9", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.9.tgz", - "integrity": "sha512-xCoQbR/36qqB6tew/LQ6GWICpaBmHLhg/Loix5Rku/0ZtNaXMJv08M9o1AcrdiGTn/Xf/BnLu6DgS45cWQEHZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fontfaceobserver": "^2.1.0" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/expo-keep-awake": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", - "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react": "*" - } - }, - "packages/zero/node_modules/expo-modules-core": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", - "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/expo-sqlite": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-16.0.10.tgz", - "integrity": "sha512-tUOKxE9TpfneRG3eOfbNfhN9236SJ7IiUnP8gCqU7umd9DtgDGB/5PhYVVfl+U7KskgolgNoB9v9OZ9iwXN8Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "await-lock": "^2.2.2" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "packages/zero/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "packages/zero/node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/zero/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==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "packages/zero/node_modules/nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "packages/zero/node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "packages/zero/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "packages/zero/node_modules/postcss/node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "packages/zero/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/zero/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/zero/node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/zero/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/react-native": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.82.0.tgz", - "integrity": "sha512-E+sBFDgpwzoZzPn86gSGRBGLnS9Q6r4y6Xk5I57/QbkqkDOxmQb/bzQq/oCdUCdHImKiow2ldC3WJfnvAKIfzg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.82.0", - "@react-native/codegen": "0.82.0", - "@react-native/community-cli-plugin": "0.82.0", - "@react-native/gradle-plugin": "0.82.0", - "@react-native/js-polyfills": "0.82.0", - "@react-native/normalize-colors": "0.82.0", - "@react-native/virtualized-lists": "0.82.0", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.32.0", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "hermes-compiler": "0.0.0", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.1", - "metro-source-map": "^0.83.1", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.26.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.1", - "react": "^19.1.1" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/zero/node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", - "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-parser": "0.32.0" - } - }, - "packages/zero/node_modules/react-native/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "packages/zero/node_modules/react-native/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/zero/node_modules/react-native/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.32.0" - } - }, - "packages/zero/node_modules/react-native/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "packages/zero/node_modules/react-native/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "packages/zero/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "packages/zero/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", - "dev": true, - "license": "ISC", - "peer": true, - "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" - } - }, - "packages/zero/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zero/node_modules/undici": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", - "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18.17" - } - }, - "packages/zero/node_modules/vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "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", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.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 - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "packages/zero/node_modules/vite/node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "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" - } - }, - "packages/zero/node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "packages/zero/node_modules/vite/node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "packages/zero/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==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "packages/zql": { - "version": "0.0.0", - "dependencies": { - "@rocicorp/resolver": "^1.0.2", - "compare-utf8": "^0.1.1" - }, - "devDependencies": { - "@faker-js/faker": "^9.6.0", - "@rocicorp/logger": "^5.4.0", - "@standard-schema/spec": "^1.0.0", - "fast-check": "^3.18.0", - "nanoid": "^5.1.2", - "shared": "0.0.0", - "typescript": "~5.9.3", - "zero-protocol": "0.0.0", - "zero-types": "0.0.0" - } - }, - "packages/zql-benchmarks": { - "version": "0.0.0", - "dependencies": { - "mitata": "^1.0.34" - }, - "devDependencies": { - "@types/tmp": "^0.2.6", - "otel": "0.0.0", - "shared": "0.0.0", - "typescript": "~5.9.3", - "zero-cache": "0.0.0", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0", - "zql-integration-tests": "0.0.0", - "zqlite": "0.0.0" - } - }, - "packages/zql-benchmarks/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zql-integration-tests": { - "version": "0.0.0", - "devDependencies": { - "@types/tmp": "^0.2.6", - "otel": "0.0.0", - "shared": "0.0.0", - "typescript": "~5.9.3", - "z2s": "0.0.0", - "zero-cache": "0.0.0", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-server": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0", - "zqlite": "0.0.0" - } - }, - "packages/zql-integration-tests/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zql-to-sql": { - "version": "0.0.0", - "extraneous": true, - "dependencies": { - "@databases/escape-identifier": "^1.0.3", - "@databases/sql": "^3.3.0", - "vitest": "^2.1.5" - } - }, - "packages/zql/node_modules/nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "packages/zql/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zqlite": { - "version": "0.0.0", - "dependencies": { - "@databases/escape-identifier": "^1.0.3", - "@databases/sql": "^3.3.0", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/zero-sqlite3": "^1.0.15", - "zql": "0.0.0" - }, - "devDependencies": { - "@rocicorp/logger": "^5.4.0", - "fast-check": "^3.18.0", - "nanoid": "^5.1.2", - "otel": "0.0.0", - "shared": "0.0.0", - "typescript": "~5.9.3", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "packages/zqlite-zero-cache-shared": { - "version": "0.0.0", - "extraneous": true, - "dependencies": { - "shared": "0.0.0" - }, - "devDependencies": { - "typescript": "^5.5.3", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.0.3" - } - }, - "packages/zqlite-zql-test": { - "version": "0.0.0", - "dependencies": { - "zqlite": "0.0.0" - }, - "devDependencies": { - "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.0.15", - "shared": "0.0.0", - "typescript": "~5.9.3", - "vitest": "4.0.15" - } - }, - "packages/zqlite-zql-test/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/zqlite/node_modules/nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "packages/zqlite/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "prod": { - "version": "0.0.0" - }, - "prod/functions": { - "version": "0.0.0", - "extraneous": true, - "dependencies": { - "@rocicorp/zero": "0.16.2025022000" - } - }, - "tools/ast-to-zql": { - "version": "0.0.0", - "extraneous": true, - "devDependencies": { - "@rocicorp/eslint-config": "^0.7.0", - "@rocicorp/prettier-config": "^0.3.0" - } - }, - "tools/client-simulator": { - "version": "0.0.0", - "dependencies": { - "@dotenvx/dotenvx": "^1.39.0", - "@rocicorp/logger": "^5.4.0", - "nanoid": "^5.1.2", - "ws": "^8.18.1" - }, - "devDependencies": { - "shared": "0.0.0", - "zero-protocol": "0.0.0" - } - }, - "tools/client-simulator/node_modules/nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "tools/load-generator": { - "version": "0.0.0", - "dependencies": { - "@dotenvx/dotenvx": "^1.39.0", - "@rocicorp/logger": "^5.4.0", - "nanoid": "^5.1.2", - "pg-format": "npm:pg-format-fix@^1.0.5", - "postgres": "3.4.7" - }, - "devDependencies": { - "shared": "0.0.0" - } - }, - "tools/load-generator/node_modules/nanoid": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", - "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "tools/process-tracker": { - "version": "0.0.0", - "dependencies": { - "@rocicorp/logger": "^5.4.0", - "find-process": "^1.4.10", - "pidusage": "^4.0.0" - }, - "devDependencies": { - "@types/pidusage": "^2.0.5", - "shared": "0.0.0" - } - }, - "tools/sqlite-io-yield-simulator": { - "version": "0.0.0", - "dependencies": { - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "ws": "^8.18.1", - "zqlite": "0.0.0" - }, - "devDependencies": { - "shared": "0.0.0" - } - }, - "tools/verify-package-deps": { - "version": "0.0.0", - "dependencies": { - "oxc-parser": "^0.94.0" - }, - "devDependencies": { - "@types/node": "^22.10.5", - "typescript": "~5.9.3" - }, - "engines": { - "node": ">=22" - } - }, - "tools/verify-package-deps/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - } - }, - "dependencies": { - "@0no-co/graphql.web": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", - "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", - "dev": true, - "peer": true, - "requires": {} - }, - "@ai-sdk/gateway": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.21.tgz", - "integrity": "sha512-BwV7DU/lAm3Xn6iyyvZdWgVxgLu3SNXzl5y57gMvkW4nGhAOV5269IrJzQwGt03bb107sa6H6uJwWxc77zXoGA==", - "requires": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", - "@vercel/oidc": "3.0.5" - } - }, - "@ai-sdk/provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", - "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", - "requires": { - "json-schema": "^0.4.0" - } - }, - "@ai-sdk/provider-utils": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.19.tgz", - "integrity": "sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA==", - "requires": { - "@ai-sdk/provider": "2.0.0", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" - } - }, - "@ai-sdk/react": { - "version": "2.0.115", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.115.tgz", - "integrity": "sha512-Etu7gWSEi2dmXss1PoR5CAZGwGShXsF9+Pon1eRO6EmatjYaBMhq1CfHPyYhGzWrint8jJIK2VaAhiMef29qZw==", - "requires": { - "@ai-sdk/provider-utils": "3.0.19", - "ai": "5.0.113", - "swr": "^2.2.5", - "throttleit": "2.1.0" - } - }, - "@algolia/abtesting": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.0.tgz", - "integrity": "sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/autocomplete-core": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", - "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", - "requires": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", - "@algolia/autocomplete-shared": "1.19.2" - } - }, - "@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", - "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", - "requires": { - "@algolia/autocomplete-shared": "1.19.2" - } - }, - "@algolia/autocomplete-shared": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", - "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", - "requires": {} - }, - "@algolia/client-abtesting": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.0.tgz", - "integrity": "sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/client-analytics": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.0.tgz", - "integrity": "sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/client-common": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.0.tgz", - "integrity": "sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==" - }, - "@algolia/client-insights": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.0.tgz", - "integrity": "sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/client-personalization": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.0.tgz", - "integrity": "sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/client-query-suggestions": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.0.tgz", - "integrity": "sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/client-search": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", - "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "@algolia/ingestion": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.0.tgz", - "integrity": "sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/monitoring": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.0.tgz", - "integrity": "sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/recommend": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.0.tgz", - "integrity": "sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==", - "requires": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.0.tgz", - "integrity": "sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==", - "requires": { - "@algolia/client-common": "5.46.0" - } - }, - "@algolia/requester-fetch": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.0.tgz", - "integrity": "sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==", - "requires": { - "@algolia/client-common": "5.46.0" - } - }, - "@algolia/requester-node-http": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.0.tgz", - "integrity": "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==", - "requires": { - "@algolia/client-common": "5.46.0" - } - }, - "@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true - }, - "@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", - "dev": true, - "requires": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - } - } - }, - "@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", - "requires": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "requires": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "requires": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "requires": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - } - }, - "@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "requires": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - } - } - } - }, - "@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "requires": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "requires": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - } - }, - "@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "requires": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - } - } - } - }, - "@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "requires": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "requires": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "requires": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - } - }, - "@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "requires": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - } - } - } - }, - "@aws-sdk/client-s3": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.844.0.tgz", - "integrity": "sha512-Yhp8+U4KFVQqL6phZ5yrHF5PdCvKWbYtLSS+egAfAW+N5w78amhbZcctervj59uqOZHMGDWXuDBklN+7eVfasg==", - "requires": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/credential-provider-node": "3.844.0", - "@aws-sdk/middleware-bucket-endpoint": "3.840.0", - "@aws-sdk/middleware-expect-continue": "3.840.0", - "@aws-sdk/middleware-flexible-checksums": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-location-constraint": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-sdk-s3": "3.844.0", - "@aws-sdk/middleware-ssec": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/signature-v4-multi-region": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/eventstream-serde-browser": "^4.0.4", - "@smithy/eventstream-serde-config-resolver": "^4.1.2", - "@smithy/eventstream-serde-node": "^4.0.4", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-blob-browser": "^4.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/hash-stream-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/md5-js": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.6", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "dependencies": { - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - } - } - }, - "@aws-sdk/client-sso": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.844.0.tgz", - "integrity": "sha512-FktodSx+pfUfIqMjoNwZ6t1xqq/G3cfT7I4JJ0HKHoIIZdoCHQB52x0OzKDtHDJAnEQPInasdPS8PorZBZtHmg==", - "requires": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/core": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.844.0.tgz", - "integrity": "sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.844.0.tgz", - "integrity": "sha512-WB94Ox86MqcZ4CnRjKgopzaSuZH4hMP0GqdOxG4s1it1lRWOIPOHOC1dPiM0Zbj1uqITIhbXUQVXyP/uaJeNkw==", - "requires": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/credential-provider-http": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.844.0.tgz", - "integrity": "sha512-e+efVqfkhpM8zxYeiLNgTUlX+tmtXzVm3bw1A02U9Z9cWBHyQNb8pi90M7QniLoqRURY1B0C2JqkOE61gd4KNg==", - "requires": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.844.0.tgz", - "integrity": "sha512-jc5ArGz2HfAx5QPXD+Ep36+QWyCKzl2TG6Vtl87/vljfLhVD0gEHv8fRsqWEp3Rc6hVfKnCjLW5ayR2HYcow9w==", - "requires": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/credential-provider-env": "3.844.0", - "@aws-sdk/credential-provider-http": "3.844.0", - "@aws-sdk/credential-provider-process": "3.844.0", - "@aws-sdk/credential-provider-sso": "3.844.0", - "@aws-sdk/credential-provider-web-identity": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.844.0.tgz", - "integrity": "sha512-pUqB0StTNyW0R03XjTA3wrQZcie/7FJKSXlYHue921ZXuhLOZpzyDkLNfdRsZTcEoYYWVPSmyS+Eu/g5yVsBNA==", - "requires": { - "@aws-sdk/credential-provider-env": "3.844.0", - "@aws-sdk/credential-provider-http": "3.844.0", - "@aws-sdk/credential-provider-ini": "3.844.0", - "@aws-sdk/credential-provider-process": "3.844.0", - "@aws-sdk/credential-provider-sso": "3.844.0", - "@aws-sdk/credential-provider-web-identity": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.844.0.tgz", - "integrity": "sha512-VCI8XvIDt2WBfk5Gi/wXKPcWTS3OkAbovB66oKcNQalllH8ESDg4SfLNhchdnN8A5sDGj6tIBJ19nk+dQ6GaqQ==", - "requires": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.844.0.tgz", - "integrity": "sha512-UNp/uWufGlb5nWa4dpc6uQnDOB/9ysJJFG95ACowNVL9XWfi1LJO7teKrqNkVhq0CzSJS1tCt3FvX4UfM+aN1g==", - "requires": { - "@aws-sdk/client-sso": "3.844.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/token-providers": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.844.0.tgz", - "integrity": "sha512-iDmX4pPmatjttIScdspZRagaFnCjpHZIEEwTyKdXxUaU0iAOSXF8ecrCEvutETvImPOC86xdrq+MPacJOnMzUA==", - "requires": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-bucket-endpoint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", - "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-expect-continue": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.840.0.tgz", - "integrity": "sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-flexible-checksums": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.844.0.tgz", - "integrity": "sha512-LCImZd1hpM0cegfdpgZyK6x4on4Ky+c9XCFURfE4wil1J9HXf6OP4KsfHQwt1yIkMEbFqvd/ab2I5fmp7S7aFA==", - "requires": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-location-constraint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.840.0.tgz", - "integrity": "sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-sdk-s3": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.844.0.tgz", - "integrity": "sha512-vOD5reqZszXBWMbZFN3EUar203o2i8gcoTdrymY4GMsAPDsh0k8yd3VJRNPuxT/017tP6G+rQepOGzna4umung==", - "requires": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-ssec": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.840.0.tgz", - "integrity": "sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.844.0.tgz", - "integrity": "sha512-SIbDNUL6ZYXPj5Tk0qEz05sW9kNS1Gl3/wNWEmH+AuUACipkyIeKKWzD6z5433MllETh73vtka/JQF3g7AuZww==", - "requires": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@smithy/core": "^3.7.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/nested-clients": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.844.0.tgz", - "integrity": "sha512-p2XILWc7AcevUSpBg2VtQrk79eWQC4q2JsCSY7HxKpFLZB4mMOfmiTyYkR1gEA6AttK/wpCOtfz+hi1/+z2V1A==", - "requires": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/s3-request-presigner": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.844.0.tgz", - "integrity": "sha512-i953TKW1rXbd9G2xEgWoJZDoF0Z1ONRlrXkOKDGOrY/uQhAIPNDz5k6tFcXG5oIaLWW197ShENv3CeEJnhfh3g==", - "requires": { - "@aws-sdk/signature-v4-multi-region": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-format-url": "3.840.0", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/signature-v4-multi-region": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.844.0.tgz", - "integrity": "sha512-QC8nocQcZ3Bj7vTnuL47iNhcuUjMC46E2L85mU+sPQo3LN2qBVGSOTF+xSWGvmSFDpkN4ZXUMVeA0cJoJFEDFA==", - "requires": { - "@aws-sdk/middleware-sdk-s3": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/token-providers": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.844.0.tgz", - "integrity": "sha512-Kh728FEny0fil+LeH8U1offPJCTd/EDh8liBAvLtViLHt2WoX2xC8rk98D38Q5p79aIUhHb3Pf4n9IZfTu/Kog==", - "requires": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/util-arn-parser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", - "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.844.0.tgz", - "integrity": "sha512-1DHh0WTUmxlysz3EereHKtKoxVUG9UC5BsfAw6Bm4/6qDlJiqtY3oa2vebkYN23yltKdfsCK65cwnBRU59mWVg==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/util-format-url": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.840.0.tgz", - "integrity": "sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/util-locate-window": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", - "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", - "requires": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.844.0.tgz", - "integrity": "sha512-0eTpURp9Gxbyyeqr78ogARZMSWS5KUMZuN+XMHxNpQLmn2S+J3g+MAyoklCcwhKXlbdQq2aMULEiy0mqIWytuw==", - "requires": { - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "requires": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - } - }, - "@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==" - }, - "@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "requires": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "requires": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "requires": { - "@babel/types": "^7.27.3" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "requires": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "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==", - "requires": { - "yallist": "^3.0.2" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "requires": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - } - }, - "@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "requires": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "requires": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - } - }, - "@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "requires": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "requires": { - "@babel/types": "^7.27.1" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "requires": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - } - }, - "@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" - }, - "@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" - }, - "@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" - }, - "@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", - "requires": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" - } - }, - "@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "requires": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - } - }, - "@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "requires": { - "@babel/types": "^7.28.5" - } - }, - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - } - }, - "@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", - "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-decorators": "^7.27.1" - } - }, - "@babel/plugin-proposal-export-default-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", - "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-default-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", - "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", - "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "requires": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", - "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-flow": "^7.27.1" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "requires": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "requires": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "requires": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", - "requires": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "requires": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", - "requires": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.25.9" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", - "requires": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz", - "integrity": "sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", - "requires": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.28.5", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", - "semver": "^6.3.1" - }, - "dependencies": { - "babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", - "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" - } - }, - "@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" - } - }, - "@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/runtime-corejs3": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", - "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", - "requires": { - "core-js-pure": "^3.43.0" - } - }, - "@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "requires": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - } - }, - "@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "requires": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - } - }, - "@babel/traverse--for-generate-function-map": { - "version": "npm:@babel/traverse@7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", - "debug": "^4.3.1" - } - }, - "@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "requires": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - } - }, - "@badrap/valita": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@badrap/valita/-/valita-0.3.11.tgz", - "integrity": "sha512-oak0W8bycFjnrLeVCVvZqkOWTGh74wCPKUxGLJyhRukRs+V/hQdfZp1eDcQE4Gf3UrtJWfR/Ou4Xe0DZqJZ2FA==" - }, - "@balena/dockerignore": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", - "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", - "dev": true - }, - "@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@chevrotain/gast": "10.5.0", - "@chevrotain/types": "10.5.0", - "lodash": "4.17.21" - } - }, - "@chevrotain/gast": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", - "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==", - "dev": true, - "requires": { - "@chevrotain/types": "10.5.0", - "lodash": "4.17.21" - } - }, - "@chevrotain/types": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz", - "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==", - "dev": true - }, - "@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==", - "dev": true - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@csstools/cascade-layer-name-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", - "requires": {} - }, - "@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==" - }, - "@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "requires": {} - }, - "@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", - "requires": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" - } - }, - "@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "requires": {} - }, - "@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" - }, - "@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", - "requires": {} - }, - "@csstools/postcss-alpha-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", - "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-color-function-display-p3-linear": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-color-mix-function": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-content-alt-text": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", - "requires": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-contrast-color-function": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", - "requires": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-gamut-mapping": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-initial": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", - "requires": {} - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-light-dark-function": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", - "requires": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-logical-float-and-clear": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", - "requires": {} - }, - "@csstools/postcss-logical-overflow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", - "requires": {} - }, - "@csstools/postcss-logical-overscroll-behavior": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", - "requires": {} - }, - "@csstools/postcss-logical-resize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", - "requires": { - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0" - } - }, - "@csstools/postcss-media-minmax": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", - "requires": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - } - }, - "@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", - "requires": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - } - }, - "@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-position-area-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", - "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", - "requires": {} - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-random-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", - "requires": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "@csstools/postcss-relative-color-syntax": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - } - } - }, - "@csstools/postcss-scope-pseudo-class": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", - "requires": { - "postcss-selector-parser": "^7.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - } - } - }, - "@csstools/postcss-sign-functions": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", - "requires": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-system-ui-font-family": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", - "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", - "requires": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "dev": true, - "requires": {} - }, - "@csstools/utilities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", - "requires": {} - }, - "@databases/escape-identifier": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@databases/escape-identifier/-/escape-identifier-1.0.3.tgz", - "integrity": "sha512-Su36iSVzaHxpVdISVMViUX/32sLvzxVgjZpYhzhotxZUuLo11GVWsiHwqkvUZijTLUxcDmUqEwGJO3O/soLuZA==", - "requires": { - "@databases/validate-unicode": "^1.0.0" - } - }, - "@databases/sql": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@databases/sql/-/sql-3.3.0.tgz", - "integrity": "sha512-vj9huEy4mjJ48GS1Z8yvtMm4BYAnFYACUds25ym6Gd/gsnngkJ17fo62a6mmbNNwCBS/8467PmZR01Zs/06TjA==" - }, - "@databases/validate-unicode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@databases/validate-unicode/-/validate-unicode-1.0.0.tgz", - "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==" - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" - }, - "@docsearch/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.3.1.tgz", - "integrity": "sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ==", - "requires": {} - }, - "@docsearch/css": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.3.2.tgz", - "integrity": "sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==" - }, - "@docsearch/react": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.3.2.tgz", - "integrity": "sha512-74SFD6WluwvgsOPqifYOviEEVwDxslxfhakTlra+JviaNcs7KK/rjsPj89kVEoQc9FUxRkAofaJnHIR7pb4TSQ==", - "requires": { - "@ai-sdk/react": "^2.0.30", - "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.3.1", - "@docsearch/css": "4.3.2", - "ai": "^5.0.30", - "algoliasearch": "^5.28.0", - "marked": "^16.3.0", - "zod": "^4.1.8" - }, - "dependencies": { - "zod": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.0.tgz", - "integrity": "sha512-Bd5fw9wlIhtqCCxotZgdTOMwGm1a0u75wARVEY9HMs1X17trvA/lMi4+MGK5EUfYkXVTbX8UDiDKW4OgzHVUZw==" - } - } - }, - "@docusaurus/babel": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", - "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", - "requires": { - "@babel/core": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.25.9", - "@babel/preset-env": "^7.25.9", - "@babel/preset-react": "^7.25.9", - "@babel/preset-typescript": "^7.25.9", - "@babel/runtime": "^7.25.9", - "@babel/runtime-corejs3": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - } - }, - "@docusaurus/bundler": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", - "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", - "requires": { - "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.9.2", - "@docusaurus/cssnano-preset": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "file-loader": "^6.2.0", - "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.2", - "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "webpack": "^5.95.0", - "webpackbar": "^6.0.1" - }, - "dependencies": { - "@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", - "requires": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - } - }, - "@csstools/postcss-color-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", - "requires": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", - "requires": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - } - }, - "@csstools/postcss-nested-calc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", - "requires": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", - "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", - "requires": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", - "requires": { - "@csstools/color-helpers": "^5.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", - "requires": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "@csstools/postcss-unset-value": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", - "requires": {} - }, - "@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "requires": {} - }, - "css-blank-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "css-has-pseudo": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", - "requires": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "css-prefers-color-scheme": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", - "requires": {} - }, - "cssdb": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.5.2.tgz", - "integrity": "sha512-Pmoj9RmD8RIoIzA2EQWO4D4RMeDts0tgAH0VXdlNdxjuBGI3a9wMOIcUwaPNmD4r2qtIa06gqkIf7sECl+cBCg==" - }, - "postcss-attribute-case-insensitive": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", - "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-color-functional-notation": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", - "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - } - }, - "postcss-color-hex-alpha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", - "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", - "requires": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", - "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", - "requires": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", - "requires": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - } - }, - "postcss-custom-properties": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", - "requires": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", - "requires": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-dir-pseudo-class": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", - "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-double-position-gradients": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", - "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", - "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-focus-within": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", - "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-gap-properties": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", - "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", - "requires": {} - }, - "postcss-image-set-function": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", - "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", - "requires": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-lab-function": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", - "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", - "requires": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - } - }, - "postcss-logical": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", - "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", - "requires": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-opacity-percentage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", - "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", - "requires": {} - }, - "postcss-overflow-shorthand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", - "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-place": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", - "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.5.0.tgz", - "integrity": "sha512-xgxFQPAPxeWmsgy8cR7GM1PGAL/smA5E9qU7K//D4vucS01es3M0fDujhDJn3kY8Ip7/vVYcecbe1yY+vBo3qQ==", - "requires": { - "@csstools/postcss-alpha-function": "^1.0.1", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@csstools/postcss-color-function": "^4.0.12", - "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", - "@csstools/postcss-color-mix-function": "^3.0.12", - "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", - "@csstools/postcss-content-alt-text": "^2.0.8", - "@csstools/postcss-contrast-color-function": "^2.0.12", - "@csstools/postcss-exponential-functions": "^2.0.9", - "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.11", - "@csstools/postcss-gradients-interpolation-method": "^5.0.12", - "@csstools/postcss-hwb-function": "^4.0.12", - "@csstools/postcss-ic-unit": "^4.0.4", - "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.11", - "@csstools/postcss-logical-float-and-clear": "^3.0.0", - "@csstools/postcss-logical-overflow": "^2.0.0", - "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", - "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.4", - "@csstools/postcss-media-minmax": "^2.0.9", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", - "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.12", - "@csstools/postcss-position-area-property": "^1.0.0", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.12", - "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.4", - "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-system-ui-font-family": "^1.0.0", - "@csstools/postcss-text-decoration-shorthand": "^4.0.3", - "@csstools/postcss-trigonometric-functions": "^4.0.9", - "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.22", - "browserslist": "^4.28.0", - "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.3", - "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.5.2", - "postcss-attribute-case-insensitive": "^7.0.1", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.12", - "postcss-color-hex-alpha": "^10.0.0", - "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.6", - "postcss-custom-selectors": "^8.0.5", - "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.4", - "postcss-focus-visible": "^10.0.1", - "postcss-focus-within": "^9.0.1", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^6.0.0", - "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.12", - "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", - "postcss-opacity-percentage": "^3.0.0", - "postcss-overflow-shorthand": "^6.0.0", - "postcss-page-break": "^3.0.4", - "postcss-place": "^10.0.0", - "postcss-pseudo-class-any-link": "^10.0.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^8.0.1" - } - }, - "postcss-pseudo-class-any-link": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", - "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-selector-not": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", - "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - } - } - }, - "@docusaurus/core": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", - "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", - "requires": { - "@docusaurus/babel": "3.9.2", - "@docusaurus/bundler": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "core-js": "^3.31.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "execa": "5.1.1", - "fs-extra": "^11.1.1", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.6.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "open": "^8.4.0", - "p-map": "^4.0.0", - "prompts": "^2.4.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.6", - "tinypool": "^1.0.2", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "webpack": "^5.95.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^5.2.2", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - } - } - }, - "@docusaurus/cssnano-preset": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", - "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", - "requires": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - } - }, - "@docusaurus/logger": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", - "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", - "requires": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - } - }, - "@docusaurus/mdx-loader": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", - "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", - "requires": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "dependencies": { - "image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==" - } - } - }, - "@docusaurus/module-type-aliases": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", - "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", - "requires": { - "@docusaurus/types": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - } - }, - "@docusaurus/plugin-content-blog": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", - "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "cheerio": "1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - } - }, - "@docusaurus/plugin-content-docs": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", - "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - } - }, - "@docusaurus/plugin-content-pages": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", - "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - } - }, - "@docusaurus/plugin-css-cascade-layers": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", - "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - } - }, - "@docusaurus/plugin-debug": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", - "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" - } - }, - "@docusaurus/plugin-google-analytics": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", - "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - } - }, - "@docusaurus/plugin-google-gtag": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", - "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" - } - }, - "@docusaurus/plugin-google-tag-manager": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", - "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - } - }, - "@docusaurus/plugin-sitemap": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", - "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - } - }, - "@docusaurus/plugin-svgr": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", - "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - } - }, - "@docusaurus/preset-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", - "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/plugin-css-cascade-layers": "3.9.2", - "@docusaurus/plugin-debug": "3.9.2", - "@docusaurus/plugin-google-analytics": "3.9.2", - "@docusaurus/plugin-google-gtag": "3.9.2", - "@docusaurus/plugin-google-tag-manager": "3.9.2", - "@docusaurus/plugin-sitemap": "3.9.2", - "@docusaurus/plugin-svgr": "3.9.2", - "@docusaurus/theme-classic": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-search-algolia": "3.9.2", - "@docusaurus/types": "3.9.2" - } - }, - "@docusaurus/theme-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", - "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "infima": "0.2.0-alpha.45", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.5.4", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", - "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", - "requires": { - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-search-algolia": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", - "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", - "requires": { - "@docsearch/react": "^3.9.0 || ^4.1.0", - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "algoliasearch": "^5.37.0", - "algoliasearch-helper": "^3.26.0", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-translations": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", - "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", - "requires": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - } - }, - "@docusaurus/tsconfig": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", - "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", - "dev": true - }, - "@docusaurus/types": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", - "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", - "requires": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - } - } - } - }, - "@docusaurus/utils": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", - "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", - "requires": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "escape-string-regexp": "^4.0.0", - "execa": "5.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "p-queue": "^6.6.2", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - } - }, - "@docusaurus/utils-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", - "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", - "requires": { - "@docusaurus/types": "3.9.2", - "tslib": "^2.6.0" - } - }, - "@docusaurus/utils-validation": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", - "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", - "requires": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - } - }, - "@dotenvx/dotenvx": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.39.0.tgz", - "integrity": "sha512-qGfDpL/3S17MQYXpR3HkBS5xNQ7wiFlqLdpr+iIQzv17aMRcSlgL4EjMIsYFZ540Dq17J+y5FVElA1AkVoXiUA==", - "requires": { - "commander": "^11.1.0", - "dotenv": "^16.4.5", - "eciesjs": "^0.4.10", - "execa": "^5.1.1", - "fdir": "^6.2.0", - "ignore": "^5.3.0", - "object-treeify": "1.1.33", - "picomatch": "^4.0.2", - "which": "^4.0.0" - }, - "dependencies": { - "commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==" - }, - "fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", - "requires": {} - }, - "isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" - }, - "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" - }, - "which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "requires": { - "isexe": "^3.1.1" - } - } - } - }, - "@drdgvhbh/postgres-error-codes": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@drdgvhbh/postgres-error-codes/-/postgres-error-codes-0.0.6.tgz", - "integrity": "sha512-tAz0Xp+qhq90x0r/3VW96iRdHFw72cYQqXa65u0eFVhSMC27bc2gZ8Ky5WXEmshrl/bCe7QTYBNEF0U5zeSQjw==" - }, - "@drizzle-team/brocli": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", - "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", - "dev": true - }, - "@ecies/ciphers": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.3.tgz", - "integrity": "sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA==", - "requires": {} - }, - "@edge-runtime/format": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.1.tgz", - "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==" - }, - "@edge-runtime/node-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz", - "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==" - }, - "@edge-runtime/ponyfill": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz", - "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==" - }, - "@edge-runtime/primitives": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz", - "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==" - }, - "@edge-runtime/vm": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz", - "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==", - "requires": { - "@edge-runtime/primitives": "4.1.0" - } - }, - "@electric-sql/pglite": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", - "integrity": "sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==", - "dev": true - }, - "@electric-sql/pglite-socket": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.0.6.tgz", - "integrity": "sha512-6RjmgzphIHIBA4NrMGJsjNWK4pu+bCWJlEWlwcxFTVY3WT86dFpKwbZaGWZV6C5Rd7sCk1Z0CI76QEfukLAUXw==", - "dev": true, - "requires": {} - }, - "@electric-sql/pglite-tools": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.2.7.tgz", - "integrity": "sha512-9dAccClqxx4cZB+Ar9B+FZ5WgxDc/Xvl9DPrTWv+dYTf0YNubLzi4wHHRGRGhrJv15XwnyKcGOZAP1VXSneSUg==", - "dev": true, - "requires": {} - }, - "@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", - "optional": true, - "requires": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@esbuild-kit/core-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", - "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "dev": true, - "requires": { - "esbuild": "~0.18.20", - "source-map-support": "^0.5.21" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - } - } - }, - "@esbuild-kit/esm-loader": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "dev": true, - "requires": { - "@esbuild-kit/core-utils": "^3.3.2", - "get-tsconfig": "^4.7.0" - } - }, - "@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", - "optional": true - }, - "@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", - "optional": true - }, - "@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", - "optional": true - }, - "@expo/code-signing-certificates": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", - "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", - "dev": true, - "peer": true, - "requires": { - "node-forge": "^1.2.1", - "nullthrows": "^1.1.1" - } - }, - "@expo/config": { - "version": "12.0.13", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", - "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.4", - "@expo/config-types": "^54.0.10", - "@expo/json-file": "^10.0.8", - "deepmerge": "^4.3.1", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", - "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "~3.35.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "peer": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - } - }, - "lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true - }, - "minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/brace-expansion": "^5.0.0" - } - }, - "path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - } - } - } - }, - "@expo/config-plugins": { - "version": "54.0.4", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", - "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", - "dev": true, - "peer": true, - "requires": { - "@expo/config-types": "^54.0.10", - "@expo/json-file": "~10.0.8", - "@expo/plist": "^0.4.8", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - }, - "dependencies": { - "glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - } - }, - "lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true - }, - "minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/brace-expansion": "^5.0.0" - } - }, - "path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - } - } - } - }, - "@expo/config-types": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", - "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "dev": true, - "peer": true - }, - "@expo/devcert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", - "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", - "dev": true, - "peer": true, - "requires": { - "@expo/sudo-prompt": "^9.3.1", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@expo/env": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", - "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0" - } - }, - "@expo/fingerprint": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.1.tgz", - "integrity": "sha512-U1S9DwiapCHQjHdHDDyO/oXsl/1oEHSHZRRkWDDrHgXRUDiAVIySw9Unvvcr118Ee6/x4NmKSZY1X0VagrqmFg==", - "dev": true, - "peer": true, - "requires": { - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - }, - "dependencies": { - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true - }, - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@expo/image-utils": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", - "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", - "dev": true, - "peer": true, - "requires": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "getenv": "^2.0.0", - "jimp-compact": "0.16.1", - "parse-png": "^2.1.0", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", - "semver": "^7.6.0", - "temp-dir": "~2.0.0", - "unique-string": "~2.0.0" - }, - "dependencies": { - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "peer": true - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "peer": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - } - } - }, - "@expo/json-file": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", - "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "peer": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - } - } - }, - "@expo/mcp-tunnel": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", - "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", - "dev": true, - "peer": true, - "requires": { - "ws": "^8.18.3", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.24.6" - } - }, - "@expo/metro": { - "version": "54.0.0", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.0.0.tgz", - "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", - "dev": true, - "peer": true, - "requires": { - "metro": "0.83.1", - "metro-babel-transformer": "0.83.1", - "metro-cache": "0.83.1", - "metro-cache-key": "0.83.1", - "metro-config": "0.83.1", - "metro-core": "0.83.1", - "metro-file-map": "0.83.1", - "metro-resolver": "0.83.1", - "metro-runtime": "0.83.1", - "metro-source-map": "0.83.1", - "metro-transform-plugins": "0.83.1", - "metro-transform-worker": "0.83.1" - } - }, - "@expo/osascript": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", - "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", - "dev": true, - "peer": true, - "requires": { - "@expo/spawn-async": "^1.7.2", - "exec-async": "^2.2.0" - } - }, - "@expo/package-manager": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", - "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", - "dev": true, - "peer": true, - "requires": { - "@expo/json-file": "^10.0.8", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "resolve-workspace-root": "^2.0.0" - } - }, - "@expo/plist": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", - "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", - "dev": true, - "peer": true, - "requires": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.2.3", - "xmlbuilder": "^15.1.1" - } - }, - "@expo/schema-utils": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", - "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "dev": true, - "peer": true - }, - "@expo/sdk-runtime-versions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", - "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "dev": true, - "peer": true - }, - "@expo/spawn-async": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", - "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", - "dev": true, - "peer": true, - "requires": { - "cross-spawn": "^7.0.3" - } - }, - "@expo/sudo-prompt": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", - "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "dev": true, - "peer": true - }, - "@expo/ws-tunnel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", - "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "dev": true, - "peer": true - }, - "@expo/xcpretty": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", - "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "7.10.4", - "chalk": "^4.1.0", - "find-up": "^5.0.0", - "js-yaml": "^4.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "peer": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "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, - "peer": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "peer": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "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, - "peer": true, - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "@faker-js/faker": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.6.0.tgz", - "integrity": "sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw==" - }, - "@fastify/ajv-compiler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.0.tgz", - "integrity": "sha512-dt0jyLAlay14LpIn4Fg1SY7V5NJ9KH0YFDpYVQY5cgIVBvdI8908AMx5zQ0bBYPGT6Wh+bM3f2caMmOXLP3QsQ==", - "requires": { - "ajv": "^8.12.0", - "ajv-formats": "^3.0.1", - "fast-uri": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "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==" - } - } - }, - "@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" - }, - "@fastify/cookie": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@fastify/cookie/-/cookie-10.0.0.tgz", - "integrity": "sha512-S43spazwAfzm5nKlqq/spAGW+O6r+WQzg5vXXI1ArCXXFa8KBA/tiU3XRVQUehSNtbN5PA6+g183hzh5/dZ6Iw==", - "requires": { - "cookie-signature": "^1.2.1", - "fastify-plugin": "^5.0.0" - }, - "dependencies": { - "cookie-signature": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", - "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==" - } - } - }, - "@fastify/cors": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-10.0.0.tgz", - "integrity": "sha512-kb9fkc/LVbLTQ3lhA+ZZjC/Styzysodo/MTCdVCvTtgHa/gBwxrEEkcp3fuoKIfAQt85wksrpXjUGbw5NQffEQ==", - "requires": { - "fastify-plugin": "^5.0.0", - "mnemonist": "0.39.8" - } - }, - "@fastify/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.0.0.tgz", - "integrity": "sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==" - }, - "@fastify/fast-json-stringify-compiler": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.0.tgz", - "integrity": "sha512-tywfuZfXsyxLC5kEqrMubbFa9vpAxNtuPE7j9w5si1r+6p5b981pDfZ5Y8HBqmjDQl+PABT7cV5jZgXI2j+I5g==", - "requires": { - "fast-json-stringify": "^6.0.0" - } - }, - "@fastify/forwarded": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", - "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==" - }, - "@fastify/merge-json-schemas": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", - "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "@fastify/oauth2": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@fastify/oauth2/-/oauth2-8.0.0.tgz", - "integrity": "sha512-mqB6jcBUfkBvHqJJ3gCi6yqpf0iLhtmKAZL0OuthqlAWzaUfUaoIgBeCB6wc/duMxw41ElzgJUPYCOJ3jhhvOw==", - "requires": { - "@fastify/cookie": "^10.0.0", - "fastify-plugin": "^5.0.0", - "simple-oauth2": "^5.0.0" - } - }, - "@fastify/proxy-addr": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", - "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", - "requires": { - "@fastify/forwarded": "^3.0.0", - "ipaddr.js": "^2.1.0" - } - }, - "@fastify/websocket": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.0.0.tgz", - "integrity": "sha512-T+QeUaIDgEYyn+RN5vbbO2EZBRJOLGyZ5Y/N8dHxNREll4bN8ArRYsuXZ/WAVFZsqjz0HBjLw1eYq7eFwBzfiw==", - "requires": { - "duplexify": "^4.1.3", - "fastify-plugin": "^5.0.0", - "ws": "^8.16.0" - } - }, - "@floating-ui/core": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", - "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", - "requires": { - "@floating-ui/utils": "^0.2.8" - } - }, - "@floating-ui/dom": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", - "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", - "requires": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" - } - }, - "@floating-ui/react": { - "version": "0.26.28", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", - "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", - "requires": { - "@floating-ui/react-dom": "^2.1.2", - "@floating-ui/utils": "^0.2.8", - "tabbable": "^6.0.0" - } - }, - "@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "requires": { - "@floating-ui/dom": "^1.0.0" - } - }, - "@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" - }, - "@gerrit0/mini-shiki": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.20.0.tgz", - "integrity": "sha512-Wa57i+bMpK6PGJZ1f2myxo3iO+K/kZikcyvH8NIqNNZhQUbDav7V9LQmWOXhf946mz5c1NZ19WMsGYiDKTryzQ==", - "dev": true, - "requires": { - "@shikijs/engine-oniguruma": "^3.20.0", - "@shikijs/langs": "^3.20.0", - "@shikijs/themes": "^3.20.0", - "@shikijs/types": "^3.20.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "@google-cloud/precise-date": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", - "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==" - }, - "@graphql-tools/merge": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.1.tgz", - "integrity": "sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg==", - "dev": true, - "requires": { - "@graphql-tools/utils": "8.9.0", - "tslib": "^2.4.0" - }, - "dependencies": { - "@graphql-tools/utils": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.9.0.tgz", - "integrity": "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==", - "dev": true, - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@graphql-tools/schema": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.5.1.tgz", - "integrity": "sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg==", - "dev": true, - "requires": { - "@graphql-tools/merge": "8.3.1", - "@graphql-tools/utils": "8.9.0", - "tslib": "^2.4.0", - "value-or-promise": "1.0.11" - }, - "dependencies": { - "@graphql-tools/utils": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.9.0.tgz", - "integrity": "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==", - "dev": true, - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@graphql-tools/utils": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", - "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", - "dev": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@grpc/grpc-js": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", - "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", - "requires": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - } - }, - "@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", - "requires": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - } - }, - "@hapi/boom": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz", - "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==", - "requires": { - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==" - }, - "@hapi/hoek": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.4.tgz", - "integrity": "sha512-PnsP5d4q7289pS2T2EgGz147BFJ2Jpb4yrEdkpz2IhgEUzos1S7HTl7ezWh1yfYzYlj89KzLdCRkqsP6SIryeQ==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - }, - "dependencies": { - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - } - } - }, - "@hapi/wreck": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.1.0.tgz", - "integrity": "sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w==", - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/hoek": "^11.0.2" - } - }, - "@headlessui/react": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.8.tgz", - "integrity": "sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==", - "requires": { - "@floating-ui/react": "^0.26.16", - "@react-aria/focus": "^3.17.1", - "@react-aria/interactions": "^3.21.3", - "@tanstack/react-virtual": "^3.8.1" - } - }, - "@hono/node-server": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.6.tgz", - "integrity": "sha512-Shz/KjlIeAhfiuE93NDKVdZ7HdBVLQAfdbaXEaoAVO3ic9ibRSLGIQGkcBbFyuLr+7/1D5ZCINM8B+6IvXeMtw==", - "dev": true, - "requires": {} - }, - "@httptoolkit/httpolyglot": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@httptoolkit/httpolyglot/-/httpolyglot-3.0.1.tgz", - "integrity": "sha512-fU9psZBRc49PfdrxFZ8W19SwVQ4+rrc0EYVxmy7H41y6/elaIu5p68wly4uLVt1DPD0K92MdN65GqP3N1ofZKg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@httptoolkit/subscriptions-transport-ws": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@httptoolkit/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.2.tgz", - "integrity": "sha512-YB+gYYVjgYUeJrGkfS91ABeNWCFU7EVcn9Cflf2UXjsIiPJEI6yPxujPcjKv9wIJpM+33KQW/qVEmc+BdIDK2w==", - "dev": true, - "requires": { - "backo2": "^1.0.2", - "eventemitter3": "^3.1.0", - "iterall": "^1.2.1", - "symbol-observable": "^1.0.4", - "ws": "^8.8.0" - }, - "dependencies": { - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true - } - } - }, - "@httptoolkit/util": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@httptoolkit/util/-/util-0.1.8.tgz", - "integrity": "sha512-nFjEfR7pLJW+qksF9uOmRouwDM9ZaBtD/cA0olVHHN3Ti2cQGJr4HI9PVP7+7uUZA+haO5kapfGRSoGajplJXg==", - "dev": true - }, - "@httptoolkit/websocket-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz", - "integrity": "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==", - "dev": true, - "requires": { - "@types/ws": "*", - "duplexify": "^3.5.1", - "inherits": "^2.0.1", - "isomorphic-ws": "^4.0.1", - "readable-stream": "^2.3.3", - "safe-buffer": "^5.1.2", - "ws": "*", - "xtend": "^4.0.0" - }, - "dependencies": { - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true - }, - "@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "requires": { - "@isaacs/balanced-match": "^4.0.1" - } - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "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 - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@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==", - "dev": true, - "peer": true, - "requires": { - "minipass": "^7.0.4" - } - }, - "@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true, - "peer": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "peer": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "peer": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "peer": true - }, - "@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "peer": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "peer": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - } - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - }, - "@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==", - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==" - }, - "@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "requires": {} - }, - "@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "requires": {} - }, - "@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "requires": {} - }, - "@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "requires": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - } - }, - "@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "requires": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - } - }, - "@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "requires": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - } - } - }, - "@mdx-js/mdx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", - "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", - "requires": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "acorn": "^8.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-scope": "^1.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "recma-build-jsx": "^1.0.0", - "recma-jsx": "^1.0.0", - "recma-stringify": "^1.0.0", - "rehype-recma": "^1.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "dependencies": { - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "requires": { - "@types/estree": "^1.0.0" - } - } - } - }, - "@mdx-js/react": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "requires": { - "@types/mdx": "^2.0.0" - } - }, - "@microsoft/api-extractor-model": { - "version": "7.30.7", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.7.tgz", - "integrity": "sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.14.0" - } - }, - "@microsoft/tsdoc": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", - "dev": true - }, - "@microsoft/tsdoc-config": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", - "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "0.15.1", - "ajv": "~8.12.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - } - } - }, - "@monaco-editor/loader": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz", - "integrity": "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==", - "requires": { - "state-local": "^1.0.6" - } - }, - "@monaco-editor/react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", - "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", - "requires": { - "@monaco-editor/loader": "^1.5.0" - } - }, - "@mrleebo/prisma-ast": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@mrleebo/prisma-ast/-/prisma-ast-0.12.1.tgz", - "integrity": "sha512-JwqeCQ1U3fvccttHZq7Tk0m/TMC6WcFAQZdukypW3AzlJYKYTGNVd1ANU2GuhKnv4UQuOFj3oAl0LLG/gxFN1w==", - "dev": true, - "requires": { - "chevrotain": "^10.5.0", - "lilconfig": "^2.1.0" - } - }, - "@napi-rs/wasm-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", - "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", - "optional": true, - "requires": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" - } - }, - "@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==" - }, - "@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", - "requires": { - "@noble/hashes": "1.7.1" - } - }, - "@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==" - }, - "@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==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@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==" - }, - "@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==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", - "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==" - }, - "@octokit/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", - "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", - "requires": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - } - }, - "@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "requires": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" - }, - "@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "requires": { - "@octokit/openapi-types": "^25.1.0" - } - } - } - }, - "@octokit/graphql": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", - "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", - "requires": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^7.0.0" - } - }, - "@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" - }, - "@octokit/request": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", - "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", - "requires": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" - }, - "@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "requires": { - "@octokit/openapi-types": "^25.1.0" - } - } - } - }, - "@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "requires": { - "@octokit/types": "^14.0.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" - }, - "@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "requires": { - "@octokit/openapi-types": "^25.1.0" - } - } - } - }, - "@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", - "requires": { - "@octokit/openapi-types": "^22.2.0" - } - }, - "@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true - }, - "@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "requires": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true - }, - "@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" - }, - "@opentelemetry/api-logs": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.203.0.tgz", - "integrity": "sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==", - "requires": { - "@opentelemetry/api": "^1.3.0" - } - }, - "@opentelemetry/auto-instrumentations-node": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.62.0.tgz", - "integrity": "sha512-h5g+VNJjiyX6u/IQpn36ZCHOENg1QW0GgBOHBcFGnHBBhmTww4R3brExdeuYbvLj3UQY09n+UHFEoMOqkhq07A==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/instrumentation-amqplib": "^0.50.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.54.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.56.0", - "@opentelemetry/instrumentation-bunyan": "^0.49.0", - "@opentelemetry/instrumentation-cassandra-driver": "^0.49.0", - "@opentelemetry/instrumentation-connect": "^0.47.0", - "@opentelemetry/instrumentation-cucumber": "^0.18.0", - "@opentelemetry/instrumentation-dataloader": "^0.21.0", - "@opentelemetry/instrumentation-dns": "^0.47.0", - "@opentelemetry/instrumentation-express": "^0.52.0", - "@opentelemetry/instrumentation-fastify": "^0.48.0", - "@opentelemetry/instrumentation-fs": "^0.23.0", - "@opentelemetry/instrumentation-generic-pool": "^0.47.0", - "@opentelemetry/instrumentation-graphql": "^0.51.0", - "@opentelemetry/instrumentation-grpc": "^0.203.0", - "@opentelemetry/instrumentation-hapi": "^0.50.0", - "@opentelemetry/instrumentation-http": "^0.203.0", - "@opentelemetry/instrumentation-ioredis": "^0.51.0", - "@opentelemetry/instrumentation-kafkajs": "^0.12.0", - "@opentelemetry/instrumentation-knex": "^0.48.0", - "@opentelemetry/instrumentation-koa": "^0.51.0", - "@opentelemetry/instrumentation-lru-memoizer": "^0.48.0", - "@opentelemetry/instrumentation-memcached": "^0.47.0", - "@opentelemetry/instrumentation-mongodb": "^0.56.0", - "@opentelemetry/instrumentation-mongoose": "^0.50.0", - "@opentelemetry/instrumentation-mysql": "^0.49.0", - "@opentelemetry/instrumentation-mysql2": "^0.49.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.49.0", - "@opentelemetry/instrumentation-net": "^0.47.0", - "@opentelemetry/instrumentation-oracledb": "^0.29.0", - "@opentelemetry/instrumentation-pg": "^0.55.0", - "@opentelemetry/instrumentation-pino": "^0.50.0", - "@opentelemetry/instrumentation-redis": "^0.51.0", - "@opentelemetry/instrumentation-restify": "^0.49.0", - "@opentelemetry/instrumentation-router": "^0.48.0", - "@opentelemetry/instrumentation-runtime-node": "^0.17.0", - "@opentelemetry/instrumentation-socket.io": "^0.50.0", - "@opentelemetry/instrumentation-tedious": "^0.22.0", - "@opentelemetry/instrumentation-undici": "^0.14.0", - "@opentelemetry/instrumentation-winston": "^0.48.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.31.3", - "@opentelemetry/resource-detector-aws": "^2.3.0", - "@opentelemetry/resource-detector-azure": "^0.10.0", - "@opentelemetry/resource-detector-container": "^0.7.3", - "@opentelemetry/resource-detector-gcp": "^0.37.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/sdk-node": "^0.203.0" - } - }, - "@opentelemetry/context-async-hooks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.0.1.tgz", - "integrity": "sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==", - "requires": {} - }, - "@opentelemetry/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", - "requires": { - "@opentelemetry/semantic-conventions": "^1.29.0" - } - }, - "@opentelemetry/exporter-logs-otlp-grpc": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.203.0.tgz", - "integrity": "sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw==", - "requires": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/sdk-logs": "0.203.0" - } - }, - "@opentelemetry/exporter-logs-otlp-http": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.203.0.tgz", - "integrity": "sha512-s0hys1ljqlMTbXx2XiplmMJg9wG570Z5lH7wMvrZX6lcODI56sG4HL03jklF63tBeyNwK2RV1/ntXGo3HgG4Qw==", - "requires": { - "@opentelemetry/api-logs": "0.203.0", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/sdk-logs": "0.203.0" - } - }, - "@opentelemetry/exporter-logs-otlp-proto": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.203.0.tgz", - "integrity": "sha512-nl/7S91MXn5R1aIzoWtMKGvqxgJgepB/sH9qW0rZvZtabnsjbf8OQ1uSx3yogtvLr0GzwD596nQKz2fV7q2RBw==", - "requires": { - "@opentelemetry/api-logs": "0.203.0", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-logs": "0.203.0", - "@opentelemetry/sdk-trace-base": "2.0.1" - } - }, - "@opentelemetry/exporter-metrics-otlp-grpc": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.203.0.tgz", - "integrity": "sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==", - "requires": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.203.0", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-metrics": "2.0.1" - } - }, - "@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.203.0.tgz", - "integrity": "sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-metrics": "2.0.1" - } - }, - "@opentelemetry/exporter-metrics-otlp-proto": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.203.0.tgz", - "integrity": "sha512-OZnhyd9npU7QbyuHXFEPVm3LnjZYifuKpT3kTnF84mXeEQ84pJJZgyLBpU4FSkSwUkt/zbMyNAI7y5+jYTWGIg==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.203.0", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-metrics": "2.0.1" - } - }, - "@opentelemetry/exporter-prometheus": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.203.0.tgz", - "integrity": "sha512-2jLuNuw5m4sUj/SncDf/mFPabUxMZmmYetx5RKIMIQyPnl6G6ooFzfeE8aXNRf8YD1ZXNlCnRPcISxjveGJHNg==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-metrics": "2.0.1" - } - }, - "@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.203.0.tgz", - "integrity": "sha512-322coOTf81bm6cAA8+ML6A+m4r2xTCdmAZzGNTboPXRzhwPt4JEmovsFAs+grpdarObd68msOJ9FfH3jxM6wqA==", - "requires": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-trace-base": "2.0.1" - } - }, - "@opentelemetry/exporter-trace-otlp-http": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.203.0.tgz", - "integrity": "sha512-ZDiaswNYo0yq/cy1bBLJFe691izEJ6IgNmkjm4C6kE9ub/OMQqDXORx2D2j8fzTBTxONyzusbaZlqtfmyqURPw==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-trace-base": "2.0.1" - } - }, - "@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.203.0.tgz", - "integrity": "sha512-1xwNTJ86L0aJmWRwENCJlH4LULMG2sOXWIVw+Szta4fkqKVY50Eo4HoVKKq6U9QEytrWCr8+zjw0q/ZOeXpcAQ==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-trace-base": "2.0.1" - } - }, - "@opentelemetry/exporter-zipkin": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.0.1.tgz", - "integrity": "sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-trace-base": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - } - }, - "@opentelemetry/instrumentation": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.203.0.tgz", - "integrity": "sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==", - "requires": { - "@opentelemetry/api-logs": "0.203.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1" - } - }, - "@opentelemetry/instrumentation-amqplib": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.50.0.tgz", - "integrity": "sha512-kwNs/itehHG/qaQBcVrLNcvXVPW0I4FCOVtw3LHMLdYIqD7GJ6Yv2nX+a4YHjzbzIeRYj8iyMp0Bl7tlkidq5w==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-aws-lambda": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.54.0.tgz", - "integrity": "sha512-uiYI+kcMUJ/H9cxAwB8c9CaG8behLRgcYSOEA8M/tMQ54Y1ZmzAuEE3QKOi21/s30x5Q+by9g7BwiVfDtqzeMA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/aws-lambda": "8.10.150" - } - }, - "@opentelemetry/instrumentation-aws-sdk": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.56.0.tgz", - "integrity": "sha512-Jl2B/FYEb6tBCk9G31CMomKPikGU2g+CEhrGddDI0o1YeNpg3kAO9dExF+w489/IJUGZX6/wudyNvV7z4k9NjQ==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/propagation-utils": "^0.31.3", - "@opentelemetry/semantic-conventions": "^1.34.0" - } - }, - "@opentelemetry/instrumentation-bunyan": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.49.0.tgz", - "integrity": "sha512-ky5Am1y6s3Ex/3RygHxB/ZXNG07zPfg9Z6Ora+vfeKcr/+I6CJbWXWhSBJor3gFgKN3RvC11UWVURnmDpBS6Pg==", - "requires": { - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@types/bunyan": "1.8.11" - } - }, - "@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.49.0.tgz", - "integrity": "sha512-BNIvqldmLkeikfI5w5Rlm9vG5NnQexfPoxOgEMzfDVOEF+vS6351I6DzWLLgWWR9CNF/jQJJi/lr6am2DLp0Rw==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-connect": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.47.0.tgz", - "integrity": "sha512-pjenvjR6+PMRb6/4X85L4OtkQCootgb/Jzh/l/Utu3SJHBid1F+gk9sTGU2FWuhhEfV6P7MZ7BmCdHXQjgJ42g==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/connect": "3.4.38" - } - }, - "@opentelemetry/instrumentation-cucumber": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.18.0.tgz", - "integrity": "sha512-i+cUbLHvRShuevtM0NwjQR9wnABhmYw8+dbgD57LNBde7xkuSDot0CTzX+pYn32djtQ1bPYZiLf+uwS0JsMUrw==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-dataloader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.21.0.tgz", - "integrity": "sha512-Xu4CZ1bfhdkV3G6iVHFgKTgHx8GbKSqrTU01kcIJRGHpowVnyOPEv1CW5ow+9GU2X4Eki8zoNuVUenFc3RluxQ==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-dns": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.47.0.tgz", - "integrity": "sha512-775fOnewWkTF4iXMGKgwvOGqEmPrU1PZpXjjqvTrEErYBJe7Fz1WlEeUStHepyKOdld7Ghv7TOF/kE3QDctvrg==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-express": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.52.0.tgz", - "integrity": "sha512-W7pizN0Wh1/cbNhhTf7C62NpyYw7VfCFTYg0DYieSTrtPBT1vmoSZei19wfKLnrMsz3sHayCg0HxCVL2c+cz5w==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-fastify": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.48.0.tgz", - "integrity": "sha512-3zQlE/DoVfVH6/ycuTv7vtR/xib6WOa0aLFfslYcvE62z0htRu/ot8PV/zmMZfnzpTQj8S/4ULv36R6UIbpJIg==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-fs": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.23.0.tgz", - "integrity": "sha512-Puan+QopWHA/KNYvDfOZN6M/JtF6buXEyD934vrb8WhsX1/FuM7OtoMlQyIqAadnE8FqqDL4KDPiEfCQH6pQcQ==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-generic-pool": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.47.0.tgz", - "integrity": "sha512-UfHqf3zYK+CwDwEtTjaD12uUqGGTswZ7ofLBEdQ4sEJp9GHSSJMQ2hT3pgBxyKADzUdoxQAv/7NqvL42ZI+Qbw==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-graphql": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.51.0.tgz", - "integrity": "sha512-LchkOu9X5DrXAnPI1+Z06h/EH/zC7D6sA86hhPrk3evLlsJTz0grPrkL/yUJM9Ty0CL/y2HSvmWQCjbJEz/ADg==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-grpc": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.203.0.tgz", - "integrity": "sha512-Qmjx2iwccHYRLoE4RFS46CvQE9JG9Pfeae4EPaNZjvIuJxb/pZa2R9VWzRlTehqQWpAvto/dGhtkw8Tv+o0LTg==", - "requires": { - "@opentelemetry/instrumentation": "0.203.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - } - }, - "@opentelemetry/instrumentation-hapi": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.50.0.tgz", - "integrity": "sha512-5xGusXOFQXKacrZmDbpHQzqYD1gIkrMWuwvlrEPkYOsjUqGUjl1HbxCsn5Y9bUXOCgP1Lj6A4PcKt1UiJ2MujA==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-http": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.203.0.tgz", - "integrity": "sha512-y3uQAcCOAwnO6vEuNVocmpVzG3PER6/YZqbPbbffDdJ9te5NkHEkfSMNzlC3+v7KlE+WinPGc3N7MR30G1HY2g==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/instrumentation": "0.203.0", - "@opentelemetry/semantic-conventions": "^1.29.0", - "forwarded-parse": "2.1.2" - } - }, - "@opentelemetry/instrumentation-ioredis": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.51.0.tgz", - "integrity": "sha512-9IUws0XWCb80NovS+17eONXsw1ZJbHwYYMXiwsfR9TSurkLV5UNbRSKb9URHO+K+pIJILy9wCxvyiOneMr91Ig==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/redis-common": "^0.38.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-kafkajs": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.12.0.tgz", - "integrity": "sha512-bIe4aSAAxytp88nzBstgr6M7ZiEpW6/D1/SuKXdxxuprf18taVvFL2H5BDNGZ7A14K27haHqzYqtCTqFXHZOYg==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.30.0" - } - }, - "@opentelemetry/instrumentation-knex": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.48.0.tgz", - "integrity": "sha512-V5wuaBPv/lwGxuHjC6Na2JFRjtPgstw19jTFl1B1b6zvaX8zVDYUDaR5hL7glnQtUSCMktPttQsgK4dhXpddcA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.33.1" - } - }, - "@opentelemetry/instrumentation-koa": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.51.0.tgz", - "integrity": "sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.48.0.tgz", - "integrity": "sha512-KUW29wfMlTPX1wFz+NNrmE7IzN7NWZDrmFWHM/VJcmFEuQGnnBuTIdsP55CnBDxKgQ/qqYFp4udQFNtjeFosPw==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-memcached": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.47.0.tgz", - "integrity": "sha512-vXDs/l4hlWy1IepPG1S6aYiIZn+tZDI24kAzwKKJmR2QEJRL84PojmALAEJGazIOLl/VdcCPZdMb0U2K0VzojA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/memcached": "^2.2.6" - } - }, - "@opentelemetry/instrumentation-mongodb": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.56.0.tgz", - "integrity": "sha512-YG5IXUUmxX3Md2buVMvxm9NWlKADrnavI36hbJsihqqvBGsWnIfguf0rUP5Srr0pfPqhQjUP+agLMsvu0GmUpA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-mongoose": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.50.0.tgz", - "integrity": "sha512-Am8pk1Ct951r4qCiqkBcGmPIgGhoDiFcRtqPSLbJrUZqEPUsigjtMjoWDRLG1Ki1NHgOF7D0H7d+suWz1AAizw==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-mysql": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.49.0.tgz", - "integrity": "sha512-QU9IUNqNsrlfE3dJkZnFHqLjlndiU39ll/YAAEvWE40sGOCi9AtOF6rmEGzJ1IswoZ3oyePV7q2MP8SrhJfVAA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/mysql": "2.15.27" - } - }, - "@opentelemetry/instrumentation-mysql2": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.49.0.tgz", - "integrity": "sha512-dCub9wc02mkJWNyHdVEZ7dvRzy295SmNJa+LrAJY2a/+tIiVBQqEAajFzKwp9zegVVnel9L+WORu34rGLQDzxA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@opentelemetry/sql-common": "^0.41.0" - } - }, - "@opentelemetry/instrumentation-nestjs-core": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.49.0.tgz", - "integrity": "sha512-1R/JFwdmZIk3T/cPOCkVvFQeKYzbbUvDxVH3ShXamUwBlGkdEu5QJitlRMyVNZaHkKZKWgYrBarGQsqcboYgaw==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.30.0" - } - }, - "@opentelemetry/instrumentation-net": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.47.0.tgz", - "integrity": "sha512-csoJ++Njpf7C09JH+0HNGenuNbDZBqO1rFhMRo6s0rAmJwNh9zY3M/urzptmKlqbKnf4eH0s+CKHy/+M8fbFsQ==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-oracledb": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.29.0.tgz", - "integrity": "sha512-2aHLiJdkyiUbooIUm7FaZf+O4jyqEl+RfFpgud1dxT87QeeYM216wi+xaMNzsb5yKtRBqbA3qeHBCyenYrOZwA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/oracledb": "6.5.2" - } - }, - "@opentelemetry/instrumentation-pg": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.55.0.tgz", - "integrity": "sha512-yfJ5bYE7CnkW/uNsnrwouG/FR7nmg09zdk2MSs7k0ZOMkDDAE3WBGpVFFApGgNu2U+gtzLgEzOQG4I/X+60hXw==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@opentelemetry/sql-common": "^0.41.0", - "@types/pg": "8.15.4", - "@types/pg-pool": "2.0.6" - } - }, - "@opentelemetry/instrumentation-pino": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.50.0.tgz", - "integrity": "sha512-Pi0cWGp4f2gresq2xqef4IsuunLdebJ9n9tZxytDz2ci4euIfW36ILpszQmRNhwCVDCZLmUgGDKZGj4PXyPd0w==", - "requires": { - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-redis": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.51.0.tgz", - "integrity": "sha512-uL/GtBA0u72YPPehwOvthAe+Wf8k3T+XQPBssJmTYl6fzuZjNq8zTfxVFhl9nRFjFVEe+CtiYNT0Q3AyqW1Z0A==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/redis-common": "^0.38.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-restify": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.49.0.tgz", - "integrity": "sha512-tsGZZhS4mVZH7omYxw5jpsrD3LhWizqWc0PYtAnzpFUvL5ZINHE+cm57bssTQ2AK/GtZMxu9LktwCvIIf3dSmw==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-router": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.48.0.tgz", - "integrity": "sha512-Wixrc8CchuJojXpaS/dCQjFOMc+3OEil1H21G+WLYQb8PcKt5kzW9zDBT19nyjjQOx/D/uHPfgbrT+Dc7cfJ9w==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-runtime-node": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.17.0.tgz", - "integrity": "sha512-O+xc0woqrSjue5IgpCCMvlgsuDrq6DDEfiHW3S3vRMCjXE1ZoPjaDE/K6EURorN+tjnzZQN1gOMSrscSGAbjHg==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-socket.io": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.50.0.tgz", - "integrity": "sha512-6JN6lnKN9ZuZtZdMQIR+no1qHzQvXSZUsNe3sSWMgqmNRyEXuDUWBIyKKeG0oHRHtR4xE4QhJyD4D5kKRPWZFA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/instrumentation-tedious": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.22.0.tgz", - "integrity": "sha512-XrrNSUCyEjH1ax9t+Uo6lv0S2FCCykcF7hSxBMxKf7Xn0bPRxD3KyFUZy25aQXzbbbUHhtdxj3r2h88SfEM3aA==", - "requires": { - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/tedious": "^4.0.14" - } - }, - "@opentelemetry/instrumentation-undici": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.14.0.tgz", - "integrity": "sha512-2HN+7ztxAReXuxzrtA3WboAKlfP5OsPA57KQn2AdYZbJ3zeRPcLXyW4uO/jpLE6PLm0QRtmeGCmfYpqRlwgSwg==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/instrumentation-winston": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.48.0.tgz", - "integrity": "sha512-QuKbswAaQfRULhtlYbeNC9gOAXPxOSCE4BjIzuY1oEsc84kIsHUjn3yvY9Q83s3eg3j0JycNcAMi8u0yTl5PIQ==", - "requires": { - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/instrumentation": "^0.203.0" - } - }, - "@opentelemetry/otlp-exporter-base": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.203.0.tgz", - "integrity": "sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-transformer": "0.203.0" - } - }, - "@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.203.0.tgz", - "integrity": "sha512-te0Ze1ueJF+N/UOFl5jElJW4U0pZXQ8QklgSfJ2linHN0JJsuaHG8IabEUi2iqxY8ZBDlSiz1Trfv5JcjWWWwQ==", - "requires": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/otlp-exporter-base": "0.203.0", - "@opentelemetry/otlp-transformer": "0.203.0" - } - }, - "@opentelemetry/otlp-transformer": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.203.0.tgz", - "integrity": "sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==", - "requires": { - "@opentelemetry/api-logs": "0.203.0", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-logs": "0.203.0", - "@opentelemetry/sdk-metrics": "2.0.1", - "@opentelemetry/sdk-trace-base": "2.0.1", - "protobufjs": "^7.3.0" - } - }, - "@opentelemetry/propagation-utils": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.31.3.tgz", - "integrity": "sha512-ZI6LKjyo+QYYZY5SO8vfoCQ9A69r1/g+pyjvtu5RSK38npINN1evEmwqbqhbg2CdcIK3a4PN6pDAJz/yC5/gAA==", - "requires": {} - }, - "@opentelemetry/propagator-b3": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.0.1.tgz", - "integrity": "sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw==", - "requires": { - "@opentelemetry/core": "2.0.1" - } - }, - "@opentelemetry/propagator-jaeger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.0.1.tgz", - "integrity": "sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w==", - "requires": { - "@opentelemetry/core": "2.0.1" - } - }, - "@opentelemetry/redis-common": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.0.tgz", - "integrity": "sha512-4Wc0AWURII2cfXVVoZ6vDqK+s5n4K5IssdrlVrvGsx6OEOKdghKtJZqXAHWFiZv4nTDLH2/2fldjIHY8clMOjQ==" - }, - "@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.31.3.tgz", - "integrity": "sha512-I556LHcLVsBXEgnbPgQISP/JezDt5OfpgOaJNR1iVJl202r+K145OSSOxnH5YOc/KvrydBD0FOE03F7x0xnVTw==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/resource-detector-aws": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.3.0.tgz", - "integrity": "sha512-PkD/lyXG3B3REq1Y6imBLckljkJYXavtqGYSryAeJYvGOf5Ds3doR+BCGjmKeF6ObAtI5MtpBeUStTDtGtBsWA==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/resource-detector-azure": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.10.0.tgz", - "integrity": "sha512-5cNAiyPBg53Uxe/CW7hsCq8HiKNAUGH+gi65TtgpzSR9bhJG4AEbuZhbJDFwe97tn2ifAD1JTkbc/OFuaaFWbA==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/resource-detector-container": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.7.3.tgz", - "integrity": "sha512-SK+xUFw6DKYbQniaGmIFsFxAZsr8RpRSRWxKi5/ZJAoqqPnjcyGI/SeUx8zzPk4XLO084zyM4pRHgir0hRTaSQ==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, - "@opentelemetry/resource-detector-gcp": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.37.0.tgz", - "integrity": "sha512-LGpJBECIMsVKhiulb4nxUw++m1oF4EiDDPmFGW2aqYaAF0oUvJNv8Z/55CAzcZ7SxvlTgUwzewXDBsuCup7iqw==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "gcp-metadata": "^6.0.0" - } - }, - "@opentelemetry/resources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - } - }, - "@opentelemetry/sdk-logs": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.203.0.tgz", - "integrity": "sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==", - "requires": { - "@opentelemetry/api-logs": "0.203.0", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1" - } - }, - "@opentelemetry/sdk-metrics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1" - } - }, - "@opentelemetry/sdk-node": { - "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.203.0.tgz", - "integrity": "sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ==", - "requires": { - "@opentelemetry/api-logs": "0.203.0", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/exporter-logs-otlp-grpc": "0.203.0", - "@opentelemetry/exporter-logs-otlp-http": "0.203.0", - "@opentelemetry/exporter-logs-otlp-proto": "0.203.0", - "@opentelemetry/exporter-metrics-otlp-grpc": "0.203.0", - "@opentelemetry/exporter-metrics-otlp-http": "0.203.0", - "@opentelemetry/exporter-metrics-otlp-proto": "0.203.0", - "@opentelemetry/exporter-prometheus": "0.203.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.203.0", - "@opentelemetry/exporter-trace-otlp-http": "0.203.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.203.0", - "@opentelemetry/exporter-zipkin": "2.0.1", - "@opentelemetry/instrumentation": "0.203.0", - "@opentelemetry/propagator-b3": "2.0.1", - "@opentelemetry/propagator-jaeger": "2.0.1", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-logs": "0.203.0", - "@opentelemetry/sdk-metrics": "2.0.1", - "@opentelemetry/sdk-trace-base": "2.0.1", - "@opentelemetry/sdk-trace-node": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - } - }, - "@opentelemetry/sdk-trace-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.1.tgz", - "integrity": "sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==", - "requires": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - } - }, - "@opentelemetry/sdk-trace-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.0.1.tgz", - "integrity": "sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==", - "requires": { - "@opentelemetry/context-async-hooks": "2.0.1", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/sdk-trace-base": "2.0.1" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.36.0.tgz", - "integrity": "sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==" - }, - "@opentelemetry/sql-common": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.0.tgz", - "integrity": "sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA==", - "requires": { - "@opentelemetry/core": "^2.0.0" - } - }, - "@oxc-parser/binding-android-arm64": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.94.0.tgz", - "integrity": "sha512-Ficqj6MggRGFkemU4pVFTyth3jWVL/zpIWjGMTXaPU81l46ZDcYVFWp9ia6nfE5mm8UdVSI2trvmK+BpNUim7g==", - "optional": true - }, - "@oxc-parser/binding-darwin-arm64": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.94.0.tgz", - "integrity": "sha512-uYyeMH9vMfb0JAdm6ZwHTgcTv53030elQKMnUbux9K5rxOCWbHUyeVACEv86V+E/Ft6RtkvWDIqUY4sYZRmcuQ==", - "optional": true - }, - "@oxc-parser/binding-darwin-x64": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.94.0.tgz", - "integrity": "sha512-Ek1fh8dw6b+/hzLo5jjPuxkshRxekjtTfhfWZ4RehMYiApT8Rj4k+7kcQ+zV1ZaF+1+yLgNqNja2RMRqx3MHzQ==", - "optional": true - }, - "@oxc-parser/binding-freebsd-x64": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.94.0.tgz", - "integrity": "sha512-81bE/8F252Ew179uVo9FU67dmRc+n8QSMhj6mmMxisdI3ao5MjCI5jDL19mH3UeQ9uRUBSPFILmHBDQYNZ9oKw==", - "optional": true - }, - "@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.94.0.tgz", - "integrity": "sha512-aGOU8IYXVYGN2aRrvcU5+UdM7BzIVlm4m0REQzjpblQKRdZfWFtDBRJez+fK/F10g0H1AU5DQVgbW5aeko49Jw==", - "optional": true - }, - "@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.94.0.tgz", - "integrity": "sha512-69/ZuYSZ4dd7UWoEOyf+pXYPtvUZguDQqjhxMx8fI0J30sEEqs1d/DBLLnog/afHmaapPEIEr6rp9jF6bYcgNw==", - "optional": true - }, - "@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.94.0.tgz", - "integrity": "sha512-u55PGVVfZF/frpEcv/vowfuqsCd5VKz3wta8KZ3MBxboat7XxgRIMS8VQEBiJ3aYE80taACu5EfPN1y9DhiU0Q==", - "optional": true - }, - "@oxc-parser/binding-linux-arm64-musl": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.94.0.tgz", - "integrity": "sha512-Qm2SEU7/f2b2Rg76Pj49BdMFF7Vv7+2qLPxaae4aH1515kzVv6nZW0bqCo4fPDDyiE4bryF7Jr+WKhllBxvXPw==", - "optional": true - }, - "@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.94.0.tgz", - "integrity": "sha512-bZO3QAt0lsZjk351mVM85obMivbXG+tDiah5XmmOaGO8k4vEYmoiKr2YHJoA2eNpKhPJF8dNyIS7U+XAvirr9g==", - "optional": true - }, - "@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.94.0.tgz", - "integrity": "sha512-IdbJ/rwsaEPQx11mQwGoClqhAmVaAF9+3VmDRYVmfsYsrhX1Ue1HvBdVHDvtHzJDuumC/X/codkVId9Ss+7fVg==", - "optional": true - }, - "@oxc-parser/binding-linux-x64-gnu": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.94.0.tgz", - "integrity": "sha512-TbtpRdViF3aPCQBKuEo+TcucwW3KFa6bMHVakgaJu12RZrFpO4h1IWppBbuuBQ9X7SfvpgC1YgCDGve9q6fpEA==", - "optional": true - }, - "@oxc-parser/binding-linux-x64-musl": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.94.0.tgz", - "integrity": "sha512-hlfoDmWvgSbexoJ9u3KwAJwpeu91FfJR6++fQjeYXD2InK4gZow9o3DRoTpN/kslZwzUNpiRURqxey/RvWh8JQ==", - "optional": true - }, - "@oxc-parser/binding-wasm32-wasi": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.94.0.tgz", - "integrity": "sha512-VoCtQZIsRZN8mszbdizh+5MwzbgbMxsPgT2hOzzILQLNY2o2OXG3xSiFNFakVhbWc9qSTaZ/MRDsqR+IM3fLFw==", - "optional": true, - "requires": { - "@napi-rs/wasm-runtime": "^1.0.6" - } - }, - "@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.94.0.tgz", - "integrity": "sha512-3wsbMqV8V7WaLdiQ2oawdgKkCgMHXJ7VDuo6uIcXauU3wK6CG0QyDXRV9bPWzorGLRBUHndu/2VB1+9dgT9fvg==", - "optional": true - }, - "@oxc-parser/binding-win32-x64-msvc": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.94.0.tgz", - "integrity": "sha512-UTQQ1576Nzhh4jr/YmvzqnuwTPOauB/TPzsnWzT+w8InHxL5JA1fmy01wB1F2BWT9AD6YV4BTB1ozRICYdAgjw==", - "optional": true - }, - "@oxc-project/types": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.94.0.tgz", - "integrity": "sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==" - }, - "@oxlint-tsgolint/darwin-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.14.2.tgz", - "integrity": "sha512-03WxIXguCXf1pTmoG2C6vqRcbrU9GaJCW6uTIiQdIQq4BrJnVWZv99KEUQQRkuHK78lOLa9g7B4K58NcVcB54g==", - "dev": true, - "optional": true - }, - "@oxlint-tsgolint/darwin-x64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.14.2.tgz", - "integrity": "sha512-ksMLl1cIWz3Jw+U79BhyCPdvohZcJ/xAKri5bpT6oeEM2GVnQCHBk/KZKlYrd7hZUTxz0sLnnKHE11XFnLASNQ==", - "dev": true, - "optional": true - }, - "@oxlint-tsgolint/linux-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.14.2.tgz", - "integrity": "sha512-2BgR535w7GLxBCyQD5DR3dBzbAgiBbG5QX1kAEVzOmWxJhhGxt5lsHdHebRo7ilukYLpBDkerz0mbMErblghCQ==", - "dev": true, - "optional": true - }, - "@oxlint-tsgolint/linux-x64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.14.2.tgz", - "integrity": "sha512-TUHFyVHfbbGtnTQZbUFgwvv3NzXBgzNLKdMUJw06thpiC7u5OW5qdk4yVXIC/xeVvdl3NAqTfcT4sA32aiMubg==", - "dev": true, - "optional": true - }, - "@oxlint-tsgolint/win32-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.14.2.tgz", - "integrity": "sha512-OfYHa/irfVggIFEC4TbawsI7Hwrttppv//sO/e00tu4b2QRga7+VHAwtCkSFWSr0+BsO4InRYVA0+pun5BinpQ==", - "dev": true, - "optional": true - }, - "@oxlint-tsgolint/win32-x64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.14.2.tgz", - "integrity": "sha512-5gxwbWYE2pP+pzrO4SEeYvLk4N609eAe18rVXUx+en3qtHBkU8VM2jBmMcZdIHn+G05leu4pYvwAvw6tvT9VbA==", - "dev": true, - "optional": true - }, - "@oxlint/binding-android-arm-eabi": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.50.0.tgz", - "integrity": "sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==", - "dev": true, - "optional": true - }, - "@oxlint/binding-android-arm64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.50.0.tgz", - "integrity": "sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==", - "dev": true, - "optional": true - }, - "@oxlint/binding-darwin-arm64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.50.0.tgz", - "integrity": "sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==", - "dev": true, - "optional": true - }, - "@oxlint/binding-darwin-x64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.50.0.tgz", - "integrity": "sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==", - "dev": true, - "optional": true - }, - "@oxlint/binding-freebsd-x64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.50.0.tgz", - "integrity": "sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.50.0.tgz", - "integrity": "sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-arm-musleabihf": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.50.0.tgz", - "integrity": "sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-arm64-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.50.0.tgz", - "integrity": "sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-arm64-musl": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.50.0.tgz", - "integrity": "sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-ppc64-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.50.0.tgz", - "integrity": "sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-riscv64-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.50.0.tgz", - "integrity": "sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-riscv64-musl": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.50.0.tgz", - "integrity": "sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-s390x-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.50.0.tgz", - "integrity": "sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-x64-gnu": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.50.0.tgz", - "integrity": "sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==", - "dev": true, - "optional": true - }, - "@oxlint/binding-linux-x64-musl": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.50.0.tgz", - "integrity": "sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==", - "dev": true, - "optional": true - }, - "@oxlint/binding-openharmony-arm64": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.50.0.tgz", - "integrity": "sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==", - "dev": true, - "optional": true - }, - "@oxlint/binding-win32-arm64-msvc": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.50.0.tgz", - "integrity": "sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==", - "dev": true, - "optional": true - }, - "@oxlint/binding-win32-ia32-msvc": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.50.0.tgz", - "integrity": "sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==", - "dev": true, - "optional": true - }, - "@oxlint/binding-win32-x64-msvc": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.50.0.tgz", - "integrity": "sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==", - "dev": true, - "optional": true - }, - "@peculiar/asn1-cms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", - "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-csr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", - "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-ecc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", - "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-pfx": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", - "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", - "dev": true, - "requires": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-pkcs8": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", - "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-pkcs9": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", - "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", - "dev": true, - "requires": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pfx": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-rsa": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", - "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "dev": true, - "requires": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-x509": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", - "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-x509-attr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", - "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/x509": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.2.tgz", - "integrity": "sha512-r2w1Hg6pODDs0zfAKHkSS5HLkOLSeburtcgwvlLLWWCixw+MmW3U6kD5ddyvc2Y2YdbGuVwCF2S2ASoU1cFAag==", - "dev": true, - "requires": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==" - }, - "@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "requires": { - "graceful-fs": "4.2.10" - } - }, - "@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "requires": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" - }, - "@postgresql-typed/oids": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@postgresql-typed/oids/-/oids-0.2.0.tgz", - "integrity": "sha512-jh1nIP/nmtlZkj1t0cO2NC2lFHg/fXQhtRFsL70Rh/5ELp5fqxH/calwPVTkS8gPae1k/PTqQYbU23E+Q2q0rg==" - }, - "@prisma/adapter-pg": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.2.0.tgz", - "integrity": "sha512-euIdQ13cRB2wZ3jPsnDnFhINquo1PYFPCg6yVL8b2rp3EdinQHsX9EDdCtRr489D5uhphcRk463OdQAFlsCr0w==", - "dev": true, - "requires": { - "@prisma/driver-adapter-utils": "7.2.0", - "pg": "^8.16.3", - "postgres-array": "3.0.4" - }, - "dependencies": { - "postgres-array": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", - "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", - "dev": true - } - } - }, - "@prisma/client": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", - "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", - "dev": true, - "requires": { - "@prisma/client-runtime-utils": "7.2.0" - } - }, - "@prisma/client-runtime-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.2.0.tgz", - "integrity": "sha512-dn7oB53v0tqkB0wBdMuTNFNPdEbfICEUe82Tn9FoKAhJCUkDH+fmyEp0ClciGh+9Hp2Tuu2K52kth2MTLstvmA==", - "dev": true - }, - "@prisma/config": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.2.0.tgz", - "integrity": "sha512-qmvSnfQ6l/srBW1S7RZGfjTQhc44Yl3ldvU6y3pgmuLM+83SBDs6UQVgMtQuMRe9J3gGqB0RF8wER6RlXEr6jQ==", - "dev": true, - "requires": { - "c12": "3.1.0", - "deepmerge-ts": "7.1.5", - "effect": "3.18.4", - "empathic": "2.0.0" - }, - "dependencies": { - "c12": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", - "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", - "dev": true, - "requires": { - "chokidar": "^4.0.3", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^16.6.1", - "exsolve": "^1.0.7", - "giget": "^2.0.0", - "jiti": "^2.4.2", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", - "rc9": "^2.1.2" - } - }, - "chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "requires": { - "readdirp": "^4.0.1" - } - }, - "dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true - }, - "jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true - }, - "readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true - } - } - }, - "@prisma/debug": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.2.0.tgz", - "integrity": "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==", - "dev": true - }, - "@prisma/dev": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.17.0.tgz", - "integrity": "sha512-6sGebe5jxX+FEsQTpjHLzvOGPn6ypFQprcs3jcuIWv1Xp/5v6P/rjfdvAwTkP2iF6pDx2tCd8vGLNWcsWzImTA==", - "dev": true, - "requires": { - "@electric-sql/pglite": "0.3.2", - "@electric-sql/pglite-socket": "0.0.6", - "@electric-sql/pglite-tools": "0.2.7", - "@hono/node-server": "1.19.6", - "@mrleebo/prisma-ast": "0.12.1", - "@prisma/get-platform": "6.8.2", - "@prisma/query-plan-executor": "6.18.0", - "foreground-child": "3.3.1", - "get-port-please": "3.1.2", - "hono": "4.10.6", - "http-status-codes": "2.3.0", - "pathe": "2.0.3", - "proper-lockfile": "4.1.2", - "remeda": "2.21.3", - "std-env": "3.9.0", - "valibot": "1.2.0", - "zeptomatch": "2.0.2" - }, - "dependencies": { - "std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true - } - } - }, - "@prisma/driver-adapter-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.2.0.tgz", - "integrity": "sha512-gzrUcbI9VmHS24Uf+0+7DNzdIw7keglJsD5m/MHxQOU68OhGVzlphQRobLiDMn8CHNA2XN8uugwKjudVtnfMVQ==", - "dev": true, - "requires": { - "@prisma/debug": "7.2.0" - } - }, - "@prisma/engines": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.2.0.tgz", - "integrity": "sha512-HUeOI/SvCDsHrR9QZn24cxxZcujOjcS3w1oW/XVhnSATAli5SRMOfp/WkG3TtT5rCxDA4xOnlJkW7xkho4nURA==", - "dev": true, - "requires": { - "@prisma/debug": "7.2.0", - "@prisma/engines-version": "7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", - "@prisma/fetch-engine": "7.2.0", - "@prisma/get-platform": "7.2.0" - }, - "dependencies": { - "@prisma/get-platform": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz", - "integrity": "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==", - "dev": true, - "requires": { - "@prisma/debug": "7.2.0" - } - } - } - }, - "@prisma/engines-version": { - "version": "7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3.tgz", - "integrity": "sha512-KezsjCZDsbjNR7SzIiVlUsn9PnLePI7r5uxABlwL+xoerurZTfgQVbIjvjF2sVr3Uc0ZcsnREw3F84HvbggGdA==", - "dev": true - }, - "@prisma/fetch-engine": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.2.0.tgz", - "integrity": "sha512-Z5XZztJ8Ap+wovpjPD2lQKnB8nWFGNouCrglaNFjxIWAGWz0oeHXwUJRiclIoSSXN/ptcs9/behptSk8d0Yy6w==", - "dev": true, - "requires": { - "@prisma/debug": "7.2.0", - "@prisma/engines-version": "7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", - "@prisma/get-platform": "7.2.0" - }, - "dependencies": { - "@prisma/get-platform": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz", - "integrity": "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==", - "dev": true, - "requires": { - "@prisma/debug": "7.2.0" - } - } - } - }, - "@prisma/get-platform": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.8.2.tgz", - "integrity": "sha512-vXSxyUgX3vm1Q70QwzwkjeYfRryIvKno1SXbIqwSptKwqKzskINnDUcx85oX+ys6ooN2ATGSD0xN2UTfg6Zcow==", - "dev": true, - "requires": { - "@prisma/debug": "6.8.2" - }, - "dependencies": { - "@prisma/debug": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.8.2.tgz", - "integrity": "sha512-4muBSSUwJJ9BYth5N8tqts8JtiLT8QI/RSAzEogwEfpbYGFo9mYsInsVo8dqXdPO2+Rm5OG5q0qWDDE3nyUbVg==", - "dev": true - } - } - }, - "@prisma/query-plan-executor": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@prisma/query-plan-executor/-/query-plan-executor-6.18.0.tgz", - "integrity": "sha512-jZ8cfzFgL0jReE1R10gT8JLHtQxjWYLiQ//wHmVYZ2rVkFHoh0DT8IXsxcKcFlfKN7ak7k6j0XMNn2xVNyr5cA==", - "dev": true - }, - "@prisma/studio-core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.9.0.tgz", - "integrity": "sha512-xA2zoR/ADu/NCSQuriBKTh6Ps4XjU0bErkEcgMfnSGh346K1VI7iWKnoq1l2DoxUqiddPHIEWwtxJ6xCHG6W7g==", - "dev": true, - "requires": {} - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@react-aria/focus": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.18.3.tgz", - "integrity": "sha512-WKUElg+5zS0D3xlVn8MntNnkzJql2J6MuzAMP8Sv5WTgFDse/XGR842dsxPTIyKKdrWVCRegCuwa4m3n/GzgJw==", - "requires": { - "@react-aria/interactions": "^3.22.3", - "@react-aria/utils": "^3.25.3", - "@react-types/shared": "^3.25.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - } - }, - "@react-aria/interactions": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.3.tgz", - "integrity": "sha512-RRUb/aG+P0IKTIWikY/SylB6bIbLZeztnZY2vbe7RAG5MgVaCgn5HQ45SI15GlTmhsFG8CnF6slJsUFJiNHpbQ==", - "requires": { - "@react-aria/ssr": "^3.9.6", - "@react-aria/utils": "^3.25.3", - "@react-types/shared": "^3.25.0", - "@swc/helpers": "^0.5.0" - } - }, - "@react-aria/ssr": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.6.tgz", - "integrity": "sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA==", - "requires": { - "@swc/helpers": "^0.5.0" - } - }, - "@react-aria/utils": { - "version": "3.25.3", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.25.3.tgz", - "integrity": "sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA==", - "requires": { - "@react-aria/ssr": "^3.9.6", - "@react-stately/utils": "^3.10.4", - "@react-types/shared": "^3.25.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - } - }, - "@react-native/assets-registry": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", - "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", - "dev": true, - "peer": true - }, - "@react-native/babel-plugin-codegen": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.4.tgz", - "integrity": "sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==", - "dev": true, - "peer": true, - "requires": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.81.4" - } - }, - "@react-native/babel-preset": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.4.tgz", - "integrity": "sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.81.4", - "babel-plugin-syntax-hermes-parser": "0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - } - }, - "@react-native/codegen": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", - "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.29.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "@react-native/community-cli-plugin": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", - "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", - "dev": true, - "peer": true, - "requires": { - "@react-native/dev-middleware": "0.82.0", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.83.1", - "metro-config": "^0.83.1", - "metro-core": "^0.83.1", - "semver": "^7.1.3" - }, - "dependencies": { - "@react-native/debugger-frontend": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", - "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", - "dev": true, - "peer": true - }, - "@react-native/dev-middleware": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", - "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.82.0", - "@react-native/debugger-shell": "0.82.0", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "peer": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "dev": true, - "peer": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "@react-native/debugger-frontend": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", - "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", - "dev": true, - "peer": true - }, - "@react-native/debugger-shell": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", - "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", - "dev": true, - "peer": true, - "requires": { - "cross-spawn": "^7.0.6", - "fb-dotslash": "0.5.8" - } - }, - "@react-native/dev-middleware": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", - "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.81.4", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" - }, - "dependencies": { - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "peer": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "dev": true, - "peer": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "@react-native/gradle-plugin": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", - "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", - "dev": true, - "peer": true - }, - "@react-native/js-polyfills": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", - "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", - "dev": true, - "peer": true - }, - "@react-native/normalize-colors": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", - "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", - "dev": true, - "peer": true - }, - "@react-stately/utils": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.4.tgz", - "integrity": "sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw==", - "requires": { - "@swc/helpers": "^0.5.0" - } - }, - "@react-types/shared": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.25.0.tgz", - "integrity": "sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ==", - "requires": {} - }, - "@rocicorp/lock": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@rocicorp/lock/-/lock-1.0.4.tgz", - "integrity": "sha512-FavTiO8ETXFXDVfA87IThGduTTTR8iqzBnr/c60gUUmbk7knGEXPmf2B+yiNuluJD0ku0fL2V2r62UXnsLXl6w==", - "requires": { - "@rocicorp/resolver": "^1.0.2" - } - }, - "@rocicorp/logger": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rocicorp/logger/-/logger-5.4.0.tgz", - "integrity": "sha512-kmMR5iLrwRIsvPZ+UXnmyAM3Mlvz6rCHrYfMsrMPgFYKLfo7amUH1RwHo6tuuqJiAvUbeaCoDtc8e+V0Mr4PSA==" - }, - "@rocicorp/resolver": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rocicorp/resolver/-/resolver-1.0.2.tgz", - "integrity": "sha512-TfjMTQp9cNNqNtHFfa+XHEGdA7NnmDRu+ZJH4YF3dso0Xk/b9DMhg/sl+b6CR4ThFZArXXDsG1j8Mwl34wcOZQ==" - }, - "@rocicorp/zero": { - "version": "file:packages/zero", - "requires": { - "@badrap/valita": "0.3.11", - "@databases/escape-identifier": "^1.0.3", - "@databases/sql": "^3.3.0", - "@dotenvx/dotenvx": "^1.39.0", - "@drdgvhbh/postgres-error-codes": "^0.0.6", - "@fastify/cors": "^10.0.0", - "@fastify/websocket": "^11.0.0", - "@google-cloud/precise-date": "^4.0.0", - "@op-engineering/op-sqlite": ">=15", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/auto-instrumentations-node": "^0.62.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", - "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-metrics": "^2.0.1", - "@opentelemetry/sdk-node": "^0.203.0", - "@opentelemetry/sdk-trace-node": "^2.0.1", - "@postgresql-typed/oids": "^0.2.0", - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "@rocicorp/zero-sqlite3": "^1.0.15", - "@standard-schema/spec": "^1.0.0", - "@types/basic-auth": "^1.1.8", - "@types/ws": "^8.5.12", - "@vitest/runner": "4.0.15", - "analyze-query": "0.0.0", - "ast-to-zql": "0.0.0", - "basic-auth": "^2.0.1", - "chalk": "^5.3.0", - "chalk-template": "^1.1.0", - "chokidar": "^4.0.1", - "cloudevents": "^10.0.0", - "command-line-args": "^6.0.1", - "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", - "defu": "^6.1.4", - "eventemitter3": "^5.0.1", - "expo-sqlite": ">=15", - "fastify": "^5.0.0", - "is-in-subnet": "^4.0.1", - "jose": "^5.9.3", - "js-xxhash": "^4.0.0", - "json-custom-numbers": "^3.1.1", - "kasi": "^1.1.0", - "nanoid": "^5.1.2", - "parse-prometheus-text-format": "^1.1.1", - "pg-format": "npm:pg-format-fix@^1.0.5", - "postgres": "3.4.7", - "prettier": "^3.8.1", - "replicache": "15.2.1", - "semver": "^7.5.4", - "shared": "0.0.0", - "tsx": "^4.21.0", - "typedoc": "^0.28.15", - "typedoc-plugin-markdown": "^4.9.0", - "typescript": "~5.9.3", - "url-pattern": "^1.0.3", - "urlpattern-polyfill": "^10.1.0", - "vite": "7.2.7", - "vitest": "4.0.15", - "ws": "^8.18.1", - "zero-cache": "0.0.0", - "zero-client": "0.0.0", - "zero-pg": "0.0.0", - "zero-react": "0.0.0", - "zero-server": "0.0.0", - "zero-solid": "0.0.0", - "zqlite": "0.0.0" - }, - "dependencies": { - "@expo/cli": { - "version": "54.0.11", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.11.tgz", - "integrity": "sha512-ik9p8+JTOuVXS462+vFPV0qnWRBXIR1bPmoVKO8xQWw6Yk+K6UlU2GrM2ch7kA3JlSJE/MGsNyN8CB0zFZbVbQ==", - "dev": true, - "peer": true, - "requires": { - "@0no-co/graphql.web": "^1.0.8", - "@expo/code-signing-certificates": "^0.0.5", - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/devcert": "^1.1.2", - "@expo/env": "~2.0.7", - "@expo/image-utils": "^0.8.7", - "@expo/json-file": "^10.0.7", - "@expo/mcp-tunnel": "~0.0.7", - "@expo/metro": "~54.0.0", - "@expo/metro-config": "~54.0.6", - "@expo/osascript": "^2.3.7", - "@expo/package-manager": "^1.9.8", - "@expo/plist": "^0.4.7", - "@expo/prebuild-config": "^54.0.5", - "@expo/schema-utils": "^0.1.7", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.81.4", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "expo-server": "^1.0.1", - "freeport-async": "^2.0.0", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "lan-network": "^0.1.6", - "minimatch": "^9.0.0", - "node-forge": "^1.3.1", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "^5.6.0", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", - "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^7.4.3", - "terminal-link": "^2.1.1", - "undici": "^6.18.2", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@expo/devtools": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", - "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.1.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@expo/metro-config": { - "version": "54.0.6", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.6.tgz", - "integrity": "sha512-z3wufTr1skM03PI6Dr1ZsrvjAiGKf/w0VQvdZL+mEnKNqRA7Q4bhJDGk1+nzs+WWRWz4vS488uad9ERmSclBmg==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~12.0.10", - "@expo/env": "~2.0.7", - "@expo/json-file": "~10.0.7", - "@expo/metro": "~54.0.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "hermes-parser": "^0.29.1", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "minimatch": "^9.0.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@expo/prebuild-config": { - "version": "54.0.5", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.5.tgz", - "integrity": "sha512-eCvbVUf01j1nSrs4mG/rWwY+SfgE30LM6JcElLrnNgNnaDWzt09E/c8n3ZeTLNKENwJaQQ1KIn2VE461/4VnWQ==", - "dev": true, - "peer": true, - "requires": { - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/config-types": "^54.0.8", - "@expo/image-utils": "^0.8.7", - "@expo/json-file": "^10.0.7", - "@react-native/normalize-colors": "0.81.4", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - } - }, - "@expo/vector-icons": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.2.tgz", - "integrity": "sha512-IiBjg7ZikueuHNf40wSGCf0zS73a3guJLdZzKnDUxsauB8VWPLMeWnRIupc+7cFhLUkqyvyo0jLNlcxG5xPOuQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "@op-engineering/op-sqlite": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.0.7.tgz", - "integrity": "sha512-EExQtz7QPxPWXQ00QjFiHvbohMOrpEzFbWbWZ1BXvZeDafbYJxS6DYRO08w5Q44WnaNbxBfmRc/1/seZuHMI/g==", - "dev": true, - "requires": {} - }, - "@react-native/codegen": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", - "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.32.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "peer": true, - "requires": { - "hermes-estree": "0.32.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@react-native/virtualized-lists": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", - "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", - "dev": true, - "peer": true, - "requires": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true - }, - "babel-preset-expo": { - "version": "54.0.4", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.4.tgz", - "integrity": "sha512-0/1/xh2m/G4FSvIbJYcu5TGPfDrHRqmIDoAFm6zWSEuWyCDagZ8gjjTTJqxdNJHvsKQl65PzeXd6Q5k6tF57wA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.81.4", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "resolve-from": "^5.0.0" - } - }, - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" - }, - "chalk-template": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", - "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", - "requires": { - "chalk": "^5.2.0" - } - }, - "chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "requires": { - "readdirp": "^4.0.1" - } - }, - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true - }, - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true - }, - "expo": { - "version": "54.0.13", - "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.13.tgz", - "integrity": "sha512-F1puKXzw8ESnsbvaKdXtcIiyYLQ2kUHqP8LuhgtJS1wm6w55VhtOPg8yl/0i8kPbTA0YfD+KYdXjSfhPXgUPxw==", - "dev": true, - "peer": true, - "requires": { - "@babel/runtime": "^7.20.0", - "@expo/cli": "54.0.11", - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/devtools": "0.1.7", - "@expo/fingerprint": "0.15.1", - "@expo/metro": "~54.0.0", - "@expo/metro-config": "54.0.6", - "@expo/vector-icons": "^15.0.2", - "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~54.0.3", - "expo-asset": "~12.0.9", - "expo-constants": "~18.0.9", - "expo-file-system": "~19.0.17", - "expo-font": "~14.0.9", - "expo-keep-awake": "~15.0.7", - "expo-modules-autolinking": "3.0.15", - "expo-modules-core": "3.0.21", - "pretty-format": "^29.7.0", - "react-refresh": "^0.14.2", - "whatwg-url-without-unicode": "8.0.0-3" - } - }, - "expo-asset": { - "version": "12.0.9", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", - "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", - "dev": true, - "peer": true, - "requires": { - "@expo/image-utils": "^0.8.7", - "expo-constants": "~18.0.9" - } - }, - "expo-constants": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.9.tgz", - "integrity": "sha512-sqoXHAOGDcr+M9NlXzj1tGoZyd3zxYDy215W6E0Z0n8fgBaqce9FAYQE2bu5X4G629AYig5go7U6sQz7Pjcm8A==", - "dev": true, - "peer": true, - "requires": { - "@expo/config": "~12.0.9", - "@expo/env": "~2.0.7" - } - }, - "expo-file-system": { - "version": "19.0.17", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", - "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", - "dev": true, - "peer": true, - "requires": {} - }, - "expo-font": { - "version": "14.0.9", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.9.tgz", - "integrity": "sha512-xCoQbR/36qqB6tew/LQ6GWICpaBmHLhg/Loix5Rku/0ZtNaXMJv08M9o1AcrdiGTn/Xf/BnLu6DgS45cWQEHZg==", - "dev": true, - "peer": true, - "requires": { - "fontfaceobserver": "^2.1.0" - } - }, - "expo-keep-awake": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", - "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", - "dev": true, - "peer": true, - "requires": {} - }, - "expo-modules-core": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.21.tgz", - "integrity": "sha512-KJRzm0FEt/lfPNG+C6UUq+ta9PO10QPwY1HGCNkzPiRCIMJmQP4xRYK4Z7AxiYEYsPqr5OdjRW55kGZ4c5pzgA==", - "dev": true, - "peer": true, - "requires": { - "invariant": "^2.2.4" - } - }, - "expo-sqlite": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-16.0.10.tgz", - "integrity": "sha512-tUOKxE9TpfneRG3eOfbNfhN9236SJ7IiUnP8gCqU7umd9DtgDGB/5PhYVVfl+U7KskgolgNoB9v9OZ9iwXN8Eg==", - "dev": true, - "requires": { - "await-lock": "^2.2.2" - } - }, - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "requires": {} - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "peer": true, - "requires": { - "minipass": "^7.1.2" - } - }, - "nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==" - }, - "picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true - }, - "postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "peer": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "dependencies": { - "nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "peer": true - } - } - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true - } - } - }, - "react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", - "dev": true, - "peer": true - }, - "react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true - }, - "react-native": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.82.0.tgz", - "integrity": "sha512-E+sBFDgpwzoZzPn86gSGRBGLnS9Q6r4y6Xk5I57/QbkqkDOxmQb/bzQq/oCdUCdHImKiow2ldC3WJfnvAKIfzg==", - "dev": true, - "peer": true, - "requires": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.82.0", - "@react-native/codegen": "0.82.0", - "@react-native/community-cli-plugin": "0.82.0", - "@react-native/gradle-plugin": "0.82.0", - "@react-native/js-polyfills": "0.82.0", - "@react-native/normalize-colors": "0.82.0", - "@react-native/virtualized-lists": "0.82.0", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.32.0", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "hermes-compiler": "0.0.0", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.1", - "metro-source-map": "^0.83.1", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.26.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", - "yargs": "^17.6.2" - }, - "dependencies": { - "@react-native/normalize-colors": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", - "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", - "dev": true, - "peer": true - }, - "babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", - "dev": true, - "peer": true, - "requires": { - "hermes-parser": "0.32.0" - } - }, - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "peer": true, - "requires": { - "hermes-estree": "0.32.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "dev": true, - "peer": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==" - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true - }, - "scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true, - "peer": true - }, - "tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - } - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - }, - "undici": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", - "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "dev": true, - "peer": true - }, - "vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "dev": true, - "requires": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "fsevents": "~2.3.3", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "dependencies": { - "nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - }, - "postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "requires": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - } - } - }, - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true - } - } - }, - "@rocicorp/zero-events": { - "version": "file:packages/zero-events", - "requires": { - "shared": "0.0.0", - "typescript": "~5.9.3" - }, - "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } - } - }, - "@rocicorp/zero-sqlite3": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@rocicorp/zero-sqlite3/-/zero-sqlite3-1.0.15.tgz", - "integrity": "sha512-o4ezzTgNQvOM23X/mBRN4LAo0i7XkIDAL3Obg7FaJLFTuwJyYwqE45aqk9vg8/0mlBw2U+DEUGLP1q/Pf+VgYQ==", - "requires": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", - "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", - "dev": true - }, - "@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "dependencies": { - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - } - } - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", - "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", - "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", - "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", - "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", - "optional": true - }, - "@rollup/rollup-freebsd-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", - "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", - "optional": true - }, - "@rollup/rollup-freebsd-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", - "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", - "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", - "optional": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", - "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", - "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", - "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", - "optional": true - }, - "@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", - "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", - "optional": true - }, - "@rollup/rollup-linux-ppc64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", - "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", - "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", - "optional": true - }, - "@rollup/rollup-linux-riscv64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", - "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", - "optional": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", - "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", - "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", - "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", - "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", - "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", - "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", - "optional": true - }, - "@rushstack/node-core-library": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.14.0.tgz", - "integrity": "sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==", - "dev": true, - "requires": { - "ajv": "~8.13.0", - "ajv-draft-04": "~1.0.0", - "ajv-formats": "~3.0.1", - "fs-extra": "~11.3.0", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4" - }, - "dependencies": { - "ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - } - }, - "ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true, - "requires": {} - }, - "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==", - "dev": true - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@rushstack/rig-package": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", - "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", - "dev": true, - "requires": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } - }, - "@rushstack/terminal": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.16.0.tgz", - "integrity": "sha512-WEvNuKkoR1PXorr9SxO0dqFdSp1BA+xzDrIm/Bwlc5YHg2FFg6oS+uCTYjerOhFuqCW+A3vKBm6EmKWSHfgx/A==", - "dev": true, - "requires": { - "@rushstack/node-core-library": "5.14.0", - "supports-color": "~8.1.1" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@rushstack/ts-command-line": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.0.3.tgz", - "integrity": "sha512-bgPhQEqLVv/2hwKLYv/XvsTWNZ9B/+X1zJ7WgQE9rO5oiLzrOZvkIW4pk13yOQBhHyjcND5qMOa6p83t+Z66iQ==", - "dev": true, - "requires": { - "@rushstack/terminal": "0.16.0", - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "string-argv": "~0.3.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - } - } - }, - "@schickling/fps-meter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@schickling/fps-meter/-/fps-meter-0.1.2.tgz", - "integrity": "sha512-aNZbZTBj7EuHYrSg8Yainb0wlF35Oi53pacj/UIY5IV9TBp/KA0Od7uYtqwWYVifSQ6BMBhck8LI3xIsAkR53Q==", - "requires": {} - }, - "@shikijs/engine-oniguruma": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.20.0.tgz", - "integrity": "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==", - "dev": true, - "requires": { - "@shikijs/types": "3.20.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "@shikijs/langs": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.20.0.tgz", - "integrity": "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==", - "dev": true, - "requires": { - "@shikijs/types": "3.20.0" - } - }, - "@shikijs/themes": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.20.0.tgz", - "integrity": "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==", - "dev": true, - "requires": { - "@shikijs/types": "3.20.0" - } - }, - "@shikijs/types": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.20.0.tgz", - "integrity": "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==", - "dev": true, - "requires": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "dev": true - }, - "@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "requires": { - "@hapi/hoek": "^9.0.0" - }, - "dependencies": { - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - } - } - }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "peer": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "peer": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - }, - "dependencies": { - "micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" - }, - "micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" - } - } - }, - "@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/chunked-blob-reader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", - "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/chunked-blob-reader-native": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", - "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", - "requires": { - "@smithy/util-base64": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", - "requires": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" - } - }, - "@smithy/core": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.0.tgz", - "integrity": "sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==", - "requires": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", - "requires": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "tslib": "^2.6.2" - } - }, - "@smithy/eventstream-codec": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.4.tgz", - "integrity": "sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==", - "requires": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/eventstream-serde-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.4.tgz", - "integrity": "sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==", - "requires": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/eventstream-serde-config-resolver": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.2.tgz", - "integrity": "sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/eventstream-serde-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.4.tgz", - "integrity": "sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==", - "requires": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/eventstream-serde-universal": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.4.tgz", - "integrity": "sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==", - "requires": { - "@smithy/eventstream-codec": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/fetch-http-handler": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", - "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", - "requires": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/hash-blob-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", - "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", - "requires": { - "@smithy/chunked-blob-reader": "^5.0.0", - "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", - "requires": { - "@smithy/types": "^4.3.1", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/hash-stream-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", - "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", - "requires": { - "@smithy/types": "^4.3.1", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/md5-js": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", - "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", - "requires": { - "@smithy/types": "^4.3.1", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", - "requires": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/middleware-endpoint": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.14.tgz", - "integrity": "sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ==", - "requires": { - "@smithy/core": "^3.7.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" - } - }, - "@smithy/middleware-retry": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.15.tgz", - "integrity": "sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ==", - "requires": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "dependencies": { - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - } - } - }, - "@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", - "requires": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", - "requires": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/node-http-handler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", - "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", - "requires": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", - "requires": { - "@smithy/types": "^4.3.1", - "@smithy/util-uri-escape": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", - "requires": { - "@smithy/types": "^4.3.1" - } - }, - "@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", - "requires": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/smithy-client": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.6.tgz", - "integrity": "sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ==", - "requires": { - "@smithy/core": "^3.7.0", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", - "tslib": "^2.6.2" - } - }, - "@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", - "requires": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", - "requires": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", - "requires": { - "@smithy/is-array-buffer": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-defaults-mode-browser": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.22.tgz", - "integrity": "sha512-hjElSW18Wq3fUAWVk6nbk7pGrV7ZT14DL1IUobmqhV3lxcsIenr5FUsDe2jlTVaS8OYBI3x+Og9URv5YcKb5QA==", - "requires": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "@smithy/util-defaults-mode-node": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.22.tgz", - "integrity": "sha512-7B8mfQBtwwr2aNRRmU39k/bsRtv9B6/1mTMrGmmdJFKmLAH+KgIiOuhaqfKOBGh9sZ/VkZxbvm94rI4MMYpFjQ==", - "requires": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", - "requires": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", - "requires": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", - "requires": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", - "requires": { - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", - "requires": { - "@smithy/util-buffer-from": "^4.0.0", - "tslib": "^2.6.2" - } - }, - "@smithy/util-waiter": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz", - "integrity": "sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==", - "requires": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - } - }, - "@solidjs/testing-library": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@solidjs/testing-library/-/testing-library-0.8.10.tgz", - "integrity": "sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==", - "dev": true, - "requires": { - "@testing-library/dom": "^10.4.0" - } - }, - "@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==" - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "requires": {} - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "requires": {} - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "requires": {} - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "requires": {} - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "requires": {} - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "requires": {} - }, - "@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - } - }, - "@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "requires": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "requires": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - } - }, - "@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "requires": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - } - }, - "@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "requires": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - } - }, - "@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "requires": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - } - }, - "@swc/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@tailwindcss/forms": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", - "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", - "dev": true, - "requires": { - "mini-svg-data-uri": "^1.2.3" - } - }, - "@tanstack/react-virtual": { - "version": "3.13.19", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.19.tgz", - "integrity": "sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==", - "requires": { - "@tanstack/virtual-core": "3.13.19" - } - }, - "@tanstack/virtual-core": { - "version": "3.13.19", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz", - "integrity": "sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==" - }, - "@tantaman/api-extractor": { - "version": "7.52.13", - "resolved": "https://registry.npmjs.org/@tantaman/api-extractor/-/api-extractor-7.52.13.tgz", - "integrity": "sha512-R/++OYrkWViuV2VEDkR+7ofEROh78qFFCt9NCll9ltusNPNWxSbA8pABLJLLMhCjR3XPjJU50tJ9JbB+KcZg8A==", - "dev": true, - "requires": { - "@microsoft/api-extractor-model": "7.30.7", - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.14.0", - "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.16.0", - "@rushstack/ts-command-line": "5.0.3", - "lodash": "~4.17.15", - "minimatch": "10.0.3", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "5.8.2" - }, - "dependencies": { - "minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "requires": { - "@isaacs/brace-expansion": "^5.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true - } - } - }, - "@testcontainers/postgresql": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-10.9.0.tgz", - "integrity": "sha512-Z3K/TFkl/PVE2v8A6yKqgF4pSFk9ilFG02yeGhPswUjmBlcig/rpVOjBQOkQ/yJCcQ/r2RrX3RR+7vr+UO4QlQ==", - "dev": true, - "requires": { - "testcontainers": "^10.9.0" - } - }, - "@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - } - }, - "@testing-library/react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5" - } - }, - "@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" - }, - "@ts-morph/common": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", - "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", - "requires": { - "fast-glob": "^3.2.7", - "minimatch": "^3.0.4", - "mkdirp": "^1.0.4", - "path-browserify": "^1.0.1" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" - }, - "@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true - }, - "@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "@types/aws-lambda": { - "version": "8.10.150", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.150.tgz", - "integrity": "sha512-AX+AbjH/rH5ezX1fbK8onC/a+HyQHo7QGmvoxAE42n22OsciAxvZoZNEr22tbXs8WfP1nIsBjKDpgPm3HjOZbA==" - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/basic-auth": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@types/basic-auth/-/basic-auth-1.1.8.tgz", - "integrity": "sha512-dKcUeixGuZn8pBjcUrf1N7x5K6lWuKuwHHitM2IZ4vwZUDWEhhNtwCWiba8jTA9zn0GQQ+fTFkWpKx8pOU/enw==", - "requires": { - "@types/node": "*" - } - }, - "@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/bunyan": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", - "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "requires": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "@types/command-line-args": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", - "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==" - }, - "@types/command-line-usage": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.2.tgz", - "integrity": "sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg==" - }, - "@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "requires": { - "@types/d3-color": "*" - } - }, - "@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==" - }, - "@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "requires": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "requires": { - "@types/ms": "*" - } - }, - "@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true - }, - "@types/docker-modem": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", - "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/ssh2": "*" - } - }, - "@types/dockerode": { - "version": "3.3.44", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.44.tgz", - "integrity": "sha512-fUpIHlsbYpxAJb285xx3vp7q5wf5mjqSn3cYwl/MhiM+DB99OdO5sOCPlO0PjO+TyOtphPs7tMVLU/RtOo/JjA==", - "dev": true, - "requires": { - "@types/docker-modem": "*", - "@types/node": "*", - "@types/ssh2": "*" - } - }, - "@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" - }, - "@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "requires": { - "@types/estree": "*" - } - }, - "@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" - }, - "@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "requires": { - "@types/unist": "*" - } - }, - "@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==" - }, - "@types/http-proxy": { - "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/js-cookie": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", - "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", - "dev": true - }, - "@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==" - }, - "@types/k6": { - "version": "0.53.2", - "resolved": "https://registry.npmjs.org/@types/k6/-/k6-0.53.2.tgz", - "integrity": "sha512-TxFJbeSfD/RfQe+GeMbpdwiOOySRTj3vfHvcA4yoLQ3wvGPjyppCqmyKXgktf3535T+YAc41bB7GkhuCPRmfUg==", - "dev": true - }, - "@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "requires": { - "@types/unist": "*" - } - }, - "@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" - }, - "@types/memcached": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", - "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", - "requires": { - "@types/node": "*" - } - }, - "@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "@types/mysql": { - "version": "2.15.27", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", - "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "22.18.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", - "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", - "requires": { - "undici-types": "~6.21.0" - }, - "dependencies": { - "undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" - } - } - }, - "@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "requires": { - "@types/node": "*" - } - }, - "@types/oracledb": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-6.5.2.tgz", - "integrity": "sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/pg": { - "version": "8.15.4", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", - "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", - "requires": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "@types/pg-format": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/pg-format/-/pg-format-1.0.5.tgz", - "integrity": "sha512-i+oEEJEC+1I3XAhgqtVp45Faj8MBbV0Aoq4rHsHD7avgLjyDkaWKObd514g0Q/DOUkdxU0P4CQ0iq2KR4SoJcw==", - "dev": true - }, - "@types/pg-pool": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", - "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", - "requires": { - "@types/pg": "*" - } - }, - "@types/pidusage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/pidusage/-/pidusage-2.0.5.tgz", - "integrity": "sha512-MIiyZI4/MK9UGUXWt0jJcCZhVw7YdhBuTOuqP/BjuLDLZ2PmmViMIQgZiWxtaMicQfAz/kMrZ5T7PKxFSkTeUA==", - "dev": true - }, - "@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==" - }, - "@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==" - }, - "@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==" - }, - "@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "@types/react": { - "version": "18.3.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", - "dev": true, - "requires": {} - }, - "@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==" - }, - "@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "requires": { - "@types/node": "*" - } - }, - "@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", - "dev": true - }, - "@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "requires": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - }, - "dependencies": { - "@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - } - } - }, - "@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "requires": { - "@types/node": "*" - } - }, - "@types/ssh2": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", - "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", - "dev": true, - "requires": { - "@types/node": "^18.11.18" - }, - "dependencies": { - "@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - } - } - }, - "@types/ssh2-streams": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz", - "integrity": "sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true - }, - "@types/strip-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-ansi/-/strip-ansi-3.0.0.tgz", - "integrity": "sha512-wVhzc+WJ/JNdV25MeaK0skxGdbdOFeqYv1sqY8yPXbsshZ0XwSbWWwfKzj836cPW+e+PpqUNvKoiac9ZqCdyRQ==", - "dev": true - }, - "@types/tedious": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", - "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", - "requires": { - "@types/node": "*" - } - }, - "@types/tmp": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", - "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", - "dev": true - }, - "@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" - }, - "@types/ws": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", - "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" - }, - "@urql/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", - "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", - "dev": true, - "peer": true, - "requires": { - "@0no-co/graphql.web": "^1.0.13", - "wonka": "^6.3.2" - } - }, - "@urql/exchange-retry": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", - "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", - "dev": true, - "peer": true, - "requires": { - "@urql/core": "^5.1.2", - "wonka": "^6.3.2" - } - }, - "@vercel/build-utils": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-8.7.0.tgz", - "integrity": "sha512-ofZX+ABiW76u5khIyYyH5xK5KSuiAteqRu5hz2k1a2WHLwF7VpeBg8gdFR+HwbVnNkHtkMA64ya5Dd/lNoABkw==" - }, - "@vercel/error-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.3.tgz", - "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==" - }, - "@vercel/nft": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.3.tgz", - "integrity": "sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.5", - "@rollup/pluginutils": "^4.0.0", - "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": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "@vercel/node": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vercel/node/-/node-3.2.29.tgz", - "integrity": "sha512-WRVYidBqtRyYUw36v/WyUB2v97PsiV2+LepUiOPWcW9UpszQGGT2DAzsXOYqWveXMJKFhx0aETR6Nn6i+Yps1Q==", - "requires": { - "@edge-runtime/node-utils": "2.3.0", - "@edge-runtime/primitives": "4.1.0", - "@edge-runtime/vm": "3.2.0", - "@types/node": "16.18.11", - "@vercel/build-utils": "8.7.0", - "@vercel/error-utils": "2.0.3", - "@vercel/nft": "0.27.3", - "@vercel/static-config": "3.0.0", - "async-listen": "3.0.0", - "cjs-module-lexer": "1.2.3", - "edge-runtime": "2.5.9", - "es-module-lexer": "1.4.1", - "esbuild": "0.14.47", - "etag": "1.8.1", - "node-fetch": "2.6.9", - "path-to-regexp": "6.2.1", - "ts-morph": "12.0.0", - "ts-node": "10.9.1", - "typescript": "4.9.5", - "undici": "5.28.4" - }, - "dependencies": { - "@types/node": { - "version": "16.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", - "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==" - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" - }, - "es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" - }, - "esbuild": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", - "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", - "requires": { - "esbuild-android-64": "0.14.47", - "esbuild-android-arm64": "0.14.47", - "esbuild-darwin-64": "0.14.47", - "esbuild-darwin-arm64": "0.14.47", - "esbuild-freebsd-64": "0.14.47", - "esbuild-freebsd-arm64": "0.14.47", - "esbuild-linux-32": "0.14.47", - "esbuild-linux-64": "0.14.47", - "esbuild-linux-arm": "0.14.47", - "esbuild-linux-arm64": "0.14.47", - "esbuild-linux-mips64le": "0.14.47", - "esbuild-linux-ppc64le": "0.14.47", - "esbuild-linux-riscv64": "0.14.47", - "esbuild-linux-s390x": "0.14.47", - "esbuild-netbsd-64": "0.14.47", - "esbuild-openbsd-64": "0.14.47", - "esbuild-sunos-64": "0.14.47", - "esbuild-windows-32": "0.14.47", - "esbuild-windows-64": "0.14.47", - "esbuild-windows-arm64": "0.14.47" - } - }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - } - } - }, - "@vercel/oidc": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", - "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==" - }, - "@vercel/static-config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.0.0.tgz", - "integrity": "sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==", - "requires": { - "ajv": "8.6.3", - "json-schema-to-ts": "1.6.4", - "ts-morph": "12.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "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==" - } - } - }, - "@vitejs/plugin-react": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", - "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", - "dev": true, - "requires": { - "@babel/core": "^7.28.5", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.53", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" - }, - "dependencies": { - "react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "dev": true - } - } - }, - "@vitest/browser": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", - "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", - "dev": true, - "requires": { - "@vitest/mocker": "4.0.15", - "@vitest/utils": "4.0.15", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "dependencies": { - "pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "dev": true - } - } - }, - "@vitest/browser-playwright": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", - "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", - "dev": true, - "requires": { - "@vitest/browser": "4.0.15", - "@vitest/mocker": "4.0.15", - "tinyrainbow": "^3.0.3" - } - }, - "@vitest/coverage-v8": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.15.tgz", - "integrity": "sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.0.15", - "ast-v8-to-istanbul": "^0.3.8", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.1", - "obug": "^2.1.1", - "std-env": "^3.10.0", - "tinyrainbow": "^3.0.3" - } - }, - "@vitest/expect": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz", - "integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==", - "dev": true, - "requires": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.15", - "@vitest/utils": "4.0.15", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - } - }, - "@vitest/mocker": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", - "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", - "dev": true, - "requires": { - "@vitest/spy": "4.0.15", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "dependencies": { - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - } - } - }, - "@vitest/pretty-format": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz", - "integrity": "sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==", - "dev": true, - "requires": { - "tinyrainbow": "^3.0.3" - } - }, - "@vitest/runner": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz", - "integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==", - "dev": true, - "requires": { - "@vitest/utils": "4.0.15", - "pathe": "^2.0.3" - } - }, - "@vitest/snapshot": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz", - "integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==", - "dev": true, - "requires": { - "@vitest/pretty-format": "4.0.15", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - } - }, - "@vitest/spy": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz", - "integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==", - "dev": true - }, - "@vitest/ui": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.15.tgz", - "integrity": "sha512-sxSyJMaKp45zI0u+lHrPuZM1ZJQ8FaVD35k+UxVrha1yyvQ+TZuUYllUixwvQXlB7ixoDc7skf3lQPopZIvaQw==", - "dev": true, - "requires": { - "@vitest/utils": "4.0.15", - "fflate": "^0.8.2", - "flatted": "^3.3.3", - "pathe": "^2.0.3", - "sirv": "^3.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3" - } - }, - "@vitest/utils": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.15.tgz", - "integrity": "sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==", - "dev": true, - "requires": { - "@vitest/pretty-format": "4.0.15", - "tinyrainbow": "^3.0.3" - } - }, - "@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "requires": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "peer": true - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "@xyflow/react": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.8.2.tgz", - "integrity": "sha512-VifLpxOy74ck283NQOtBn1e8igmB7xo7ADDKxyBHkKd8IKpyr16TgaYOhzqVwNMdB4NT+m++zfkic530L+gEXw==", - "requires": { - "@xyflow/system": "0.0.66", - "classcat": "^5.0.3", - "zustand": "^4.4.0" - } - }, - "@xyflow/system": { - "version": "0.0.66", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.66.tgz", - "integrity": "sha512-TTxESDwPsATnuDMUeYYtKe4wt9v8bRO29dgYBhR8HyhSCzipnAdIL/1CDfFd+WqS1srVreo24u6zZeVIDk4r3Q==", - "requires": { - "@types/d3-drag": "^3.0.7", - "@types/d3-interpolate": "^3.0.4", - "@types/d3-selection": "^3.0.10", - "@types/d3-transition": "^3.0.8", - "@types/d3-zoom": "^3.0.8", - "d3-drag": "^3.0.0", - "d3-interpolate": "^3.0.1", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - } - } - }, - "acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" - }, - "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==", - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} - }, - "acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==" - }, - "address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" - }, - "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==" - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ai": { - "version": "5.0.113", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.113.tgz", - "integrity": "sha512-26vivpSO/mzZj0k1Si2IpsFspp26ttQICHRySQiMrtWcRd5mnJMX2a8sG28vmZ38C+JUn1cWmfZrsLMxkSMw9g==", - "requires": { - "@ai-sdk/gateway": "2.0.21", - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", - "@opentelemetry/api": "1.9.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "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==" - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "algoliasearch": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", - "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", - "requires": { - "@algolia/abtesting": "1.12.0", - "@algolia/client-abtesting": "5.46.0", - "@algolia/client-analytics": "5.46.0", - "@algolia/client-common": "5.46.0", - "@algolia/client-insights": "5.46.0", - "@algolia/client-personalization": "5.46.0", - "@algolia/client-query-suggestions": "5.46.0", - "@algolia/client-search": "5.46.0", - "@algolia/ingestion": "1.46.0", - "@algolia/monitoring": "1.46.0", - "@algolia/recommend": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" - } - }, - "algoliasearch-helper": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz", - "integrity": "sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==", - "requires": { - "@algolia/events": "^4.0.1" - } - }, - "analyze-query": { - "version": "file:packages/analyze-query", - "requires": { - "@dotenvx/dotenvx": "^1.39.0", - "ast-to-zql": "0.0.0", - "chalk": "^5.3.0", - "otel": "0.0.0", - "shared": "0.0.0", - "vitest": "4.0.15", - "zero-cache": "0.0.0", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0", - "zqlite": "0.0.0" - }, - "dependencies": { - "chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" - } - } - }, - "anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "peer": true - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - } - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "dev": true, - "requires": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - } - }, - "tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "requires": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - } - } - }, - "archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "dev": true, - "requires": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - } - } - } - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } - }, - "array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "dev": true, - "requires": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - } - }, - "assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true - }, - "ast-to-zql": { - "version": "file:packages/ast-to-zql", - "requires": { - "@faker-js/faker": "^9.6.0", - "prettier": "^3.8.1", - "shared": "0.0.0", - "zero-cache": "0.0.0", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0" - } - }, - "ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, - "ast-v8-to-istanbul": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", - "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" - }, - "dependencies": { - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - }, - "js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true - } - } - }, - "astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==" - }, - "async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "peer": true - }, - "async-listen": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz", - "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==" - }, - "async-mutex": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", - "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", - "dev": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "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==" - }, - "atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" - }, - "attr-accept": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", - "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==" - }, - "autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", - "requires": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - } - }, - "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==", - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "avvio": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.0.0.tgz", - "integrity": "sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==", - "requires": { - "@fastify/error": "^4.0.0", - "fastq": "^1.17.1" - } - }, - "await-lock": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", - "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", - "dev": true - }, - "aws-ssl-profiles": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "dev": true - }, - "b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "dev": true, - "requires": {} - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "peer": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "requires": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "peer": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - } - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "peer": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-jsx-dom-expressions": { - "version": "0.39.8", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.39.8.tgz", - "integrity": "sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.18.6", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.20.7", - "html-entities": "2.3.3", - "parse5": "^7.1.2", - "validate-html-nesting": "^1.2.1" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "requires": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - } - }, - "babel-plugin-react-compiler": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", - "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", - "dev": true, - "peer": true, - "requires": { - "@babel/types": "^7.26.0" - } - }, - "babel-plugin-react-native-web": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.1.tgz", - "integrity": "sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==", - "dev": true, - "peer": true - }, - "babel-plugin-syntax-hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", - "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", - "dev": true, - "peer": true, - "requires": { - "hermes-parser": "0.29.1" - } - }, - "babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "peer": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "peer": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "babel-preset-solid": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.6.tgz", - "integrity": "sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==", - "dev": true, - "requires": { - "babel-plugin-jsx-dom-expressions": "^0.39.8" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", - "dev": true - }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "bare-events": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.0.tgz", - "integrity": "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA==", - "dev": true, - "requires": {} - }, - "bare-fs": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.10.tgz", - "integrity": "sha512-arqVF+xX/rJHwrONZaSPhlzleT2gXwVs9rsAe1p1mIVwWZI2A76/raio+KwwxfWMO8oV9Wo90EaUkS2QwVmy4w==", - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", - "dev": true, - "optional": true - }, - "bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "dev": true, - "optional": true, - "requires": { - "bare-os": "^3.0.1" - } - }, - "bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", - "dev": true, - "optional": true, - "requires": { - "streamx": "^2.21.0" - } - }, - "bare-url": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.0.tgz", - "integrity": "sha512-c+RCqMSZbkz97Mw1LWR0gcOqwK82oyYKfLoHJ8k13ybi1+I80ffdDzUy0TdAburdrR/kI0/VuN8YgEnJqX+Nyw==", - "dev": true, - "optional": true, - "requires": { - "bare-path": "^3.0.0" - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "baseline-browser-mapping": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz", - "integrity": "sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==" - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "basic-ftp": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", - "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" - }, - "better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, - "peer": true, - "requires": { - "open": "^8.0.4" - } - }, - "big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "peer": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "requires": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "requires": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" - } - } - }, - "bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "requires": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "bplist-creator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", - "dev": true, - "peer": true, - "requires": { - "stream-buffers": "2.2.x" - } - }, - "bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", - "dev": true, - "peer": true, - "requires": { - "big-integer": "1.6.x" - } - }, - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "requires": { - "fill-range": "^7.1.1" - } - }, - "brotli-wasm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-3.0.1.tgz", - "integrity": "sha512-U3K72/JAi3jITpdhZBqzSUq+DUY697tLxOuFXB+FpAE/Ug+5C3VZrv4uA674EUZHxNAuQ9wETXNqQkxZD6oL4A==", - "dev": true - }, - "browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "requires": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "peer": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buildcheck": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", - "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", - "dev": true, - "optional": true - }, - "bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "requires": { - "run-applescript": "^7.0.0" - } - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" - }, - "cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==" - }, - "cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "requires": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "dependencies": { - "mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==" - } - } - }, - "call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "requires": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - } - }, - "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==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "dev": true, - "peer": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "peer": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dev": true, - "peer": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==" - }, - "ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" - }, - "chai": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", - "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "requires": { - "chalk": "^4.1.2" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - }, - "character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" - }, - "character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" - }, - "character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" - }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - } - }, - "chevrotain": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz", - "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==", - "dev": true, - "requires": { - "@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" - } - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - } - }, - "chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==" - }, - "chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" - }, - "citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "dev": true, - "requires": { - "consola": "^3.2.3" - } - }, - "cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" - }, - "classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" - }, - "classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "peer": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "peer": true - }, - "cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "client-simulator": { - "version": "file:tools/client-simulator", - "requires": { - "@dotenvx/dotenvx": "^1.39.0", - "@rocicorp/logger": "^5.4.0", - "nanoid": "^5.1.2", - "shared": "0.0.0", - "ws": "^8.18.1", - "zero-protocol": "0.0.0" - }, - "dependencies": { - "nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==" - } - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "peer": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "cloudevents": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-10.0.0.tgz", - "integrity": "sha512-uyzC+PpMMRawbouHO+3mlisr3QfEDObmo2pN4oTTF6dZncZgpIzdasZx0tRBFI1dMsqCLZZXMtz8cUuvYqHdbw==", - "requires": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "json-bigint": "^1.0.0", - "process": "^0.11.10", - "util": "^0.12.4", - "uuid": "^8.3.2" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - } - }, - "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==" - } - } - }, - "clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" - }, - "code-block-writer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", - "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==" - }, - "collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==" - }, - "comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" - }, - "command-line-args": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz", - "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==", - "requires": { - "array-back": "^6.2.2", - "find-replace": "^5.0.2", - "lodash.camelcase": "^4.3.0", - "typical": "^7.2.0" - } - }, - "command-line-usage": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", - "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", - "requires": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^4.1.0", - "typical": "^7.1.1" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "compare-utf8": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/compare-utf8/-/compare-utf8-0.1.1.tgz", - "integrity": "sha512-bND8Irz+KrF96w4Tkm1m8u5q8iE2fnvP196sHGy7XNrGNXlhyl07VnsCRYrXgEhhf/lM7hyCKRnMeh8Icis4Sw==" - }, - "compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - } - } - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==" - } - } - }, - "compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "requires": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "requires": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" - }, - "consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-hrtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==" - }, - "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==" - }, - "cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==" - }, - "cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "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==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" - } - } - }, - "core-js": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", - "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==" - }, - "core-js-compat": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", - "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", - "requires": { - "browserslist": "^4.28.0" - } - }, - "core-js-pure": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", - "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cors-gate": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cors-gate/-/cors-gate-1.1.3.tgz", - "integrity": "sha512-RFqvbbpj02lqKDhqasBEkgzmT3RseCH3DKy5sT2W9S1mhctABKQP3ktKcnKN0h8t4pJ2SneI3hPl3TGNi/VmZA==", - "dev": true - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - } - }, - "cpu-features": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", - "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", - "dev": true, - "optional": true, - "requires": { - "buildcheck": "~0.0.6", - "nan": "^2.19.0" - } - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true - }, - "crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - } - } - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "dev": true, - "requires": { - "node-fetch": "^2.7.0" - } - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" - } - } - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-declaration-sorter": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", - "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", - "requires": {} - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - } - }, - "css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - } - }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "requires": {} - }, - "css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "requires": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "cssdb": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", - "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "requires": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "dependencies": { - "lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" - } - } - }, - "cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "requires": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - } - }, - "cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "requires": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - } - }, - "cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "requires": {} - }, - "csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "requires": { - "css-tree": "~2.2.0" - }, - "dependencies": { - "css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "requires": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - } - }, - "mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - } - } - }, - "cssstyle": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", - "dev": true, - "requires": { - "@asamuzakjp/css-color": "^3.2.0", - "rrweb-cssom": "^0.8.0" - } - }, - "csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" - }, - "d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" - }, - "d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - } - }, - "d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "requires": { - "d3-color": "1 - 3" - } - }, - "d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" - }, - "d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" - }, - "d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "requires": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - } - }, - "data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true - }, - "data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "requires": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "dependencies": { - "tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "requires": { - "punycode": "^2.3.1" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "requires": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - } - } - } - }, - "datadog": { - "version": "file:packages/datadog", - "requires": { - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.0.15", - "shared": "0.0.0", - "typescript": "~5.9.3", - "vitest": "4.0.15" - }, - "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } - } - }, - "debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" - }, - "debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "requires": { - "ms": "^2.1.3" - } - }, - "decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true - }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "requires": { - "character-entities": "^2.0.0" - }, - "dependencies": { - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" - } - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - }, - "deepmerge-ts": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", - "dev": true - }, - "default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", - "requires": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - } - }, - "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==" - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "peer": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, - "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==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" - }, - "degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "requires": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - }, - "destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "destroyable-server": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/destroyable-server/-/destroyable-server-1.1.1.tgz", - "integrity": "sha512-7tjgU/99QVuYSqkMXr6XdQSvXj+8TjC9NiRVWNSyGytxklZ88m+qcSvWTJ3VysE3I9wurph7dTciLEEj8aUlaQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==" - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "requires": { - "dequal": "^2.0.0" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "docker-compose": { - "version": "0.24.8", - "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", - "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", - "dev": true, - "requires": { - "yaml": "^2.2.2" - } - }, - "docker-modem": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", - "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "readable-stream": "^3.5.0", - "split-ca": "^1.0.1", - "ssh2": "^1.15.0" - } - }, - "dockerode": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.9.tgz", - "integrity": "sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==", - "dev": true, - "requires": { - "@balena/dockerignore": "^1.0.2", - "@grpc/grpc-js": "^1.11.1", - "@grpc/proto-loader": "^0.7.13", - "docker-modem": "^5.0.6", - "protobufjs": "^7.3.2", - "tar-fs": "^2.1.4", - "uuid": "^10.0.0" - }, - "dependencies": { - "uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true - } - } - }, - "docusaurus-plugin-script-tags": { - "version": "2.0.0-beta.6", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-script-tags/-/docusaurus-plugin-script-tags-2.0.0-beta.6.tgz", - "integrity": "sha512-kUJ9DS7cK7RTt1pqfmQG0lDjmuIq52y87l4lM7EmfdBvZowi1wTQ6eDszxjn8Oo9Lpv0g1MP8g+uTudUIWp0hQ==" - }, - "docusaurus-plugin-typedoc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-typedoc/-/docusaurus-plugin-typedoc-1.4.2.tgz", - "integrity": "sha512-1qerRejLSYxEWdyVPLDMMeKFPLA/37yZAsdwJy9ThHFQR78+v3b5spSbk67VHGLr2mAn4FVHu0aGJ6p7iWotSg==", - "dev": true, - "requires": { - "typedoc-docusaurus-theme": "^1.4.0" - } - }, - "dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "requires": { - "is-obj": "^2.0.0" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - } - } - }, - "dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" - }, - "dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "dev": true, - "peer": true, - "requires": { - "dotenv": "^16.4.5" - } - }, - "drizzle-kit": { - "version": "0.31.5", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.5.tgz", - "integrity": "sha512-+CHgPFzuoTQTt7cOYCV6MOw2w8vqEn/ap1yv4bpZOWL03u7rlVRQhUY0WYT3rHsgVTXwYQDZaSUJSQrMBUKuWg==", - "dev": true, - "requires": { - "@drizzle-team/brocli": "^0.10.2", - "@esbuild-kit/esm-loader": "^2.5.5", - "esbuild": "^0.25.4", - "esbuild-register": "^3.5.0" - } - }, - "drizzle-orm": { - "version": "0.44.5", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.44.5.tgz", - "integrity": "sha512-jBe37K7d8ZSKptdKfakQFdeljtu3P2Cbo7tJoJSVZADzIKOBo9IAJPOmMsH2bZl90bZgh8FQlD8BjxXA/zuBkQ==", - "dev": true, - "requires": {} - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "eciesjs": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.14.tgz", - "integrity": "sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==", - "requires": { - "@ecies/ciphers": "^0.2.2", - "@noble/ciphers": "^1.0.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0" - } - }, - "edge-runtime": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.9.tgz", - "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==", - "requires": { - "@edge-runtime/format": "2.2.1", - "@edge-runtime/ponyfill": "2.4.2", - "@edge-runtime/vm": "3.2.0", - "async-listen": "3.0.1", - "mri": "1.2.0", - "picocolors": "1.0.0", - "pretty-ms": "7.0.1", - "signal-exit": "4.0.2", - "time-span": "4.0.0" - }, - "dependencies": { - "async-listen": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz", - "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==" - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "effect": { - "version": "3.18.4", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", - "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", - "dev": true, - "requires": { - "@standard-schema/spec": "^1.0.0", - "fast-check": "^3.23.1" - } - }, - "electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==" - }, - "emoji-picker-element": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/emoji-picker-element/-/emoji-picker-element-1.22.8.tgz", - "integrity": "sha512-EFgRjrlIcdA1ilyMH/f9KjB0Pi/vynrojNgMDZfU1Jv2YLrhdLJWx6xCehizPyxm4/NUuB8DfFvIT4v+1njjPQ==" - }, - "emoji-picker-element-data": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/emoji-picker-element-data/-/emoji-picker-element-data-1.6.1.tgz", - "integrity": "sha512-VYXjjqWYy12/uUA3q5X6Di0zROXp8TGwPiikXkhs97n3d3q3OaRV2sxGtUUColoSMPp5lfASZB9E4W+yN40qUg==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==" - }, - "empathic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", - "dev": true - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "env-editor": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "dev": true, - "peer": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dev": true, - "peer": true, - "requires": { - "stackframe": "^1.3.4" - } - }, - "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==" - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" - }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "requires": { - "es-errors": "^1.3.0" - } - }, - "esast-util-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", - "requires": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0" - } - }, - "esast-util-from-js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", - "requires": { - "@types/estree-jsx": "^1.0.0", - "acorn": "^8.0.0", - "esast-util-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "requires": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" - } - }, - "esbuild-android-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", - "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", - "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", - "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", - "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", - "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", - "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", - "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", - "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", - "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", - "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", - "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", - "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", - "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", - "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", - "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", - "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", - "optional": true - }, - "esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "esbuild-sunos-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", - "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", - "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", - "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", - "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", - "optional": true - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" - }, - "escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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==" - }, - "escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "requires": { - "@types/estree": "^1.0.0" - } - }, - "estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "requires": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "dependencies": { - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "requires": { - "@types/estree": "^1.0.0" - } - } - } - }, - "estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==" - }, - "estree-util-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", - "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", - "requires": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0" - } - }, - "estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "requires": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - } - }, - "estree-util-value-to-estree": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", - "requires": { - "@types/estree": "^1.0.0" - } - }, - "estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - } - }, - "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==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "requires": { - "@types/node": "*", - "require-like": ">= 0.1.1" - } - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "dev": true, - "requires": { - "bare-events": "^2.7.0" - } - }, - "eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==" - }, - "exec-async": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", - "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "dev": true, - "peer": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true - }, - "expo-modules-autolinking": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.15.tgz", - "integrity": "sha512-B6c+x664ImrWd+PknEy5454gtY6P0cMxj4P50fvLYP4HimbYj9SzwoHqZ/Rxh9NwxnUkT2nappk/USYIcPoS/A==", - "dev": true, - "peer": true, - "requires": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true - } - } - }, - "expo-server": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", - "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "dev": true, - "peer": true - }, - "exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "peer": true - }, - "express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - } - } - }, - "exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fast-check": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", - "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", - "dev": true, - "requires": { - "pure-rand": "^6.1.0" - } - }, - "fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==" - }, - "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==" - }, - "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==" - }, - "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 - }, - "fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - } - }, - "fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", - "dev": true - }, - "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==" - }, - "fast-json-stringify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.0.0.tgz", - "integrity": "sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==", - "requires": { - "@fastify/merge-json-schemas": "^0.1.1", - "ajv": "^8.12.0", - "ajv-formats": "^3.0.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.3.0", - "json-schema-ref-resolver": "^1.0.1", - "rfdc": "^1.2.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "dependencies": { - "fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" - } - } - }, - "fast-uri": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", - "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==" - }, - "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==" - } - } - }, - "fast-querystring": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", - "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", - "requires": { - "fast-decode-uri-component": "^1.0.1" - } - }, - "fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" - }, - "fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "requires": { - "strnum": "^2.1.0" - } - }, - "fastify": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.6.1.tgz", - "integrity": "sha512-WjjlOciBF0K8pDUPZoGPhqhKrQJ02I8DKaDIfO51EL0kbSMwQFl85cRwhOvmSDWoukNOdTo27gLN549pLCcH7Q==", - "requires": { - "@fastify/ajv-compiler": "^4.0.0", - "@fastify/error": "^4.0.0", - "@fastify/fast-json-stringify-compiler": "^5.0.0", - "@fastify/proxy-addr": "^5.0.0", - "abstract-logging": "^2.0.1", - "avvio": "^9.0.0", - "fast-json-stringify": "^6.0.0", - "find-my-way": "^9.0.0", - "light-my-request": "^6.0.0", - "pino": "^9.0.0", - "process-warning": "^5.0.0", - "rfdc": "^1.3.1", - "secure-json-parse": "^4.0.0", - "semver": "^7.6.0", - "toad-cache": "^3.7.0" - } - }, - "fastify-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.0.0.tgz", - "integrity": "sha512-0725fmH/yYi8ugsjszLci+lLnGBK6cG+WSxM7edY2OXJEU7gr2JiGBoieL2h9mhTych1vFsEfXsAsGGDJ/Rd5w==" - }, - "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "requires": { - "format": "^0.2.0" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-dotslash": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", - "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true, - "peer": true - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "peer": true, - "requires": { - "bser": "2.1.1" - } - }, - "feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "requires": { - "xml-js": "^1.6.11" - } - }, - "fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - } - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "file-selector": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", - "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", - "requires": { - "tslib": "^2.7.0" - } - }, - "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==" - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" - } - } - }, - "find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "requires": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - } - }, - "find-my-way": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.0.1.tgz", - "integrity": "sha512-/5NN/R0pFWuff16TMajeKt2JyiW+/OE8nOO8vo1DwZTxLaIURb7lcBYPIgRPh61yCNh9l8voeKwcrkUzmB00vw==", - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^4.0.0" - } - }, - "find-process": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.10.tgz", - "integrity": "sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==", - "requires": { - "chalk": "~4.1.2", - "commander": "^12.1.0", - "loglevel": "^1.9.2" - }, - "dependencies": { - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==" - } - } - }, - "find-replace": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", - "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", - "requires": {} - }, - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "dependencies": { - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" - } - } - }, - "find-up-simple": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", - "dev": true - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - }, - "flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true - }, - "flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true, - "peer": true - }, - "follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" - }, - "fontfaceobserver": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", - "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true, - "peer": true - }, - "for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "requires": { - "is-callable": "^1.2.7" - } - }, - "foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, - "form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==" - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "forwarded-parse": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", - "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==" - }, - "fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==" - }, - "freeport-async": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", - "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "dev": true, - "peer": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", - "requires": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "dependencies": { - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - } - } - }, - "gcp-metadata": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", - "requires": { - "gaxios": "^6.1.1", - "google-logging-utils": "^0.0.2", - "json-bigint": "^1.0.0" - } - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, - "requires": { - "is-property": "^1.0.2" - } - }, - "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==" - }, - "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==" - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "requires": { - "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" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "peer": true - }, - "get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==" - }, - "get-port-please": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", - "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", - "dev": true - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "dev": true, - "requires": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - } - }, - "getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true, - "peer": true - }, - "giget": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", - "dev": true, - "requires": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.6.0", - "pathe": "^2.0.3" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "requires": {} - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - } - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==" - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - }, - "got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==" - } - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "grammex": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.12.tgz", - "integrity": "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==", - "dev": true - }, - "graphql": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", - "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", - "dev": true, - "peer": true - }, - "graphql-http": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/graphql-http/-/graphql-http-1.22.4.tgz", - "integrity": "sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==", - "dev": true, - "requires": {} - }, - "graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "requires": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "requires": { - "has-symbols": "^1.0.3" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==" - }, - "hash-wasm": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", - "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", - "requires": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "dependencies": { - "web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" - } - } - }, - "hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "requires": { - "@types/hast": "^3.0.0" - } - }, - "hast-util-raw": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", - "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", - "requires": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "dependencies": { - "web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" - } - } - }, - "hast-util-sanitize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.1.tgz", - "integrity": "sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==", - "requires": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.2.0", - "unist-util-position": "^5.0.0" - } - }, - "hast-util-to-estree": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", - "requires": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "dependencies": { - "property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==" - } - } - }, - "hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "requires": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - } - }, - "hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "requires": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "dependencies": { - "web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" - } - } - }, - "hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "requires": { - "@types/hast": "^3.0.0" - } - }, - "hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", - "requires": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hermes-compiler": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", - "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "dev": true, - "peer": true - }, - "hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "dev": true, - "peer": true - }, - "hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", - "dev": true, - "peer": true, - "requires": { - "hermes-estree": "0.29.1" - } - }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "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==" - } - } - }, - "hono": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", - "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^3.1.1" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "requires": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "dependencies": { - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" - } - } - }, - "html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==" - }, - "html-url-attributes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", - "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==" - }, - "html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" - }, - "html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - } - } - } - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "http-encoding": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/http-encoding/-/http-encoding-2.1.1.tgz", - "integrity": "sha512-3QaTIBHWLcmq63sSKHVGiUExX+XnOQx1szJJH6wJgyWyXDpSdmKiaBXN/5xF74eToh0VujfJGFBF3tunaK2ZQA==", - "dev": true, - "requires": { - "brotli-wasm": "^3.0.0", - "pify": "^5.0.0", - "zstd-codec": "^0.1.5" - }, - "dependencies": { - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - } - } - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - } - } - }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - } - }, - "http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "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==", - "dev": true - }, - "http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "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==", - "requires": { - "agent-base": "^7.1.2", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - }, - "idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" - }, - "image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", - "dev": true, - "peer": true, - "requires": { - "queue": "6.0.2" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "import-in-the-middle": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", - "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", - "requires": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "infima": { - "version": "0.2.0-alpha.45", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", - "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "dev": true - }, - "ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==" - }, - "is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" - }, - "is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "requires": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - } - }, - "is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "requires": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "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==" - }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "requires": { - "ci-info": "^3.2.0" - } - }, - "is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "requires": { - "hasown": "^2.0.2" - } - }, - "is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "peer": true - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "requires": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" - }, - "is-in-subnet": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-in-subnet/-/is-in-subnet-4.0.1.tgz", - "integrity": "sha512-D3mAuAo6vZ+/AxsLkEIZ3moTx7AIGQLLzLQslV6n0RRO/CzdUemXap+lj3OPAehKCbdkGPikxOVUYqRo0GGJAA==" - }, - "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==", - "requires": { - "is-docker": "^3.0.0" - }, - "dependencies": { - "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==" - } - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==" - }, - "is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true - }, - "is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "dev": true - }, - "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==", - "requires": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "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==", - "requires": { - "which-typed-array": "^1.1.16" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" - }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "dev": true, - "requires": {} - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - } - }, - "istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterall": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==", - "dev": true - }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true - } - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "peer": true - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true - } - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jimp-compact": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", - "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true, - "peer": true - }, - "jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==" - }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "requires": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - }, - "dependencies": { - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - } - } - }, - "jose": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.3.tgz", - "integrity": "sha512-egLIoYSpcd+QUF+UHgobt5YzI2Pkw/H39ou9suW687MY6PmCwPmkNV/4TNjn1p2tX5xO3j0d0sq5hiYE24bSlg==" - }, - "js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-xxhash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-xxhash/-/js-xxhash-4.0.0.tgz", - "integrity": "sha512-3Q2eIqG6s1KEBBmkj9tGM9lef8LJbuRyTVBdI3GpTnrvtytunjLPO0wqABp5qhtMzfA32jYn1FlnIV7GH1RAHQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true, - "peer": true - }, - "jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "dev": true, - "requires": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "dependencies": { - "tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "requires": { - "tldts": "^6.1.32" - } - }, - "tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "requires": { - "punycode": "^2.3.1" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "requires": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - } - } - } - }, - "jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-custom-numbers": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/json-custom-numbers/-/json-custom-numbers-3.1.1.tgz", - "integrity": "sha512-rYIAIuiIRy58aax2tuZb7HawKFATBG848PiguybJh/R+pvC8jxjEOVBQHj4J3U2D4/Y4acBCO4A/glILW8wPoA==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "peer": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-ref-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", - "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-to-ts": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", - "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", - "requires": { - "@types/json-schema": "^7.0.6", - "ts-toolbelt": "^6.15.5" - } - }, - "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==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" - } - } - }, - "kasi": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kasi/-/kasi-1.1.0.tgz", - "integrity": "sha512-SvmC8+vhkDariSTz2182qyQ+mhwZ4W8TWaIHJcz358bYBeccQ8WBYj7uTtzHoCmpPHaoCm3PaOhzRg7Z8F4Lww==" - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "lan-network": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", - "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "dev": true, - "peer": true - }, - "latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "requires": { - "package-json": "^8.1.0" - } - }, - "launch-editor": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", - "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", - "requires": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" - } - }, - "lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "light-my-request": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", - "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", - "requires": { - "cookie": "^1.0.1", - "process-warning": "^4.0.0", - "set-cookie-parser": "^2.6.0" - }, - "dependencies": { - "process-warning": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", - "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" - } - } - }, - "lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dev": true, - "peer": true, - "requires": { - "debug": "^2.6.9", - "marky": "^1.2.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - } - } - }, - "lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "devOptional": true, - "peer": true, - "requires": { - "detect-libc": "^2.0.3", - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" - } - }, - "lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "optional": true, - "peer": true - }, - "lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "optional": true, - "peer": true - }, - "lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "optional": true, - "peer": true - }, - "lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "optional": true, - "peer": true - }, - "lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "optional": true, - "peer": true - }, - "lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "optional": true, - "peer": true - }, - "lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "optional": true, - "peer": true - }, - "lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "optional": true, - "peer": true - }, - "lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "optional": true, - "peer": true - }, - "lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "optional": true, - "peer": true - }, - "lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "optional": true, - "peer": true - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "requires": { - "uc.micro": "^2.0.0" - } - }, - "load-generator": { - "version": "file:tools/load-generator", - "requires": { - "@dotenvx/dotenvx": "^1.39.0", - "@rocicorp/logger": "^5.4.0", - "nanoid": "^5.1.2", - "pg-format": "npm:pg-format-fix@^1.0.5", - "postgres": "3.4.7", - "shared": "0.0.0" - }, - "dependencies": { - "nanoid": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", - "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==" - } - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "requires": { - "p-locate": "^6.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "peer": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loglevel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==" - }, - "long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==" - }, - "longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" - }, - "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==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lru.min": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.3.tgz", - "integrity": "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==", - "dev": true - }, - "lucide-react": { - "version": "0.539.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.539.0.tgz", - "integrity": "sha512-VVISr+VF2krO91FeuCrm1rSOLACQUYVy7NQkzrOty52Y8TlTPcXcMdQFj9bYzBgXbWCiywlwSZ3Z8u6a+6bMlg==", - "requires": {} - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "magicast": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", - "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", - "dev": true, - "requires": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "source-map-js": "^1.2.1" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "peer": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==" - }, - "markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "requires": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - } - }, - "markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==" - }, - "marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==" - }, - "marky": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true, - "peer": true - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - }, - "mdast-util-directive": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", - "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", - "requires": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - } - }, - "mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "requires": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - } - } - }, - "mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "requires": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - } - }, - "mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "requires": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - } - } - }, - "mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "requires": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "requires": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - } - }, - "mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "requires": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - } - }, - "mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "requires": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "requires": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "requires": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-mdx-jsx": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", - "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - } - }, - "mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "requires": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - } - }, - "mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "requires": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - } - }, - "mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "requires": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "requires": { - "@types/mdast": "^4.0.0" - } - }, - "mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "memfs": { - "version": "4.51.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.1.tgz", - "integrity": "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==", - "requires": { - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - } - }, - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true, - "peer": true - }, - "merge-anything": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", - "integrity": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==", - "dev": true, - "requires": { - "is-what": "^4.1.8" - } - }, - "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "metro": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", - "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.29.1", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.1", - "metro-cache": "0.83.1", - "metro-cache-key": "0.83.1", - "metro-config": "0.83.1", - "metro-core": "0.83.1", - "metro-file-map": "0.83.1", - "metro-resolver": "0.83.1", - "metro-runtime": "0.83.1", - "metro-source-map": "0.83.1", - "metro-symbolicate": "0.83.1", - "metro-transform-plugins": "0.83.1", - "metro-transform-worker": "0.83.1", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "peer": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true - }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "metro-babel-transformer": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", - "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.29.1", - "nullthrows": "^1.1.1" - } - }, - "metro-cache": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", - "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", - "dev": true, - "peer": true, - "requires": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.1" - } - }, - "metro-cache-key": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", - "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6" - } - }, - "metro-config": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", - "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", - "dev": true, - "peer": true, - "requires": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.83.1", - "metro-cache": "0.83.1", - "metro-core": "0.83.1", - "metro-runtime": "0.83.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "peer": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "dev": true, - "peer": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "peer": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "peer": true - } - } - }, - "metro-core": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", - "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.1" - } - }, - "metro-file-map": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", - "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", - "dev": true, - "peer": true, - "requires": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - } - }, - "metro-minify-terser": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", - "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - } - }, - "metro-resolver": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", - "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6" - } - }, - "metro-runtime": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", - "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", - "dev": true, - "peer": true, - "requires": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - } - }, - "metro-source-map": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", - "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", - "dev": true, - "peer": true, - "requires": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.83.1", - "nullthrows": "^1.1.1", - "ob1": "0.83.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true - } - } - }, - "metro-symbolicate": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", - "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.83.1", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true - } - } - }, - "metro-transform-plugins": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", - "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - } - }, - "metro-transform-worker": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", - "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.83.1", - "metro-babel-transformer": "0.83.1", - "metro-cache": "0.83.1", - "metro-cache-key": "0.83.1", - "metro-minify-terser": "0.83.1", - "metro-source-map": "0.83.1", - "metro-transform-plugins": "0.83.1", - "nullthrows": "^1.1.1" - } - }, - "micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-directive": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", - "requires": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - } - }, - "micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "requires": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "requires": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "requires": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "requires": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "requires": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "requires": { - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "requires": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-mdx-expression": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", - "requires": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-mdx-jsx": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", - "requires": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "requires": { - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "requires": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "requires": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "requires": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-mdx-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", - "requires": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "requires": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "requires": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "requires": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "requires": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==" - }, - "micromark-util-events-to-acorn": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", - "requires": { - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==" - }, - "micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "requires": { - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", - "requires": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" - }, - "micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==" - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "requires": { - "mime-db": "~1.33.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - }, - "mini-css-extract-plugin": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", - "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", - "requires": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - } - }, - "mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mitata": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/mitata/-/mitata-1.0.34.tgz", - "integrity": "sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA==" - }, - "mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "mnemonist": { - "version": "0.39.8", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", - "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", - "requires": { - "obliterator": "^2.0.1" - } - }, - "mockttp": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/mockttp/-/mockttp-4.2.1.tgz", - "integrity": "sha512-pH9DtzfsHZrd7KkOpqpifkepcwhiBrAJwgoGmhQYp+5HzBa/ehMwmTFBEQ0+HCOUzLKWt1B0182Ovl5fdEp/Bw==", - "dev": true, - "requires": { - "@graphql-tools/schema": "^8.5.0", - "@graphql-tools/utils": "^8.8.0", - "@httptoolkit/httpolyglot": "^3.0.1", - "@httptoolkit/subscriptions-transport-ws": "^0.11.2", - "@httptoolkit/util": "^0.1.7", - "@httptoolkit/websocket-stream": "^6.0.1", - "@peculiar/asn1-pkcs8": "^2.5.0", - "@peculiar/asn1-schema": "^2.3.15", - "@peculiar/asn1-x509": "^2.3.15", - "@peculiar/x509": "^1.12.3", - "@types/cors": "^2.8.6", - "@types/node": "*", - "async-mutex": "^0.5.0", - "base64-arraybuffer": "^0.1.5", - "body-parser": "^1.15.2", - "cacheable-lookup": "^6.0.0", - "common-tags": "^1.8.0", - "connect": "^3.7.0", - "cors": "^2.8.4", - "cors-gate": "^1.1.3", - "cross-fetch": "^3.1.5", - "destroyable-server": "^1.1.1", - "express": "^4.14.0", - "fast-json-patch": "^3.1.1", - "graphql": "^14.0.2 || ^15.5", - "graphql-http": "^1.22.0", - "graphql-subscriptions": "^1.1.0", - "graphql-tag": "^2.12.6", - "http-encoding": "^2.0.1", - "http2-wrapper": "^2.2.1", - "https-proxy-agent": "^5.0.1", - "isomorphic-ws": "^4.0.1", - "lodash": "^4.16.4", - "lru-cache": "^7.14.0", - "native-duplexpair": "^1.0.0", - "pac-proxy-agent": "^7.0.0", - "parse-multipart-data": "^1.4.0", - "performance-now": "^2.1.0", - "portfinder": "^1.0.32", - "read-tls-client-hello": "^1.1.0", - "semver": "^7.5.3", - "socks-proxy-agent": "^7.0.0", - "typed-error": "^3.0.2", - "urlpattern-polyfill": "^8.0.0", - "ws": "^8.8.0" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true - }, - "graphql": { - "version": "15.10.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", - "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "dev": true - }, - "graphql-subscriptions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", - "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", - "dev": true, - "requires": { - "iterall": "^1.3.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "urlpattern-polyfill": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", - "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", - "dev": true - } - } - }, - "module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "monaco-editor": { - "version": "0.52.2", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==" - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" - }, - "mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "mysql2": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", - "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", - "dev": true, - "requires": { - "aws-ssl-profiles": "^1.1.1", - "denque": "^2.1.0", - "generate-function": "^2.3.1", - "iconv-lite": "^0.7.0", - "long": "^5.2.1", - "lru.min": "^1.0.0", - "named-placeholders": "^1.1.3", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "named-placeholders": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", - "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", - "dev": true, - "requires": { - "lru.min": "^1.1.0" - } - }, - "nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "dev": true, - "optional": true - }, - "nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "native-duplexpair": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", - "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", - "dev": true - }, - "negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "nested-error-stacks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "dev": true, - "peer": true - }, - "netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "nock": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.4.tgz", - "integrity": "sha512-86fh+gIKH8H02+y0/HKAOZZXn6OwgzXvl6JYwfjvKkoKxUWz54wIIDU/+w24xzMvk/R8pNVXOrvTubyl+Ml6cg==", - "dev": true, - "requires": { - "@mswjs/interceptors": "^0.38.5", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" - }, - "dependencies": { - "@mswjs/interceptors": { - "version": "0.38.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.38.6.tgz", - "integrity": "sha512-qFlpmObPqeUs4u3oFYv/OM/xyX+pNa5TRAjqjvMhbGYlyMhzSrE5UfncL2rUcEeVfD9Gebgff73hPwqcOwJQNA==", - "dev": true, - "requires": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - } - } - } - }, - "node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", - "requires": { - "semver": "^7.3.5" - } - }, - "node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "requires": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - } - }, - "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==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "dev": true - }, - "node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==" - }, - "node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "peer": true - }, - "node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==" - }, - "npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "dev": true, - "peer": true, - "requires": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^10.0.1" - } - }, - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "peer": true - } - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "peer": true - }, - "nwsapi": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", - "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", - "dev": true - }, - "nypm": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", - "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", - "dev": true, - "requires": { - "citty": "^0.1.6", - "consola": "^3.4.2", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "tinyexec": "^1.0.1" - } - }, - "ob1": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", - "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6" - } - }, - "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==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true - }, - "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==" - }, - "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==", - "requires": { - "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" - } - }, - "obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true - }, - "ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "dev": true - }, - "on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" - }, - "ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "otel": { - "version": "file:packages/otel", - "requires": { - "@opentelemetry/api": "^1.9.0", - "shared": "0.0.0" - } - }, - "otel-proxy": { - "version": "file:apps/otel-proxy", - "requires": { - "@types/node": "^22.10.5", - "@vercel/node": "^3.0.0", - "@vitest/coverage-v8": "4.0.15", - "typescript": "~5.9.3", - "vitest": "4.0.15" - }, - "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } - } - }, - "outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true - }, - "oxc-parser": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.94.0.tgz", - "integrity": "sha512-refms9HQoAlTYIazONYkuX5A3rFGPddbD6Otyc+A0/pj1WTttR8TsZRlMzQxCfhexxfrbinqd7ebkEoYNuCmLQ==", - "requires": { - "@oxc-parser/binding-android-arm64": "0.94.0", - "@oxc-parser/binding-darwin-arm64": "0.94.0", - "@oxc-parser/binding-darwin-x64": "0.94.0", - "@oxc-parser/binding-freebsd-x64": "0.94.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.94.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.94.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.94.0", - "@oxc-parser/binding-linux-arm64-musl": "0.94.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.94.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.94.0", - "@oxc-parser/binding-linux-x64-gnu": "0.94.0", - "@oxc-parser/binding-linux-x64-musl": "0.94.0", - "@oxc-parser/binding-wasm32-wasi": "0.94.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.94.0", - "@oxc-parser/binding-win32-x64-msvc": "0.94.0", - "@oxc-project/types": "^0.94.0" - } - }, - "oxlint": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.50.0.tgz", - "integrity": "sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==", - "dev": true, - "requires": { - "@oxlint/binding-android-arm-eabi": "1.50.0", - "@oxlint/binding-android-arm64": "1.50.0", - "@oxlint/binding-darwin-arm64": "1.50.0", - "@oxlint/binding-darwin-x64": "1.50.0", - "@oxlint/binding-freebsd-x64": "1.50.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.50.0", - "@oxlint/binding-linux-arm-musleabihf": "1.50.0", - "@oxlint/binding-linux-arm64-gnu": "1.50.0", - "@oxlint/binding-linux-arm64-musl": "1.50.0", - "@oxlint/binding-linux-ppc64-gnu": "1.50.0", - "@oxlint/binding-linux-riscv64-gnu": "1.50.0", - "@oxlint/binding-linux-riscv64-musl": "1.50.0", - "@oxlint/binding-linux-s390x-gnu": "1.50.0", - "@oxlint/binding-linux-x64-gnu": "1.50.0", - "@oxlint/binding-linux-x64-musl": "1.50.0", - "@oxlint/binding-openharmony-arm64": "1.50.0", - "@oxlint/binding-win32-arm64-msvc": "1.50.0", - "@oxlint/binding-win32-ia32-msvc": "1.50.0", - "@oxlint/binding-win32-x64-msvc": "1.50.0" - } - }, - "oxlint-tsgolint": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.14.2.tgz", - "integrity": "sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==", - "dev": true, - "requires": { - "@oxlint-tsgolint/darwin-arm64": "0.14.2", - "@oxlint-tsgolint/darwin-x64": "0.14.2", - "@oxlint-tsgolint/linux-arm64": "0.14.2", - "@oxlint-tsgolint/linux-x64": "0.14.2", - "@oxlint-tsgolint/win32-arm64": "0.14.2", - "@oxlint-tsgolint/win32-x64": "0.14.2" - } - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" - }, - "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, - "peer": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "requires": { - "p-limit": "^4.0.0" - }, - "dependencies": { - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==" - } - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - } - } - }, - "p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "requires": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true - }, - "pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "dev": true, - "requires": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "dependencies": { - "socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "requires": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - } - } - } - }, - "pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dev": true, - "requires": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - } - }, - "package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "requires": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - } - }, - "package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "package-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/package-up/-/package-up-5.0.0.tgz", - "integrity": "sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA==", - "dev": true, - "requires": { - "find-up-simple": "^1.0.0" - } - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "requires": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "dependencies": { - "@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - } - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" - }, - "parse-multipart-data": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/parse-multipart-data/-/parse-multipart-data-1.5.0.tgz", - "integrity": "sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==", - "dev": true - }, - "parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "parse-png": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", - "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", - "dev": true, - "peer": true, - "requires": { - "pngjs": "^3.3.0" - } - }, - "parse-prometheus-text-format": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-prometheus-text-format/-/parse-prometheus-text-format-1.1.1.tgz", - "integrity": "sha512-dBlhYVACjRdSqLMFe4/Q1l/Gd3UmXm8ruvsTi7J6ul3ih45AkzkVpI5XHV4aZ37juGZW5+3dGU5lwk+QLM9XJA==", - "requires": { - "shallow-equal": "^1.2.0" - } - }, - "parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "requires": { - "entities": "^4.5.0" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "requires": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "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, - "peer": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "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==" - }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true - } - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "pg": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "requires": { - "pg-cloudflare": "^1.2.7", - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - } - }, - "pg-cloudflare": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", - "optional": true - }, - "pg-connection-string": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==" - }, - "pg-format": { - "version": "npm:pg-format-fix@1.0.5", - "resolved": "https://registry.npmjs.org/pg-format-fix/-/pg-format-fix-1.0.5.tgz", - "integrity": "sha512-HcXVy9Zk4kn87P0+U9XSxGtenNyknbPB87NreixSBk0lYJy89u+d/zQbS+f/aTTxABQ/B6FH1KdBB5EsGzRS2w==" - }, - "pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" - }, - "pg-pool": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", - "requires": {} - }, - "pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==" - }, - "pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "requires": { - "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" - } - }, - "pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "requires": { - "split2": "^4.1.0" - } - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pidusage": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-4.0.0.tgz", - "integrity": "sha512-89hVJc5gq157puLYZaO3CH0qfGyDfbDG1KFCE4lCSwK0l1EuEbNa4pIJJXL93ltU5SsYia/DHJUgMY2qE4XRQg==", - "requires": { - "safe-buffer": "^5.2.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "pino": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.13.1.tgz", - "integrity": "sha512-Szuj+ViDTjKPQYiKumGmEn3frdl+ZPSdosHyt9SnUevFosOkMY2b7ipxlEctNKPmMD/VibeBI+ZcZCJK+4DPuw==", - "requires": { - "atomic-sleep": "^1.0.0", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^5.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "slow-redact": "^0.3.0", - "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" - } - }, - "pino-abstract-transport": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", - "requires": { - "split2": "^4.0.0" - } - }, - "pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pixelmatch": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", - "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", - "dev": true, - "requires": { - "pngjs": "^7.0.0" - }, - "dependencies": { - "pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "dev": true - } - } - }, - "pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "requires": { - "find-up": "^6.3.0" - } - }, - "pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "dev": true, - "requires": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "playwright": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", - "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.53.2" - } - }, - "playwright-core": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz", - "integrity": "sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==" - }, - "plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "peer": true, - "requires": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - } - }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true, - "peer": true - }, - "portfinder": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", - "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", - "dev": true, - "requires": { - "async": "^3.2.6", - "debug": "^4.3.6" - } - }, - "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==" - }, - "postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "requires": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - }, - "postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "requires": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "requires": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "requires": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "requires": {} - }, - "postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "requires": {} - }, - "postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "requires": {} - }, - "postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "requires": { - "postcss-selector-parser": "^6.0.16" - } - }, - "postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} - }, - "postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - } - }, - "postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "requires": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - } - }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} - }, - "postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "requires": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - } - }, - "postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "requires": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - } - }, - "postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "requires": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "requires": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "requires": { - "postcss-selector-parser": "^6.0.16" - } - }, - "postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - } - } - }, - "postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "requires": { - "postcss-selector-parser": "^7.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - } - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.11" - } - }, - "postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "requires": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "dev": true, - "requires": {} - }, - "postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "requires": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} - }, - "postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "dev": true, - "requires": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "requires": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} - }, - "postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "requires": { - "sort-css-media-queries": "2.2.0" - } - }, - "postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - } - }, - "postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "requires": { - "postcss-selector-parser": "^6.0.16" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "requires": {} - }, - "postgres": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", - "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==" - }, - "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==" - }, - "postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" - }, - "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==" - }, - "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==", - "requires": { - "xtend": "^4.0.0" - } - }, - "prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==" - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "peer": true - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "requires": { - "parse-ms": "^2.1.0" - } - }, - "pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" - }, - "prism-react-renderer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", - "requires": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - } - }, - "prisma": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.2.0.tgz", - "integrity": "sha512-jSdHWgWOgFF24+nRyyNRVBIgGDQEsMEF8KPHvhBBg3jWyR9fUAK0Nq9ThUmiGlNgq2FA7vSk/ZoCvefod+a8qg==", - "dev": true, - "requires": { - "@prisma/config": "7.2.0", - "@prisma/dev": "0.17.0", - "@prisma/engines": "7.2.0", - "@prisma/studio-core": "0.9.0", - "mysql2": "3.15.3", - "postgres": "3.4.7" - } - }, - "prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" - }, - "proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "peer": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "process-tracker": { - "version": "file:tools/process-tracker", - "requires": { - "@rocicorp/logger": "^5.4.0", - "@types/pidusage": "^2.0.5", - "find-process": "^1.4.10", - "pidusage": "^4.0.0", - "shared": "0.0.0" - } - }, - "process-warning": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==" - }, - "prod": { - "version": "file:prod" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "peer": true - }, - "promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dev": true, - "peer": true, - "requires": { - "asap": "~2.0.6" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "dependencies": { - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - } - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "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==" - } - } - }, - "propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - } - } - }, - "properties-reader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.3.0.tgz", - "integrity": "sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4" - } - }, - "property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, - "protobufjs": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", - "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" - }, - "punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true - }, - "pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "requires": { - "escape-goat": "^4.0.0" - } - }, - "pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true - }, - "pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "dev": true, - "requires": { - "tslib": "^2.8.1" - } - }, - "pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "dev": true - }, - "qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "dev": true, - "peer": true - }, - "qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "requires": { - "side-channel": "^1.1.0" - } - }, - "queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "~2.0.3" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" - }, - "raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "requires": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "requires": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - } - }, - "statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - } - } - }, - "rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "dev": true, - "requires": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-devtools-core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", - "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", - "dev": true, - "peer": true, - "requires": { - "shell-quote": "^1.6.1", - "ws": "^7" - }, - "dependencies": { - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - } - }, - "react-dropzone": { - "version": "14.3.8", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.8.tgz", - "integrity": "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==", - "requires": { - "attr-accept": "^2.2.4", - "file-selector": "^2.1.0", - "prop-types": "^15.8.1" - } - }, - "react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" - }, - "react-helmet-async": { - "version": "npm:@slorber/react-helmet-async@1.3.0", - "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", - "requires": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "react-json-view-lite": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", - "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", - "requires": {} - }, - "react-loadable": { - "version": "npm:@docusaurus/react-loadable@6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "requires": { - "@types/react": "*" - } - }, - "react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "requires": { - "@babel/runtime": "^7.10.3" - } - }, - "react-markdown": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", - "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", - "requires": { - "@types/hast": "^3.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - } - }, - "react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "dev": true, - "peer": true - }, - "react-resizable-panels": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.4.tgz", - "integrity": "sha512-8Y4KNgV94XhUvI2LeByyPIjoUJb71M/0hyhtzkHaqpVHs+ZQs8b627HmzyhmVYi3C9YP6R+XD1KmG7hHjEZXFQ==", - "requires": {} - }, - "react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "requires": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "dependencies": { - "path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "requires": { - "isarray": "0.0.1" - } - }, - "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==" - } - } - }, - "react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "requires": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-textarea-autosize": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", - "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", - "requires": { - "@babel/runtime": "^7.20.13", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - } - }, - "react-toastify": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.6.tgz", - "integrity": "sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A==", - "requires": { - "clsx": "^2.1.0" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "read-tls-client-hello": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-tls-client-hello/-/read-tls-client-hello-1.1.0.tgz", - "integrity": "sha512-htV8ph2jXGCVnKRwW12V1UQdfwC2jPFrDrk8Qh9P+4R/t/Jef/BNmfdX5jsxlcakUMPskwiPZT/enVbjRQqtGQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "requires": { - "minimatch": "^5.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" - }, - "recma-build-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", - "requires": { - "@types/estree": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "vfile": "^6.0.0" - } - }, - "recma-jsx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", - "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", - "requires": { - "acorn-jsx": "^5.0.0", - "estree-util-to-js": "^2.0.0", - "recma-parse": "^1.0.0", - "recma-stringify": "^1.0.0", - "unified": "^11.0.0" - } - }, - "recma-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", - "requires": { - "@types/estree": "^1.0.0", - "esast-util-from-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - } - }, - "recma-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", - "requires": { - "@types/estree": "^1.0.0", - "estree-util-to-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - } - }, - "reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "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==", - "dev": true - }, - "regexparam": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", - "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==" - }, - "regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - } - }, - "registry-auth-token": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.3.tgz", - "integrity": "sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==", - "requires": { - "@pnpm/npm-conf": "^2.1.0" - } - }, - "registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "requires": { - "rc": "1.2.8" - } - }, - "regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" - }, - "regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "requires": { - "jsesc": "~3.1.0" - } - }, - "rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "requires": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - } - }, - "rehype-recma": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", - "requires": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "hast-util-to-estree": "^3.0.0" - } - }, - "rehype-sanitize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", - "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", - "requires": { - "@types/hast": "^3.0.0", - "hast-util-sanitize": "^5.0.0" - } - }, - "rehype-video": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rehype-video/-/rehype-video-2.3.0.tgz", - "integrity": "sha512-wBt/TIpSMQf6U2vH9bNij435fCYdIj/Prt0dMqexP0rk+Ix6nT8beQyu3XYXd7qLIOassHAbBBJxfZgwG+zL9A==", - "dev": true, - "requires": { - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" - }, - "remark-directive": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", - "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", - "unified": "^11.0.0" - } - }, - "remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "requires": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - } - }, - "remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - } - }, - "remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - } - }, - "remark-mdx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", - "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", - "requires": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - } - }, - "remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - } - }, - "remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", - "requires": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - } - }, - "remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - } - }, - "remeda": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.21.3.tgz", - "integrity": "sha512-XXrZdLA10oEOQhLLzEJEiFFSKi21REGAkHdImIb4rt/XXy8ORGXh5HCcpUOsElfPNDb+X6TA/+wkh+p2KffYmg==", - "dev": true, - "requires": { - "type-fest": "^4.39.1" - } - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - } - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, - "replicache": { - "version": "file:packages/replicache", - "requires": { - "@badrap/valita": "0.3.11", - "@op-engineering/op-sqlite": ">=15", - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "@rocicorp/zero-sqlite3": "^1.0.15", - "@types/command-line-usage": "^5.0.2", - "@vitest/runner": "4.0.15", - "command-line-args": "^6.0.1", - "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", - "esbuild": "^0.25.10", - "expo-sqlite": ">=15", - "playwright": "^1.53.2", - "shared": "0.0.0", - "typescript": "~5.9.3", - "vitest": "4.0.15" - }, - "dependencies": { - "@expo/cli": { - "version": "54.0.22", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz", - "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==", - "dev": true, - "peer": true, - "requires": { - "@0no-co/graphql.web": "^1.0.8", - "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/devcert": "^1.2.1", - "@expo/env": "~2.0.8", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "~54.0.14", - "@expo/osascript": "^2.3.8", - "@expo/package-manager": "^1.9.10", - "@expo/plist": "^0.4.8", - "@expo/prebuild-config": "^54.0.8", - "@expo/schema-utils": "^0.1.8", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.81.5", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "expo-server": "^1.0.5", - "freeport-async": "^2.0.0", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "lan-network": "^0.1.6", - "minimatch": "^9.0.0", - "node-forge": "^1.3.3", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "^5.6.0", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", - "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^7.5.2", - "terminal-link": "^2.1.1", - "undici": "^6.18.2", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" - } - }, - "@expo/code-signing-certificates": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", - "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", - "dev": true, - "peer": true, - "requires": { - "node-forge": "^1.3.3" - } - }, - "@expo/devtools": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", - "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.1.2" - } - }, - "@expo/fingerprint": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", - "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", - "dev": true, - "peer": true, - "requires": { - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - } - }, - "@expo/metro": { - "version": "54.2.0", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", - "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", - "dev": true, - "peer": true, - "requires": { - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3" - } - }, - "@expo/metro-config": { - "version": "54.0.14", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", - "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8", - "@expo/json-file": "~10.0.8", - "@expo/metro": "~54.2.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "hermes-parser": "^0.29.1", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "minimatch": "^9.0.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - } - }, - "@expo/prebuild-config": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", - "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", - "dev": true, - "peer": true, - "requires": { - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/config-types": "^54.0.10", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", - "@react-native/normalize-colors": "0.81.5", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - } - }, - "@expo/vector-icons": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", - "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", - "dev": true, - "peer": true, - "requires": {} - }, - "@op-engineering/op-sqlite": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.0.3.tgz", - "integrity": "sha512-vAUrw2hg2TQTDNM6tAsjtxQiyNTZCynjbV6F+FsiSYgbmfuqIL7gRu94IqmLM5/dPvqbBaDZdo4a9n6KMGN8RQ==", - "dev": true, - "requires": {} - }, - "@react-native/assets-registry": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", - "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", - "dev": true, - "peer": true - }, - "@react-native/babel-plugin-codegen": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", - "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.81.5" - } - }, - "@react-native/babel-preset": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", - "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.81.5", - "babel-plugin-syntax-hermes-parser": "0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - } - }, - "@react-native/codegen": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", - "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.29.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@react-native/community-cli-plugin": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", - "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", - "dev": true, - "peer": true, - "requires": { - "@react-native/dev-middleware": "0.83.1", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.83.3", - "metro-config": "^0.83.3", - "metro-core": "^0.83.3", - "semver": "^7.1.3" - }, - "dependencies": { - "@react-native/debugger-frontend": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", - "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", - "dev": true, - "peer": true - }, - "@react-native/dev-middleware": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", - "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.83.1", - "@react-native/debugger-shell": "0.83.1", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^7.5.10" - } - }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "@react-native/debugger-frontend": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", - "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "dev": true, - "peer": true - }, - "@react-native/debugger-shell": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", - "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", - "dev": true, - "peer": true, - "requires": { - "cross-spawn": "^7.0.6", - "fb-dotslash": "0.5.8" - } - }, - "@react-native/dev-middleware": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", - "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.81.5", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" - }, - "dependencies": { - "ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "dev": true, - "peer": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "@react-native/gradle-plugin": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", - "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", - "dev": true, - "peer": true - }, - "@react-native/js-polyfills": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", - "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", - "dev": true, - "peer": true - }, - "@react-native/normalize-colors": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", - "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "dev": true, - "peer": true - }, - "@react-native/virtualized-lists": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", - "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", - "dev": true, - "peer": true, - "requires": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "peer": true - }, - "babel-preset-expo": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", - "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.81.5", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "resolve-from": "^5.0.0" - } - }, - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "peer": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "peer": true - }, - "expo": { - "version": "54.0.32", - "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.32.tgz", - "integrity": "sha512-yL9eTxiQ/QKKggVDAWO5CLjUl6IS0lPYgEvC3QM4q4fxd6rs7ks3DnbXSGVU3KNFoY/7cRNYihvd0LKYP+MCXA==", - "dev": true, - "peer": true, - "requires": { - "@babel/runtime": "^7.20.0", - "@expo/cli": "54.0.22", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/devtools": "0.1.8", - "@expo/fingerprint": "0.15.4", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "54.0.14", - "@expo/vector-icons": "^15.0.3", - "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~54.0.10", - "expo-asset": "~12.0.12", - "expo-constants": "~18.0.13", - "expo-file-system": "~19.0.21", - "expo-font": "~14.0.11", - "expo-keep-awake": "~15.0.8", - "expo-modules-autolinking": "3.0.24", - "expo-modules-core": "3.0.29", - "pretty-format": "^29.7.0", - "react-refresh": "^0.14.2", - "whatwg-url-without-unicode": "8.0.0-3" - } - }, - "expo-asset": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", - "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", - "dev": true, - "peer": true, - "requires": { - "@expo/image-utils": "^0.8.8", - "expo-constants": "~18.0.12" - } - }, - "expo-constants": { - "version": "18.0.13", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", - "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", - "dev": true, - "peer": true, - "requires": { - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8" - } - }, - "expo-file-system": { - "version": "19.0.21", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", - "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", - "dev": true, - "peer": true, - "requires": {} - }, - "expo-font": { - "version": "14.0.11", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", - "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", - "dev": true, - "peer": true, - "requires": { - "fontfaceobserver": "^2.1.0" - } - }, - "expo-keep-awake": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", - "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "expo-modules-autolinking": { - "version": "3.0.24", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", - "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", - "dev": true, - "peer": true, - "requires": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" - } - }, - "expo-modules-core": { - "version": "3.0.29", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", - "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", - "dev": true, - "peer": true, - "requires": { - "invariant": "^2.2.4" - } - }, - "expo-sqlite": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-16.0.10.tgz", - "integrity": "sha512-tUOKxE9TpfneRG3eOfbNfhN9236SJ7IiUnP8gCqU7umd9DtgDGB/5PhYVVfl+U7KskgolgNoB9v9OZ9iwXN8Eg==", - "dev": true, - "requires": { - "await-lock": "^2.2.2" - } - }, - "glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "dependencies": { - "minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/brace-expansion": "^5.0.0" - } - } - } - }, - "hermes-compiler": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", - "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", - "dev": true, - "peer": true - }, - "hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "peer": true - }, - "lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "peer": true - }, - "metro": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", - "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.32.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true - }, - "hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "peer": true, - "requires": { - "hermes-estree": "0.32.0" - } - }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "metro-babel-transformer": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", - "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.32.0", - "nullthrows": "^1.1.1" - }, - "dependencies": { - "hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "peer": true, - "requires": { - "hermes-estree": "0.32.0" - } - } - } - }, - "metro-cache": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", - "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", - "dev": true, - "peer": true, - "requires": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.3" - } - }, - "metro-cache-key": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", - "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6" - } - }, - "metro-config": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", - "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", - "dev": true, - "peer": true, - "requires": { - "connect": "^3.6.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.83.3", - "metro-cache": "0.83.3", - "metro-core": "0.83.3", - "metro-runtime": "0.83.3", - "yaml": "^2.6.1" - } - }, - "metro-core": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", - "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.3" - } - }, - "metro-file-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", - "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", - "dev": true, - "peer": true, - "requires": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - } - }, - "metro-minify-terser": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", - "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - } - }, - "metro-resolver": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", - "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6" - } - }, - "metro-runtime": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", - "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", - "dev": true, - "peer": true, - "requires": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - } - }, - "metro-source-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", - "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", - "dev": true, - "peer": true, - "requires": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.83.3", - "nullthrows": "^1.1.1", - "ob1": "0.83.3", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - }, - "metro-symbolicate": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", - "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.83.3", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - }, - "metro-transform-plugins": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", - "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - } - }, - "metro-transform-worker": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", - "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-source-map": "0.83.3", - "metro-transform-plugins": "0.83.3", - "nullthrows": "^1.1.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "peer": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "peer": true, - "requires": { - "minipass": "^7.1.2" - } - }, - "ob1": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", - "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", - "dev": true, - "peer": true, - "requires": { - "flow-enums-runtime": "^0.0.6" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "peer": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - } - }, - "picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "peer": true - }, - "postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "peer": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", - "dev": true, - "peer": true - }, - "react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "peer": true - }, - "react-native": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.83.1.tgz", - "integrity": "sha512-mL1q5HPq5cWseVhWRLl+Fwvi5z1UO+3vGOpjr+sHFwcUletPRZ5Kv+d0tUfqHmvi73/53NjlQqX1Pyn4GguUfA==", - "dev": true, - "peer": true, - "requires": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.83.1", - "@react-native/codegen": "0.83.1", - "@react-native/community-cli-plugin": "0.83.1", - "@react-native/gradle-plugin": "0.83.1", - "@react-native/js-polyfills": "0.83.1", - "@react-native/normalize-colors": "0.83.1", - "@react-native/virtualized-lists": "0.83.1", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.32.0", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "hermes-compiler": "0.14.0", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.3", - "metro-source-map": "^0.83.3", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.27.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "dependencies": { - "@react-native/codegen": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", - "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.32.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - } - }, - "@react-native/normalize-colors": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", - "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", - "dev": true, - "peer": true - }, - "babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", - "dev": true, - "peer": true, - "requires": { - "hermes-parser": "0.32.0" - } - }, - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "peer": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "peer": true, - "requires": { - "hermes-estree": "0.32.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true - }, - "scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, - "peer": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true - }, - "tar": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", - "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", - "dev": true, - "peer": true, - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - } - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - }, - "undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true, - "peer": true - }, - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "peer": true - } - } - }, - "replicache-doc": { - "version": "file:packages/replicache-doc", - "requires": { - "@docusaurus/core": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/preset-classic": "3.9.2", - "@docusaurus/theme-search-algolia": "^3.9.2", - "@docusaurus/tsconfig": "3.9.2", - "@docusaurus/types": "3.9.2", - "@mdx-js/react": "^3.1.1", - "clsx": "^2.1.1", - "docusaurus-plugin-script-tags": "^2.0.0-beta.6", - "docusaurus-plugin-typedoc": "^1.4.2", - "prism-react-renderer": "^2.4.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "replicache": "15.2.1", - "typedoc": "^0.28.15", - "typedoc-plugin-markdown": "^4.9.0", - "typescript": "~5.9.3" - }, - "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } - } - }, - "replicache-perf": { - "version": "file:packages/replicache-perf", - "requires": { - "@types/command-line-args": "^5.2.3", - "@types/command-line-usage": "^5.0.2", - "command-line-args": "^6.0.1", - "command-line-usage": "^7.0.3", - "esbuild": "^0.25.10", - "get-port": "^7.0.0", - "hash-wasm": "^4.9.0", - "idb": "^7.0.1", - "playwright": "^1.53.2", - "replicache": "15.2.1", - "shared": "0.0.0", - "tsx": "^4.21.0", - "typescript": "~5.9.3", - "vite": "7.2.7", - "xbytes": "^1.7.0" - }, - "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "requires": {} - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "optional": true - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==" - }, - "vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "requires": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "fsevents": "~2.3.3", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "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==" - }, - "require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "requires": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - } - }, - "require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" - }, - "requireg": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", - "dev": true, - "peer": true, - "requires": { - "nested-error-stacks": "~2.0.1", - "rc": "~1.2.7", - "resolve": "~1.7.1" - }, - "dependencies": { - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "peer": true, - "requires": { - "path-parse": "^1.0.5" - } - } - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "requires": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "peer": true, - "requires": { - "global-dirs": "^0.1.1" - }, - "dependencies": { - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "peer": true, - "requires": { - "ini": "^1.3.4" - } - } - } - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "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==" - }, - "resolve-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", - "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "dev": true, - "peer": true - }, - "resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "peer": true - }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "requires": { - "lowercase-keys": "^3.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "peer": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "peer": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "peer": true, - "requires": { - "mimic-fn": "^1.0.0" - } - } - } - }, - "ret": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", - "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==" - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "rollup": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", - "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", - "requires": { - "@rollup/rollup-android-arm-eabi": "4.46.2", - "@rollup/rollup-android-arm64": "4.46.2", - "@rollup/rollup-darwin-arm64": "4.46.2", - "@rollup/rollup-darwin-x64": "4.46.2", - "@rollup/rollup-freebsd-arm64": "4.46.2", - "@rollup/rollup-freebsd-x64": "4.46.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", - "@rollup/rollup-linux-arm-musleabihf": "4.46.2", - "@rollup/rollup-linux-arm64-gnu": "4.46.2", - "@rollup/rollup-linux-arm64-musl": "4.46.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", - "@rollup/rollup-linux-ppc64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-musl": "4.46.2", - "@rollup/rollup-linux-s390x-gnu": "4.46.2", - "@rollup/rollup-linux-x64-gnu": "4.46.2", - "@rollup/rollup-linux-x64-musl": "4.46.2", - "@rollup/rollup-win32-arm64-msvc": "4.46.2", - "@rollup/rollup-win32-ia32-msvc": "4.46.2", - "@rollup/rollup-win32-x64-msvc": "4.46.2", - "@types/estree": "1.0.8", - "fsevents": "~2.3.2" - } - }, - "rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true - }, - "rtlcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" - } - }, - "run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==" - }, - "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==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "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==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - } - }, - "safe-regex2": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-4.0.0.tgz", - "integrity": "sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==", - "requires": { - "ret": "~0.5.0" - } - }, - "safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" - }, - "saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==" - }, - "schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "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==" - } - } - }, - "search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "peer": true - }, - "section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "requires": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - } - }, - "secure-json-parse": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", - "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==" - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "requires": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - } - }, - "semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" - }, - "semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "requires": { - "semver": "^7.3.5" - } - }, - "send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - } - } - }, - "seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==", - "dev": true - }, - "serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true, - "peer": true - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "seroval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", - "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", - "dev": true - }, - "seroval-plugins": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.1.1.tgz", - "integrity": "sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==", - "dev": true, - "requires": {} - }, - "serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "requires": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - }, - "dependencies": { - "path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - } - } - }, - "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "set-cookie-parser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", - "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" - }, - "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==", - "requires": { - "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" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shared": { - "version": "file:packages/shared", - "requires": { - "@badrap/valita": "0.3.11", - "@dotenvx/dotenvx": "^1.39.0", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "@types/semver": "^7.5.1", - "@types/strip-ansi": "^3.0.0", - "@vitest/runner": "4.0.15", - "chalk-template": "^1.1.0", - "command-line-args": "^6.0.1", - "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", - "defu": "^6.1.4", - "fast-check": "^3.18.0", - "js-xxhash": "^4.0.0", - "kasi": "^1.1.0", - "package-up": "^5.0.0", - "playwright": "^1.53.2", - "semver": "^7.5.4", - "type-fest": "^4.30.0", - "typescript": "~5.9.3", - "vitest": "4.0.15" - }, - "dependencies": { - "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" - }, - "chalk-template": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", - "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", - "requires": { - "chalk": "^5.2.0" - } - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } - } - }, - "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==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==" - }, - "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "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==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "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==", - "requires": { - "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" - } - }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "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==" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-oauth2": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/simple-oauth2/-/simple-oauth2-5.1.0.tgz", - "integrity": "sha512-gWDa38Ccm4MwlG5U7AlcJxPv3lvr80dU7ARJWrGdgvOKyzSj1gr3GBPN1rABTedAYvC/LsGYoFuFxwDBPtGEbw==", - "requires": { - "@hapi/hoek": "^11.0.4", - "@hapi/wreck": "^18.0.0", - "debug": "^4.3.4", - "joi": "^17.6.4" - } - }, - "simple-plist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", - "dev": true, - "peer": true, - "requires": { - "bplist-creator": "0.1.0", - "bplist-parser": "0.3.1", - "plist": "^3.0.5" - } - }, - "sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", - "requires": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - } - } - }, - "skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "requires": { - "unicode-emoji-modifier-base": "^1.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "slow-redact": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/slow-redact/-/slow-redact-0.3.2.tgz", - "integrity": "sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==" - }, - "slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true, - "peer": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "dev": true, - "requires": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - } - } - }, - "solid-js": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz", - "integrity": "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g==", - "dev": true, - "requires": { - "csstype": "^3.1.0", - "seroval": "^1.1.0", - "seroval-plugins": "^1.1.0" - } - }, - "solid-refresh": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz", - "integrity": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==", - "dev": true, - "requires": { - "@babel/generator": "^7.23.6", - "@babel/helper-module-imports": "^7.22.15", - "@babel/types": "^7.23.6" - } - }, - "sonic-boom": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", - "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", - "requires": { - "atomic-sleep": "^1.0.0" - } - }, - "sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==" - }, - "source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==" - }, - "source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "split-ca": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", - "dev": true - }, - "split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "sqlite-io-yield-simulator": { - "version": "file:tools/sqlite-io-yield-simulator", - "requires": { - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "shared": "0.0.0", - "ws": "^8.18.1", - "zqlite": "0.0.0" - } - }, - "sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "dev": true - }, - "srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==" - }, - "ssh-remote-port-forward": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ssh-remote-port-forward/-/ssh-remote-port-forward-1.0.4.tgz", - "integrity": "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==", - "dev": true, - "requires": { - "@types/ssh2": "^0.5.48", - "ssh2": "^1.4.0" - }, - "dependencies": { - "@types/ssh2": { - "version": "0.5.52", - "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", - "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/ssh2-streams": "*" - } - } - } - }, - "ssh2": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.15.0.tgz", - "integrity": "sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==", - "dev": true, - "requires": { - "asn1": "^0.2.6", - "bcrypt-pbkdf": "^1.0.2", - "cpu-features": "~0.0.9", - "nan": "^2.18.0" - } - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "peer": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "peer": true - } - } - }, - "stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "peer": true - }, - "stacktrace-parser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", - "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.7.1" - }, - "dependencies": { - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "peer": true - } - } - }, - "state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==" - }, - "stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "peer": true - }, - "stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" - }, - "streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "dev": true, - "requires": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "requires": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==" - }, - "structured-headers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", - "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true, - "peer": true - }, - "style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "requires": { - "style-to-object": "1.0.14" - } - }, - "style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "requires": { - "inline-style-parser": "0.2.7" - } - }, - "stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "requires": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - } - }, - "sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - } - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "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==" - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - } - } - }, - "swr": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.7.tgz", - "integrity": "sha512-ZEquQ82QvalqTxhBVv/DlAg2mbmUjF4UgpPg9wwk4ufb9rQnZXh1iKyyKBqV6bQGu1Ie7L1QwSYO07qFIa1p+g==", - "requires": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" - }, - "table-layout": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", - "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", - "requires": { - "array-back": "^6.2.2", - "wordwrapjs": "^5.1.0" - } - }, - "tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", - "dev": true, - "requires": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "dependencies": { - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "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, - "requires": { - "is-glob": "^4.0.3" - } - }, - "postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" - } - } - }, - "tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "peer": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "dependencies": { - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "testcontainers": { - "version": "10.28.0", - "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.28.0.tgz", - "integrity": "sha512-1fKrRRCsgAQNkarjHCMKzBKXSJFmzNTiTbhb5E/j5hflRXChEtHvkefjaHlgkNUjfw92/Dq8LTgwQn6RDBFbMg==", - "dev": true, - "requires": { - "@balena/dockerignore": "^1.0.2", - "@types/dockerode": "^3.3.35", - "archiver": "^7.0.1", - "async-lock": "^1.4.1", - "byline": "^5.0.0", - "debug": "^4.3.5", - "docker-compose": "^0.24.8", - "dockerode": "^4.0.5", - "get-port": "^7.1.0", - "proper-lockfile": "^4.1.2", - "properties-reader": "^2.3.0", - "ssh-remote-port-forward": "^1.0.4", - "tar-fs": "^3.0.7", - "tmp": "^0.2.3", - "undici": "^5.29.0" - }, - "dependencies": { - "async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "dev": true - }, - "tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", - "dev": true, - "requires": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "requires": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "undici": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", - "dev": true, - "requires": { - "@fastify/busboy": "^2.0.0" - } - } - } - }, - "text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dev": true, - "requires": { - "b4a": "^1.6.4" - } - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "thingies": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", - "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", - "requires": {} - }, - "thread-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.0.2.tgz", - "integrity": "sha512-cBL4xF2A3lSINV4rD5tyqnKH4z/TgWPvT+NaVhJDSwK962oo/Ye7cHSMbDzwcu7tAE1SfU6Q4XtV6Hucmi6Hlw==", - "requires": { - "real-require": "^0.2.0" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "peer": true - }, - "throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==" - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "time-span": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", - "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", - "requires": { - "convert-hrtime": "^3.0.0" - } - }, - "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==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true - }, - "tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "requires": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "requires": {} - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" - } - } - }, - "tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==" - }, - "tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true - }, - "tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "requires": { - "tldts-core": "^6.1.86" - } - }, - "tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true - }, - "tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "peer": true - }, - "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==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toad-cache": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", - "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "requires": {} - }, - "trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" - }, - "trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" - }, - "ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "ts-morph": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", - "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", - "requires": { - "@ts-morph/common": "~0.11.0", - "code-block-writer": "^10.1.1" - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" - } - } - }, - "ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==" - }, - "tsconfck": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz", - "integrity": "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==", - "dev": true, - "requires": {} - }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "requires": { - "esbuild": "~0.27.0", - "fsevents": "~2.3.3", - "get-tsconfig": "^4.7.5" - }, - "dependencies": { - "@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "optional": true - }, - "@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "optional": true - }, - "@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "optional": true - }, - "esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "requires": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "optional": true - } - } - }, - "tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "dev": true, - "requires": { - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "turbo": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.4.4.tgz", - "integrity": "sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==", - "dev": true, - "requires": { - "turbo-darwin-64": "2.4.4", - "turbo-darwin-arm64": "2.4.4", - "turbo-linux-64": "2.4.4", - "turbo-linux-arm64": "2.4.4", - "turbo-windows-64": "2.4.4", - "turbo-windows-arm64": "2.4.4" - } - }, - "turbo-darwin-64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.4.4.tgz", - "integrity": "sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g==", - "dev": true, - "optional": true - }, - "turbo-darwin-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.4.4.tgz", - "integrity": "sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw==", - "dev": true, - "optional": true - }, - "turbo-linux-64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.4.4.tgz", - "integrity": "sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q==", - "dev": true, - "optional": true - }, - "turbo-linux-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.4.4.tgz", - "integrity": "sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg==", - "dev": true, - "optional": true - }, - "turbo-windows-64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.4.4.tgz", - "integrity": "sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg==", - "dev": true, - "optional": true - }, - "turbo-windows-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.4.4.tgz", - "integrity": "sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg==", - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true - }, - "type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - } - } - }, - "typed-error": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typed-error/-/typed-error-3.2.2.tgz", - "integrity": "sha512-Z48LU67/qJ+vyA7lh3ozELqpTp3pvQoY5RtLi5wQ/UGSrEidBhlVSqhjr8B3iqbGpjqAoJYrtSYXWMDtidWGkA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typedoc": { - "version": "0.28.15", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.15.tgz", - "integrity": "sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==", - "dev": true, - "requires": { - "@gerrit0/mini-shiki": "^3.17.0", - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "yaml": "^2.8.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "typedoc-docusaurus-theme": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/typedoc-docusaurus-theme/-/typedoc-docusaurus-theme-1.4.2.tgz", - "integrity": "sha512-i9YYDcScLD0WUiX8I+LXHX3ZVvRDlJsmRo9l/uWrFT37cHlMz4Ay0GOnWzHUBnnwAo1uzYOw9RjUXznbWozBEA==", - "dev": true, - "requires": {} - }, - "typedoc-plugin-markdown": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.9.0.tgz", - "integrity": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==", - "dev": true, - "requires": {} - }, - "typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "peer": true - }, - "typical": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.2.0.tgz", - "integrity": "sha512-W1+HdVRUl8fS3MZ9ogD51GOb46xMmhAZzR0WPw5jcgIZQJVvkddYzAl4YTU6g5w33Y1iRQLdIi2/1jhi2RNL0g==" - }, - "uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "requires": { - "@fastify/busboy": "^2.0.0" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==" - }, - "unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==" - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==" - }, - "unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==" - }, - "unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "requires": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "dependencies": { - "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==" - } - } - }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "requires": { - "@types/unist": "^3.0.0" - } - }, - "unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "requires": { - "@types/unist": "^3.0.0" - } - }, - "unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "requires": { - "@types/unist": "^3.0.0" - } - }, - "unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "requires": { - "@types/unist": "^3.0.0" - } - }, - "unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "requires": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - } - }, - "unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "requires": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - } - }, - "universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", - "requires": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - } - }, - "update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "requires": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - } - }, - "camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==" - }, - "chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "url-pattern": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/url-pattern/-/url-pattern-1.0.3.tgz", - "integrity": "sha512-uQcEj/2puA4aq1R3A2+VNVBgaWYR24FdWjl7VNW83rnWftlhyzOZ/tBjezRiC2UkIzuxC8Top3IekN3vUf1WxA==" - }, - "urlpattern-polyfill": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", - "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==" - }, - "use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "requires": {} - }, - "use-debounce": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.4.tgz", - "integrity": "sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==", - "requires": {} - }, - "use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "requires": {} - }, - "use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", - "requires": { - "use-isomorphic-layout-effect": "^1.1.1" - } - }, - "use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", - "requires": {} - }, - "usehooks-ts": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-3.1.0.tgz", - "integrity": "sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==", - "requires": { - "lodash.debounce": "^4.0.8" - } - }, - "util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - }, - "valibot": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz", - "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", - "dev": true, - "requires": {} - }, - "validate-html-nesting": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/validate-html-nesting/-/validate-html-nesting-1.2.3.tgz", - "integrity": "sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==", - "dev": true - }, - "validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "peer": true + "zql": "0.0.0" + } }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + "packages/zero-events": { + "name": "@rocicorp/zero-events", + "version": "0.0.4", + "license": "Apache-2.0", + "devDependencies": { + "shared": "0.0.0", + "typescript": "~5.9.3" + } }, - "value-or-promise": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", - "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==", - "dev": true + "packages/zero-pg": { + "version": "0.0.0", + "dependencies": { + "@rocicorp/logger": "^5.4.0" + }, + "devDependencies": { + "@vitest/runner": "4.1.0", + "vitest": "4.1.0", + "zero-cache": "0.0.0", + "zero-server": "0.0.0" + } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "packages/zero-protocol": { + "version": "0.0.0", + "dependencies": { + "@badrap/valita": "0.3.11" + }, + "devDependencies": { + "shared": "0.0.0", + "typescript": "~5.9.3", + "zero-types": "0.0.0" + } }, - "verify-package-deps": { - "version": "file:tools/verify-package-deps", - "requires": { - "@types/node": "^22.10.5", - "oxc-parser": "^0.94.0", - "typescript": "~5.9.3" + "packages/zero-react": { + "version": "0.0.0", + "devDependencies": { + "@testing-library/react": "^16.3.2", + "@types/react": "^18.3.18", + "react": "^18.3.1", + "shared": "0.0.0", + "zero-client": "0.0.0", + "zero-schema": "0.0.0", + "zql": "0.0.0" }, - "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } + "peerDependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" } }, - "vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "requires": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" + "packages/zero-react-native": { + "version": "0.0.0", + "dependencies": { + "@rocicorp/resolver": "^1.0.2" + }, + "devDependencies": { + "replicache": "15.2.1", + "shared": "0.0.0" } }, - "vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "requires": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" + "packages/zero-schema": { + "version": "0.0.0", + "devDependencies": { + "shared": "0.0.0", + "zero-protocol": "0.0.0", + "zero-types": "0.0.0", + "zql": "0.0.0" } }, - "vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "requires": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" + "packages/zero-server": { + "version": "0.0.0", + "hasInstallScript": true, + "dependencies": { + "@rocicorp/logger": "^5.4.0" + }, + "devDependencies": { + "@prisma/adapter-pg": "^7.2.0", + "@prisma/client": "^7.2.0", + "@vitest/runner": "4.1.0", + "drizzle-orm": "^0.45.1", + "pg": "^8.16.3", + "postgres": "3.4.7", + "prisma": "^7.2.0", + "shared": "0.0.0", + "vitest": "4.1.0", + "z2s": "0.0.0", + "zero-cache": "0.0.0", + "zero-protocol": "0.0.0", + "zero-schema": "0.0.0", + "zero-types": "0.0.0", + "zql": "0.0.0" } }, - "vite": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", - "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", + "packages/zero-server/node_modules/drizzle-orm": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", + "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", "dev": true, - "requires": { - "esbuild": "^0.25.0", - "fsevents": "~2.3.3", - "postcss": "^8.5.3", - "rollup": "^4.30.1" + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" }, - "dependencies": { - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { "optional": true } } }, - "vite-bundle-analyzer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-1.3.1.tgz", - "integrity": "sha512-39J8a+d1KTi9fPt0a7MqqEJibMekdIDCW2nohiyQPSiww+xEBRHKSX4fdpwSvia9KDiFg7THjQRTs0xefzB+lg==", - "dev": true - }, - "vite-plugin-solid": { - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.7.tgz", - "integrity": "sha512-5TgK1RnE449g0Ryxb9BXqem89RSy7fE8XGVCo+Gw84IHgPuPVP7nYNP6WBVAaY/0xw+OqfdQee+kusL0y3XYNg==", - "dev": true, - "requires": { - "@babel/core": "^7.23.3", - "@types/babel__core": "^7.20.4", - "babel-preset-solid": "^1.8.4", - "merge-anything": "^5.1.7", - "solid-refresh": "^0.6.3", - "vitefu": "^1.0.4" + "packages/zero-solid": { + "version": "0.0.0", + "devDependencies": { + "@solidjs/testing-library": "^0.8.10", + "shared": "0.0.0", + "solid-js": "^1.9.4", + "vite-plugin-solid": "^2.11.11", + "zero-client": "0.0.0" + }, + "peerDependencies": { + "solid-js": "^1.9.4" } }, - "vite-plugin-svgr": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.5.0.tgz", - "integrity": "sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^5.2.0", - "@svgr/core": "^8.1.0", - "@svgr/plugin-jsx": "^8.1.0" + "packages/zero-types": { + "version": "0.0.0", + "devDependencies": { + "shared": "0.0.0", + "typescript": "~5.9.3", + "vitest": "4.1.0" } }, - "vitefu": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.7.tgz", - "integrity": "sha512-eRWXLBbJjW3X5z5P5IHcSm2yYbYRPb2kQuc+oqsbAl99WB5kVsPbiiox+cymo8twTzifA6itvhr2CmjnaZZp0Q==", - "dev": true, - "requires": {} - }, - "vitest": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz", - "integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==", - "dev": true, - "requires": { - "@vitest/expect": "4.0.15", - "@vitest/mocker": "4.0.15", - "@vitest/pretty-format": "4.0.15", - "@vitest/runner": "4.0.15", - "@vitest/snapshot": "4.0.15", - "@vitest/spy": "4.0.15", - "@vitest/utils": "4.0.15", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", + "packages/zero/node_modules/@expo/cli": { + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.16.tgz", + "integrity": "sha512-rp1mBnA5msGDPTfFuqVl+9RsJOtuA0cXsWSJpHdvsIxcSVg0oJyF/rgvrwsFrNQCLXzkMXm+o3CsY9iL1D/CDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~55.0.8", + "@expo/config-plugins": "~55.0.6", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.1.1", + "@expo/image-utils": "^0.8.12", + "@expo/json-file": "^10.0.12", + "@expo/log-box": "55.0.7", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "~55.0.9", + "@expo/osascript": "^2.4.2", + "@expo/package-manager": "^1.10.3", + "@expo/plist": "^0.5.2", + "@expo/prebuild-config": "^55.0.8", + "@expo/require-utils": "^55.0.2", + "@expo/router-server": "^55.0.10", + "@expo/schema-utils": "^55.0.2", + "@expo/spawn-async": "^1.7.2", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.4.0", + "@react-native/dev-middleware": "0.83.2", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "better-opn": "~3.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "debug": "^4.3.4", + "dnssd-advertise": "^1.1.3", + "expo-server": "^55.0.6", + "fetch-nodeshim": "^0.4.6", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.2.0", + "multitars": "^0.2.3", + "node-forge": "^1.3.3", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "terminal-link": "^2.1.1", + "toqr": "^0.1.1", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1", + "zod": "^3.25.76" }, - "dependencies": { - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "bin": { + "expo-internal": "build/bin/cli" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true } } }, - "vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "peer": true - }, - "w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "packages/zero/node_modules/@expo/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "xml-name-validator": "^5.0.0" + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "packages/zero/node_modules/@expo/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "packages/zero/node_modules/@expo/devtools": { + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.2.tgz", + "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", "dev": true, + "license": "MIT", "peer": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "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==" - }, - "webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", - "requires": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, "dependencies": { - "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==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "requires": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" + "chalk": "^4.1.2" }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "requires": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - } - }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "requires": {} - } - } - }, - "webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", - "requires": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "peerDependencies": { + "react": "*", + "react-native": "*" }, - "dependencies": { - "mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" - }, - "mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "requires": { - "mime-db": "^1.54.0" - } + "peerDependenciesMeta": { + "react": { + "optional": true }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "react-native": { + "optional": true } } }, - "webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", - "requires": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, + "packages/zero/node_modules/@expo/devtools/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "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==" - }, - "open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "requires": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - } - } - } - }, - "webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" - }, - "webpackbar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", - "requires": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", - "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" + "packages/zero/node_modules/@expo/devtools/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" }, - "dependencies": { - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "requires": { - "repeat-string": "^1.0.0" - } - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "packages/zero/node_modules/@expo/dom-webview": { + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.3.tgz", + "integrity": "sha512-bY4/rfcZ0f43DvOtMn8/kmPlmo01tex5hRoc5hKbwBwQjqWQuQt0ACwu7akR9IHI4j0WNG48eL6cZB6dZUFrzg==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "packages/zero/node_modules/@expo/log-box": { + "version": "55.0.7", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.7.tgz", + "integrity": "sha512-m7V1k2vlMp4NOj3fopjOg4zl/ANXyTRF3HMTMep2GZAKsPiDzgOQ41nm8CaU50/HlDIGXlCObss07gOn20UpHQ==", "dev": true, - "requires": { - "iconv-lite": "0.6.3" - }, + "license": "MIT", + "peer": true, "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } + "@expo/dom-webview": "^55.0.3", + "anser": "^1.4.9", + "stacktrace-parser": "^0.1.10" + }, + "peerDependencies": { + "@expo/dom-webview": "^55.0.3", + "expo": "*", + "react": "*", + "react-native": "*" } }, - "whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "packages/zero/node_modules/@expo/metro-config": { + "version": "55.0.9", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.9.tgz", + "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", "dev": true, - "peer": true - }, - "whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~55.0.8", + "@expo/env": "~2.1.1", + "@expo/json-file": "~10.0.12", + "@expo/metro": "~54.2.0", + "@expo/spawn-async": "^1.7.2", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.32.0", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "picomatch": "^4.0.3", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } } }, - "whatwg-url-without-unicode": { - "version": "8.0.0-3", - "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", - "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", + "packages/zero/node_modules/@expo/metro-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, - "requires": { - "buffer": "^5.4.3", - "punycode": "^2.1.1", - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "peer": true - } + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" + "packages/zero/node_modules/@expo/metro-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "packages/zero/node_modules/@expo/metro-config/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "packages/zero/node_modules/@expo/metro-config/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, - "requires": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" + "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.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "packages/zero/node_modules/@expo/prebuild-config": { + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.8.tgz", + "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@expo/config": "~55.0.8", + "@expo/config-plugins": "~55.0.6", + "@expo/config-types": "^55.0.5", + "@expo/image-utils": "^0.8.12", + "@expo/json-file": "^10.0.12", + "@react-native/normalize-colors": "0.83.2", + "debug": "^4.3.1", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo": "*" } }, - "widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "requires": { - "string-width": "^5.0.1" - }, + "packages/zero/node_modules/@expo/router-server": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.10.tgz", + "integrity": "sha512-NZQzHwkaedufNPayVfPxsZGEMngOD3gDvYx9lld4sitRexrKDx5sHmmNHi6IByGbmCb4jwLXub5sIyWh6z1xPQ==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" + "debug": "^4.3.4" + }, + "peerDependencies": { + "@expo/metro-runtime": "^55.0.6", + "expo": "*", + "expo-constants": "^55.0.7", + "expo-font": "^55.0.4", + "expo-router": "*", + "expo-server": "^55.0.6", + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" + }, + "peerDependenciesMeta": { + "@expo/metro-runtime": { + "optional": true }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "expo-router": { + "optional": true }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } + "react-dom": { + "optional": true }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } + "react-server-dom-webpack": { + "optional": true } } }, - "wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "wonka": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", - "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", + "packages/zero/node_modules/@expo/vector-icons": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", + "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", "dev": true, - "peer": true - }, - "wordwrapjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", - "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==" - }, - "wouter": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.7.1.tgz", - "integrity": "sha512-od5LGmndSUzntZkE2R5CHhoiJ7YMuTIbiXsa0Anytc2RATekgv4sfWRAxLEULBrp7ADzinWQw8g470lkT8+fOw==", - "requires": { - "mitt": "^3.0.1", - "regexparam": "^3.0.0", - "use-sync-external-store": "^1.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "license": "MIT", + "peer": true, + "peerDependencies": { + "expo-font": ">=14.0.4", + "react": "*", + "react-native": "*" } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "packages/zero/node_modules/@op-engineering/op-sqlite": { + "version": "15.2.7", + "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.2.7.tgz", + "integrity": "sha512-rXpzEt6FL0syAHa2QqBaB7DhhXwxEOs05cTIhv0RI+iur66XcuM73SpUSD8gnh8opHJu+Hw6Nu3IM4EDWxEdng==", "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "license": "MIT", + "workspaces": [ + "example", + "node" + ], + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "packages/zero/node_modules/@react-native/codegen": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.84.1.tgz", + "integrity": "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "hermes-parser": "0.32.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "tinyglobby": "^0.2.15", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" } }, - "ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "requires": {} - }, - "wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "requires": { - "is-wsl": "^3.1.0" - }, + "packages/zero/node_modules/@react-native/virtualized-lists": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.84.1.tgz", + "integrity": "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "requires": { - "is-inside-container": "^1.0.0" - } + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.2.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } } }, - "xbytes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xbytes/-/xbytes-1.8.0.tgz", - "integrity": "sha512-o/8qiLr54dYJaX/OB47vvb6cfkqFCdoXXhQdzPc8pF7ulsBGOHRTjgFqVceaw+EcjX1fskToTdFHAUhoeZB6xg==" - }, - "xcode": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", - "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "packages/zero/node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "dev": true, + "license": "MIT", + "optional": true, "peer": true, - "requires": { - "simple-plist": "^1.1.0", - "uuid": "^7.0.3" - }, "dependencies": { - "uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "peer": true - } + "csstype": "^3.2.2" } }, - "xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==" - }, - "xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "requires": { - "sax": "^1.2.4" + "packages/zero/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hermes-parser": "0.32.0" } }, - "xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true - }, - "xml2js": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "packages/zero/node_modules/babel-preset-expo": { + "version": "55.0.11", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.11.tgz", + "integrity": "sha512-ti8t4xufD6gUQQh+qY+b+VT/1zyA0n1PBnwOzCkPUyEDiIVBpaOixR+BzVH68hqu9mH2wDfzoFuGgv+2LfRdqw==", "dev": true, + "license": "MIT", "peer": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, "dependencies": { - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "peer": true + "@babel/generator": "^7.20.5", + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.83.2", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.32.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "expo-widgets": "^55.0.4", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + }, + "expo-widgets": { + "optional": true } } }, - "xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "packages/zero/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, - "peer": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "devOptional": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" } }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" - }, - "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==", + "packages/zero/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, + "license": "MIT", "peer": true }, - "z2s": { - "version": "file:packages/z2s", - "requires": { - "@databases/escape-identifier": "^1.0.3", - "@databases/sql": "^3.3.0", - "@faker-js/faker": "^9.6.0", - "@types/pg": "^8.11.11", - "@vitest/runner": "4.0.15", - "pg": "^8.16.3", - "shared": "0.0.0", - "vitest": "4.0.15", - "zero-cache": "0.0.0", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "zbugs": { - "version": "file:apps/zbugs", - "requires": { - "@aws-sdk/client-s3": "^3.844.0", - "@aws-sdk/s3-request-presigner": "^3.844.0", - "@dotenvx/dotenvx": "^1.39.0", - "@faker-js/faker": "^9.6.0", - "@fastify/cookie": "^10.0.0", - "@fastify/oauth2": "^8.0.0", - "@floating-ui/react": "^0.26.28", - "@headlessui/react": "^2.1.8", - "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.2", - "@rocicorp/zero-virtual": "^0.1.1", - "@schickling/fps-meter": "^0.1.2", - "@tailwindcss/forms": "^0.5.0", - "@tanstack/react-virtual": "^3.13.19", - "@types/js-cookie": "^3.0.6", - "@types/k6": "^0.53.2", - "@types/node": "^22.10.5", - "@types/pg": "^8.11.11", - "@types/react": "^18.3.18", - "@types/react-dom": "18.3.5", - "@vitejs/plugin-react": "^5.1.2", - "@vitest/runner": "4.0.15", - "classnames": "^2.5.1", - "drizzle-kit": "^0.31.4", - "drizzle-orm": "^0.44.2", - "emoji-picker-element": "^1.22.8", - "emoji-picker-element-data": "^1.6.1", - "fastify": "^5.0.0", - "jose": "^5.9.3", - "js-cookie": "^3.0.5", - "nanoid": "^5.1.2", - "pg": "^8.16.3", - "postcss-preset-env": "^7.4.3", - "postgres": "3.4.7", - "prettier": "^3.8.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-dropzone": "^14.3.8", - "react-markdown": "^9.0.1", - "react-textarea-autosize": "^8.5.3", - "react-toastify": "^10.0.6", - "rehype-raw": "^7.0.0", - "rehype-sanitize": "^6.0.0", - "rehype-video": "^2.3.0", - "remark-gfm": "^4.0.0", - "shared": "0.0.0", - "tailwindcss": "^3.0.23", - "tsx": "^4.21.0", - "typescript": "~5.9.3", - "universal-user-agent": "^7.0.2", - "use-debounce": "^10.0.4", - "usehooks-ts": "^3.1.0", - "vite": "7.2.7", - "vite-bundle-analyzer": "^1.3.1", - "vite-plugin-svgr": "^4.5.0", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "4.0.15", - "wouter": "^3.7.1", - "zod": "^4.1.11" - }, + "packages/zero/node_modules/expo": { + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.6.tgz", + "integrity": "sha512-gaF8bh5beWmrptz3d4Gr138CiPoLJtzjNbqNSOQ8kdQm3wMW8lJGT1dsY5NPJTZ7MNJBTN+pcRwshr4BMK4OiA==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@rocicorp/zero-virtual": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rocicorp/zero-virtual/-/zero-virtual-0.1.1.tgz", - "integrity": "sha512-vT6CoSqmgaalsLhyWRo4I9FsRPqF8LR7Yb8LfTkvYL0z0/E4sz8wxqEKQd95UyoIVpsdbcb55ZlkAbaL2Fdp/Q==", - "requires": {} - }, - "@types/pg": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==", - "dev": true, - "requires": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "requires": {} - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, + "@babel/runtime": "^7.20.0", + "@expo/cli": "55.0.16", + "@expo/config": "~55.0.8", + "@expo/config-plugins": "~55.0.6", + "@expo/devtools": "55.0.2", + "@expo/fingerprint": "0.16.6", + "@expo/local-build-cache-provider": "55.0.6", + "@expo/log-box": "55.0.7", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "55.0.9", + "@expo/vector-icons": "^15.0.2", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~55.0.11", + "expo-asset": "~55.0.8", + "expo-constants": "~55.0.7", + "expo-file-system": "~55.0.10", + "expo-font": "~55.0.4", + "expo-keep-awake": "~55.0.4", + "expo-modules-autolinking": "55.0.9", + "expo-modules-core": "55.0.15", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-minimum": "^0.1.1" + }, + "bin": { + "expo": "bin/cli", + "expo-modules-autolinking": "bin/autolinking", + "fingerprint": "bin/fingerprint" + }, + "peerDependencies": { + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-native": "*", + "react-native-webview": "*" + }, + "peerDependenciesMeta": { + "@expo/dom-webview": { "optional": true }, - "nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==" - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - }, - "vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "dev": true, - "requires": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "fsevents": "~2.3.3", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - } - }, - "vite-tsconfig-paths": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", - "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - } + "@expo/metro-runtime": { + "optional": true }, - "zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==" + "react-native-webview": { + "optional": true } } }, - "zeptomatch": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.0.2.tgz", - "integrity": "sha512-H33jtSKf8Ijtb5BW6wua3G5DhnFjbFML36eFu+VdOoVY4HD9e7ggjqdM6639B+L87rjnR6Y+XeRzBXZdy52B/g==", + "packages/zero/node_modules/expo-asset": { + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.8.tgz", + "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", "dev": true, - "requires": { - "grammex": "^3.1.10" + "license": "MIT", + "peer": true, + "dependencies": { + "@expo/image-utils": "^0.8.12", + "expo-constants": "~55.0.7" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "zero-cache": { - "version": "file:packages/zero-cache", - "requires": { - "@databases/sql": "^3.3.0", - "@drdgvhbh/postgres-error-codes": "^0.0.6", - "@fastify/cors": "^10.0.0", - "@fastify/websocket": "^11.0.0", - "@google-cloud/precise-date": "^4.0.0", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/api-logs": "^0.203.0", - "@opentelemetry/auto-instrumentations-node": "^0.62.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0", - "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-metrics": "^2.0.1", - "@opentelemetry/sdk-node": "^0.203.0", - "@opentelemetry/sdk-trace-node": "^2.0.1", - "@postgresql-typed/oids": "^0.2.0", - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "@rocicorp/zero-events": "0.0.4", - "@rocicorp/zero-sqlite3": "^1.0.15", - "@testcontainers/postgresql": "^10.9.0", - "@types/basic-auth": "^1.1.8", - "@types/node": "^22.10.5", - "@types/pg-format": "^1.0.5", - "@types/strip-ansi": "^3.0.0", - "@types/ws": "^8.5.12", - "@vitest/runner": "4.0.15", - "basic-auth": "^2.0.1", - "chalk": "^5.3.0", - "cloudevents": "^10.0.0", - "compare-utf8": "^0.1.1", - "defu": "^6.1.4", - "eventemitter3": "^5.0.1", - "fastify": "^5.0.0", - "is-in-subnet": "^4.0.1", - "jose": "^5.9.3", - "json-custom-numbers": "^3.1.1", - "mockttp": "^4.2.1", - "nanoid": "^5.1.2", - "nock": "^14.0.4", - "otel": "0.0.0", - "parse-prometheus-text-format": "^1.1.1", - "pg-format": "npm:pg-format-fix@^1.0.5", - "postgres": "3.4.7", - "shared": "0.0.0", - "tsx": "^4.21.0", - "typescript": "~5.9.3", - "url-pattern": "^1.0.3", - "urlpattern-polyfill": "^10.1.0", - "vitest": "4.0.15", - "ws": "^8.18.1", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0", - "zqlite": "0.0.0" - }, + "packages/zero/node_modules/expo-constants": { + "version": "55.0.7", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.7.tgz", + "integrity": "sha512-kdcO4TsQRRqt0USvjaY5vgQMO9H52K3kBZ/ejC7F6rz70mv08GoowrZ1CYOr5O4JpPDRlIpQfZJUucaS/c+KWQ==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" - }, - "nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==" - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } + "@expo/config": "~55.0.8", + "@expo/env": "~2.1.1" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" } }, - "zero-client": { - "version": "file:packages/zero-client", - "requires": { - "@rocicorp/lock": "^1.0.4", - "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", - "@vitest/ui": "^4.0.15", - "ast-to-zql": "0.0.0", - "datadog": "0.0.0", - "esbuild": "^0.25.10", - "playwright": "^1.53.2", - "replicache": "15.2.1", - "shared": "0.0.0", - "typescript": "~5.9.3", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" - }, + "packages/zero/node_modules/expo-file-system": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.10.tgz", + "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "packages/zero/node_modules/expo-font": { + "version": "55.0.4", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.4.tgz", + "integrity": "sha512-ZKeGTFffPygvY5dM/9ATM2p7QDkhsaHopH7wFAWgP2lKzqUMS9B/RxCvw5CaObr9Ro7x9YptyeRKX2HmgmMfrg==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "zero-pg": { - "version": "file:packages/zero-pg", - "requires": { - "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.0.15", - "vitest": "4.0.15", - "zero-cache": "0.0.0", - "zero-server": "0.0.0" + "packages/zero/node_modules/expo-keep-awake": { + "version": "55.0.4", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.4.tgz", + "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "expo": "*", + "react": "*" } }, - "zero-protocol": { - "version": "file:packages/zero-protocol", - "requires": { - "@badrap/valita": "0.3.11", - "shared": "0.0.0", - "typescript": "~5.9.3", - "zero-types": "0.0.0" + "packages/zero/node_modules/expo-modules-core": { + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.15.tgz", + "integrity": "sha512-MAGz1SYSVgQbwVeUysWgPtLh8ozbBwORatXoA4w0NZqZBZzEyBgUQNhuwaroaIi9W8Ir3wy1McmZcDYDJNGmVw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "invariant": "^2.2.4" }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "packages/zero/node_modules/expo-sqlite": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-55.0.10.tgz", + "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", + "dev": true, + "license": "MIT", "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } + "await-lock": "^2.2.2" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "zero-react": { - "version": "file:packages/zero-react", - "requires": { - "@testing-library/react": "^16.3.2", - "@types/react": "^18.3.18", - "react": "^18.3.1", - "shared": "0.0.0", - "zero-client": "0.0.0", - "zero-schema": "0.0.0", - "zql": "0.0.0" + "packages/zero/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "zero-react-native": { - "version": "file:packages/zero-react-native", - "requires": { - "@rocicorp/resolver": "^1.0.2", - "replicache": "15.2.1", - "shared": "0.0.0" + "packages/zero/node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "zero-schema": { - "version": "file:packages/zero-schema", - "requires": { - "shared": "0.0.0", - "zero-protocol": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" + "packages/zero/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "packages/zero/node_modules/react-native": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.84.1.tgz", + "integrity": "sha512-0PjxOyXRu3tZ8EobabxSukvhKje2HJbsZikR0U+pvS0pYZza2hXKjcSBiBdFN4h9D0S3v6a8kkrDK6WTRKMwzg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/assets-registry": "0.84.1", + "@react-native/codegen": "0.84.1", + "@react-native/community-cli-plugin": "0.84.1", + "@react-native/gradle-plugin": "0.84.1", + "@react-native/js-polyfills": "0.84.1", + "@react-native/normalize-colors": "0.84.1", + "@react-native/virtualized-lists": "0.84.1", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "0.32.0", + "base64-js": "^1.5.1", + "commander": "^12.0.0", + "flow-enums-runtime": "^0.0.6", + "hermes-compiler": "250829098.0.9", + "invariant": "^2.2.4", + "jest-environment-node": "^29.7.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.83.3", + "metro-source-map": "^0.83.3", + "nullthrows": "^1.1.1", + "pretty-format": "^29.7.0", + "promise": "^8.3.0", + "react-devtools-core": "^6.1.5", + "react-refresh": "^0.14.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.27.0", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "tinyglobby": "^0.2.15", + "whatwg-fetch": "^3.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.1", + "react": "^19.2.3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "zero-server": { - "version": "file:packages/zero-server", - "requires": { - "@prisma/adapter-pg": "^7.2.0", - "@prisma/client": "^7.2.0", - "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.0.15", - "drizzle-orm": "^0.44.2", - "pg": "^8.16.3", - "postgres": "3.4.7", - "prisma": "^7.2.0", - "shared": "0.0.0", - "vitest": "4.0.15", - "z2s": "0.0.0", - "zero-cache": "0.0.0", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" + "packages/zero/node_modules/react-native/node_modules/@react-native/normalize-colors": { + "version": "0.84.1", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.1.tgz", + "integrity": "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "packages/zero/node_modules/react-native/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "zero-solid": { - "version": "file:packages/zero-solid", - "requires": { - "@solidjs/testing-library": "^0.8.10", - "jsdom": "^26.1.0", - "shared": "0.0.0", - "solid-js": "^1.9.4", - "vite-plugin-solid": "^2.11.7", - "zero-client": "0.0.0" + "packages/zero/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" } }, - "zero-types": { - "version": "file:packages/zero-types", - "requires": { - "shared": "0.0.0", - "typescript": "~5.9.3", - "vitest": "4.0.15" + "packages/zero/node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "packages/zero/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, + "engines": { + "node": ">=8" + } + }, + "packages/zero/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "packages/zero/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "packages/zero/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - } - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "zod": { + "packages/zero/node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "peer": true - }, - "zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, + "license": "MIT", "peer": true, - "requires": {} + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } }, - "zql": { - "version": "file:packages/zql", - "requires": { + "packages/zql": { + "version": "0.0.0", + "dependencies": { + "@rocicorp/resolver": "^1.0.2", + "compare-utf8": "^0.1.1" + }, + "devDependencies": { "@faker-js/faker": "^9.6.0", "@rocicorp/logger": "^5.4.0", - "@rocicorp/resolver": "^1.0.2", "@standard-schema/spec": "^1.0.0", - "compare-utf8": "^0.1.1", "fast-check": "^3.18.0", "nanoid": "^5.1.2", "shared": "0.0.0", "typescript": "~5.9.3", "zero-protocol": "0.0.0", "zero-types": "0.0.0" - }, - "dependencies": { - "nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "dev": true - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } } }, - "zql-benchmarks": { - "version": "file:packages/zql-benchmarks", - "requires": { + "packages/zql-benchmarks": { + "version": "0.0.0", + "dependencies": { + "mitata": "^1.0.34" + }, + "devDependencies": { "@types/tmp": "^0.2.6", - "mitata": "^1.0.34", "otel": "0.0.0", "shared": "0.0.0", "typescript": "~5.9.3", @@ -70577,19 +44374,11 @@ "zql": "0.0.0", "zql-integration-tests": "0.0.0", "zqlite": "0.0.0" - }, - "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } } }, - "zql-integration-tests": { - "version": "file:packages/zql-integration-tests", - "requires": { + "packages/zql-integration-tests": { + "version": "0.0.0", + "devDependencies": { "@types/tmp": "^0.2.6", "otel": "0.0.0", "shared": "0.0.0", @@ -70602,86 +44391,19 @@ "zero-types": "0.0.0", "zql": "0.0.0", "zqlite": "0.0.0" - }, - "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } } }, - "zql-viz": { - "version": "file:apps/zql-viz", - "requires": { - "@monaco-editor/react": "^4.7.0", - "@tantaman/api-extractor": "^7.52.13", - "@types/react": "^18.3.18", - "@types/react-dom": "18.3.5", - "@vitejs/plugin-react": "^5.1.2", - "@xyflow/react": "^12.8.2", - "lucide-react": "^0.539.0", - "monaco-editor": "^0.52.2", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-resizable-panels": "^3.0.4", - "typescript": "~5.9.3", - "vite": "7.2.7", - "zero-types": "0.0.0", - "zql": "0.0.0" - }, + "packages/zqlite": { + "version": "0.0.0", "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "requires": {} - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - }, - "vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "dev": true, - "requires": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "fsevents": "~2.3.3", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - } - } - } - }, - "zqlite": { - "version": "file:packages/zqlite", - "requires": { "@databases/escape-identifier": "^1.0.3", "@databases/sql": "^3.3.0", "@rocicorp/logger": "^5.4.0", "@rocicorp/zero-sqlite3": "^1.0.15", + "zql": "0.0.0" + }, + "devDependencies": { + "@rocicorp/logger": "^5.4.0", "fast-check": "^3.18.0", "nanoid": "^5.1.2", "otel": "0.0.0", @@ -70691,59 +44413,86 @@ "zero-schema": "0.0.0", "zero-types": "0.0.0", "zql": "0.0.0" - }, - "dependencies": { - "nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "dev": true - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } } }, - "zqlite-zql-test": { - "version": "file:packages/zqlite-zql-test", - "requires": { + "packages/zqlite-zql-test": { + "version": "0.0.0", + "dependencies": { + "zqlite": "0.0.0" + }, + "devDependencies": { "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15", - "zqlite": "0.0.0" + "vitest": "4.1.0" + } + }, + "prod": { + "version": "0.0.0" + }, + "tools/client-simulator": { + "version": "0.0.0", + "dependencies": { + "@dotenvx/dotenvx": "^1.39.0", + "@rocicorp/logger": "^5.4.0", + "nanoid": "^5.1.2", + "ws": "^8.18.1" }, + "devDependencies": { + "shared": "0.0.0", + "zero-protocol": "0.0.0" + } + }, + "tools/load-generator": { + "version": "0.0.0", "dependencies": { - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - } + "@dotenvx/dotenvx": "^1.39.0", + "@rocicorp/logger": "^5.4.0", + "nanoid": "^5.1.2", + "pg-format": "npm:pg-format-fix@^1.0.5", + "postgres": "3.4.7" + }, + "devDependencies": { + "shared": "0.0.0" } }, - "zstd-codec": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.5.tgz", - "integrity": "sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==", - "dev": true + "tools/process-tracker": { + "version": "0.0.0", + "dependencies": { + "@rocicorp/logger": "^5.4.0", + "find-process": "^1.4.10", + "pidusage": "^4.0.0" + }, + "devDependencies": { + "@types/pidusage": "^2.0.5", + "shared": "0.0.0" + } }, - "zustand": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", - "requires": { - "use-sync-external-store": "^1.2.2" + "tools/sqlite-io-yield-simulator": { + "version": "0.0.0", + "dependencies": { + "@rocicorp/lock": "^1.0.4", + "@rocicorp/logger": "^5.4.0", + "ws": "^8.18.1", + "zqlite": "0.0.0" + }, + "devDependencies": { + "shared": "0.0.0" } }, - "zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" + "tools/verify-package-deps": { + "version": "0.0.0", + "dependencies": { + "oxc-parser": "^0.94.0" + }, + "devDependencies": { + "@types/node": "^22.10.5", + "typescript": "~5.9.3" + }, + "engines": { + "node": ">=22" + } } } } diff --git a/package.json b/package.json index 77f70f590c..2cef9c3755 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "dev": "npx turbo run dev", "test": "vitest run", "test:watch": "vitest", - "lint": "oxlint --type-aware --quiet --ignore-pattern '**/um.js' --report-unused-disable-directives-severity=error", + "lint": "oxlint --quiet", "format": "npx turbo run format", "check-format": "npx turbo run check-format", "check-types": "npx turbo run check-types", @@ -30,15 +30,18 @@ "verify-deps:fix": "cd tools/verify-package-deps && npm run verify:fix" }, "devDependencies": { - "@vitest/browser-playwright": "^4.0.15", - "@vitest/coverage-v8": "4.0.15", - "@vitest/runner": "4.0.15", - "baseline-browser-mapping": "^2.9.6", - "oxlint": "^1.50.0", - "oxlint-tsgolint": "^0.14.2", + "@vitest/browser-playwright": "^4.1.0", + "@vitest/coverage-v8": "4.1.0", + "@vitest/runner": "4.1.0", + "baseline-browser-mapping": "^2.10.8", + "oxlint": "^1.56.0", + "oxlint-tsgolint": "^0.17.0", "prettier": "^3.8.1", "tsx": "^4.21.0", "turbo": "^2.4.4", - "vitest": "4.0.15" + "vitest": "4.1.0" + }, + "overrides": { + "esbuild": "^0.27.4" } } diff --git a/packages/analyze-query/package.json b/packages/analyze-query/package.json index 66a5ca3ef1..b59a9e2e78 100644 --- a/packages/analyze-query/package.json +++ b/packages/analyze-query/package.json @@ -20,7 +20,7 @@ "ast-to-zql": "0.0.0", "otel": "0.0.0", "shared": "0.0.0", - "vitest": "4.0.15", + "vitest": "4.1.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", diff --git a/packages/datadog/package.json b/packages/datadog/package.json index 7bb5850ca4..791b001db9 100644 --- a/packages/datadog/package.json +++ b/packages/datadog/package.json @@ -6,10 +6,10 @@ "devDependencies": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15" + "vitest": "4.1.0" }, "scripts": { "test": "vitest run", diff --git a/packages/otel/tsconfig.json b/packages/otel/tsconfig.json index 1364c21257..472fbbdc7f 100644 --- a/packages/otel/tsconfig.json +++ b/packages/otel/tsconfig.json @@ -1,4 +1,5 @@ { "extends": "../../tsconfig.json", + "compilerOptions": {"types": ["node"]}, "include": ["src/**/*.ts", "src/**/*.js"] } diff --git a/packages/replicache-doc/package.json b/packages/replicache-doc/package.json index 8725291a5e..338101a8b9 100644 --- a/packages/replicache-doc/package.json +++ b/packages/replicache-doc/package.json @@ -31,8 +31,8 @@ "@docusaurus/tsconfig": "3.9.2", "@docusaurus/types": "3.9.2", "docusaurus-plugin-typedoc": "^1.4.2", - "typedoc": "^0.28.15", - "typedoc-plugin-markdown": "^4.9.0", + "typedoc": "^0.28.17", + "typedoc-plugin-markdown": "^4.10.0", "typescript": "~5.9.3" }, "browserslist": { diff --git a/packages/replicache-perf/package.json b/packages/replicache-perf/package.json index 8a46201995..9ed9d326d3 100644 --- a/packages/replicache-perf/package.json +++ b/packages/replicache-perf/package.json @@ -16,7 +16,7 @@ "@types/command-line-usage": "^5.0.2", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", - "esbuild": "^0.25.10", + "esbuild": "^0.27.4", "get-port": "^7.0.0", "hash-wasm": "^4.9.0", "idb": "^7.0.1", @@ -25,7 +25,7 @@ "shared": "0.0.0", "tsx": "^4.21.0", "typescript": "~5.9.3", - "vite": "7.2.7", + "vite": "8.0.0", "xbytes": "^1.7.0" } } diff --git a/packages/replicache/package.json b/packages/replicache/package.json index 7f37ae561b..1163d6aeed 100644 --- a/packages/replicache/package.json +++ b/packages/replicache/package.json @@ -16,6 +16,12 @@ "scripts": { "test": "vitest run", "test:watch": "vitest", + "test:chromium": "VITEST_BROWSER=chromium vitest run --config vitest.config.web.ts", + "test:chromium:watch": "VITEST_BROWSER=chromium vitest --config vitest.config.web.ts", + "test:firefox": "VITEST_BROWSER=firefox vitest run --config vitest.config.web.ts", + "test:firefox:watch": "VITEST_BROWSER=firefox vitest --config vitest.config.web.ts", + "test:webkit": "VITEST_BROWSER=webkit vitest run --config vitest.config.web.ts", + "test:webkit:watch": "VITEST_BROWSER=webkit vitest --config vitest.config.web.ts", "bench": "vitest bench --run", "bench:watch": "vitest bench --watch", "format": "prettier --write .", @@ -40,16 +46,16 @@ "@op-engineering/op-sqlite": ">=15", "@rocicorp/zero-sqlite3": "^1.0.15", "@types/command-line-usage": "^5.0.2", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", "compare-utf8": "^0.1.1", - "esbuild": "^0.25.10", + "esbuild": "^0.27.4", "expo-sqlite": ">=15", "playwright": "^1.53.2", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15" + "vitest": "4.1.0" }, "peerDependencies": { "@op-engineering/op-sqlite": ">=15", diff --git a/packages/replicache/src/kv/op-sqlite/types.ts b/packages/replicache/src/kv/op-sqlite/types.ts index 12c3575911..913cd54c0e 100644 --- a/packages/replicache/src/kv/op-sqlite/types.ts +++ b/packages/replicache/src/kv/op-sqlite/types.ts @@ -1,7 +1,6 @@ // Type definitions and imports for @op-engineering/op-sqlite // This file isolates the module resolution workarounds needed for this package -// @ts-expect-error - Module resolution issue with @op-engineering/op-sqlite exports import {open as openDB} from '@op-engineering/op-sqlite'; // Minimal type definitions for @op-engineering/op-sqlite diff --git a/packages/shared/package.json b/packages/shared/package.json index 57bd89878d..833afe27c7 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -6,6 +6,12 @@ "scripts": { "test": "vitest run", "test:watch": "vitest", + "test:chromium": "VITEST_BROWSER=chromium vitest run --config vitest.config.web.ts", + "test:chromium:watch": "VITEST_BROWSER=chromium vitest --config vitest.config.web.ts", + "test:firefox": "VITEST_BROWSER=firefox vitest run --config vitest.config.web.ts", + "test:firefox:watch": "VITEST_BROWSER=firefox vitest --config vitest.config.web.ts", + "test:webkit": "VITEST_BROWSER=webkit vitest run --config vitest.config.web.ts", + "test:webkit:watch": "VITEST_BROWSER=webkit vitest --config vitest.config.web.ts", "check-types": "tsc", "check-types:watch": "tsc --watch", "format": "prettier --write .", @@ -28,13 +34,13 @@ "devDependencies": { "@types/semver": "^7.5.1", "@types/strip-ansi": "^3.0.0", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "compare-utf8": "^0.1.1", "fast-check": "^3.18.0", "package-up": "^5.0.0", "playwright": "^1.53.2", "type-fest": "^4.30.0", "typescript": "~5.9.3", - "vitest": "4.0.15" + "vitest": "4.1.0" } } diff --git a/packages/shared/src/tool/vitest-config.ts b/packages/shared/src/tool/vitest-config.ts index efb0518c72..fb2710d6ff 100644 --- a/packages/shared/src/tool/vitest-config.ts +++ b/packages/shared/src/tool/vitest-config.ts @@ -3,6 +3,23 @@ import {defineConfig} from 'vitest/config'; import {makeDefine} from '../build.ts'; export const CI = process.env['CI'] === 'true' || process.env['CI'] === '1'; +const {VITEST_BROWSER} = process.env; + +function assertValidBrowser( + browser: string | undefined, +): asserts browser is 'chromium' | 'firefox' | 'webkit' | undefined { + switch (browser) { + case 'chromium': + case 'firefox': + case 'webkit': + case undefined: + return; + default: + throw new Error(`Invalid VITEST_BROWSER value: ${browser}`); + } +} + +assertValidBrowser(VITEST_BROWSER); const define = { ...makeDefine(), @@ -25,9 +42,6 @@ export default defineConfig({ include: ['vitest > @vitest/expect > chai'], }, define, - esbuild: { - define, - }, test: { onConsoleLog(log: string) { @@ -45,10 +59,14 @@ export default defineConfig({ provider: playwright(), headless: true, screenshotFailures: false, - instances: [ - {browser: 'chromium'}, - ...(CI ? ([{browser: 'firefox'}, {browser: 'webkit'}] as const) : []), - ], + instances: VITEST_BROWSER + ? ([{browser: VITEST_BROWSER}] as const) + : [ + {browser: 'chromium'}, + ...(CI + ? ([{browser: 'firefox'}, {browser: 'webkit'}] as const) + : []), + ], }, coverage: { provider: 'v8', diff --git a/packages/z2s/package.json b/packages/z2s/package.json index 337b9fa527..abad25f976 100644 --- a/packages/z2s/package.json +++ b/packages/z2s/package.json @@ -20,10 +20,10 @@ "devDependencies": { "@faker-js/faker": "^9.6.0", "@types/pg": "^8.11.11", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "pg": "^8.16.3", "shared": "0.0.0", - "vitest": "4.0.15", + "vitest": "4.1.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index 5ab7dae83e..b98bb3bd9a 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -77,13 +77,13 @@ "@types/pg-format": "^1.0.5", "@types/strip-ansi": "^3.0.0", "@types/ws": "^8.5.12", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "mockttp": "^4.2.1", "nock": "^14.0.4", "otel": "0.0.0", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15", + "vitest": "4.1.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zql": "0.0.0" diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index a495e52b99..bbba44057b 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -55,12 +55,16 @@ test('zero-cache --help', () => { Basic Examples: Exact URL match: "https://api.example.com/mutate" + Any subdomain using wildcard: "https://*.example.com/mutate" + Multiple subdomain levels: "https://*.*.example.com/mutate" + Any path under a domain: "https://api.example.com/*" + Named path parameters: "https://api.example.com/:version/mutate" ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. @@ -68,6 +72,7 @@ test('zero-cache --help', () => { Advanced Patterns: Optional path segments: "https://api.example.com/:path?" + Regex in segments (for specific patterns): "https://api.example.com/:version(v\\d+)/mutate" ↳ Matches only "v" followed by digits @@ -110,12 +115,16 @@ test('zero-cache --help', () => { Basic Examples: Exact URL match: "https://api.example.com/mutate" + Any subdomain using wildcard: "https://*.example.com/mutate" + Multiple subdomain levels: "https://*.*.example.com/mutate" + Any path under a domain: "https://api.example.com/*" + Named path parameters: "https://api.example.com/:version/mutate" ↳ Matches "https://api.example.com/v1/mutate", "https://api.example.com/v2/mutate", etc. @@ -123,6 +132,7 @@ test('zero-cache --help', () => { Advanced Patterns: Optional path segments: "https://api.example.com/:path?" + Regex in segments (for specific patterns): "https://api.example.com/:version(v\\d+)/mutate" ↳ Matches only "v" followed by digits diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts index f027faaa31..e54d489c85 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.backfill.pg.test.ts @@ -125,8 +125,13 @@ describe('change-source/pg/backfill-test', {timeout: 30000}, () => { ): Queue { const queue = new Queue(); void (async () => { - for await (const msg of sub) { - queue.enqueue(msg); + try { + for await (const msg of sub) { + queue.enqueue(msg); + } + } catch { + // The source can error during teardown if upstream connections are + // forcibly terminated; this should not surface as an unhandled rejection. } })(); return queue; @@ -137,7 +142,7 @@ describe('change-source/pg/backfill-test', {timeout: 30000}, () => { async function nextTransaction(): Promise { const data: DataOrSchemaChange[] = []; for (;;) { - const change = await downstream.dequeue('timeout', 5000); + const change = await downstream.dequeue('timeout', 10_000); if (change === 'timeout') { throw new Error('timed out waiting for change'); } diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index 8a288e14dc..113940d488 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -103,11 +103,16 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { ): Queue { const queue = new Queue(); void (async () => { - for await (const msg of sub) { - if (msg[0] === 'status' && !msg[1].ack) { - continue; // filter out keepalives + try { + for await (const msg of sub) { + if (msg[0] === 'status' && !msg[1].ack) { + continue; // filter out keepalives + } + queue.enqueue(msg); } - queue.enqueue(msg); + } catch { + // The source can error during teardown if upstream connections are + // forcibly terminated; this should not surface as an unhandled rejection. } })(); return queue; @@ -116,7 +121,7 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { async function nextTransaction(): Promise { const data: DataOrSchemaChange[] = []; for (;;) { - const change = await downstream.dequeue('timeout', 5000); + const change = await downstream.dequeue('timeout', 10_000); if (change === 'timeout') { throw new Error('timed out waiting for change'); } diff --git a/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts index 914b92cf80..fdc7ab11cc 100644 --- a/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts @@ -7,7 +7,7 @@ import type {PostgresDB} from '../../../types/pg.ts'; import {decommissionShard} from './decommission.ts'; import {initialSync} from './initial-sync.ts'; -const APP_ID = 'zeroout'; +const APP_ID = 'zerooutcs'; const SHARD_NUM = 13; describe('decommission', () => { @@ -45,26 +45,26 @@ describe('decommission', () => { ); expect(await upstream`SELECT pubname FROM pg_publication`.values()).toEqual( - [['_zeroout_public_13'], ['_zeroout_metadata_13']], + [['_zerooutcs_public_13'], ['_zerooutcs_metadata_13']], ); expect( - await upstream`SELECT evtname FROM pg_event_trigger WHERE evtname LIKE 'zeroout%'`.values(), + await upstream`SELECT evtname FROM pg_event_trigger WHERE evtname LIKE 'zerooutcs%'`.values(), ).toEqual([ - ['zeroout_ddl_start_13'], - ['zeroout_create_table_13'], - ['zeroout_alter_table_13'], - ['zeroout_create_index_13'], - ['zeroout_drop_table_13'], - ['zeroout_drop_index_13'], - ['zeroout_alter_publication_13'], - ['zeroout_alter_schema_13'], + ['zerooutcs_ddl_start_13'], + ['zerooutcs_create_table_13'], + ['zerooutcs_alter_table_13'], + ['zerooutcs_create_index_13'], + ['zerooutcs_drop_table_13'], + ['zerooutcs_drop_index_13'], + ['zerooutcs_alter_publication_13'], + ['zerooutcs_alter_schema_13'], ]); expect( - await upstream`SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'zeroout%'`.values(), - ).toMatchObject([[expect.stringMatching('zeroout_13_')]]); + await upstream`SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'zerooutcs%'`.values(), + ).toMatchObject([[expect.stringMatching('zerooutcs_13_')]]); expect( - await upstream`SELECT nspname FROM pg_namespace WHERE nspname LIKE 'zeroout%'`.values(), - ).toEqual([['zeroout_13'], ['zeroout']]); + await upstream`SELECT nspname FROM pg_namespace WHERE nspname LIKE 'zerooutcs%'`.values(), + ).toEqual([['zerooutcs_13'], ['zerooutcs']]); await decommissionShard(lc, upstream, APP_ID, SHARD_NUM); @@ -72,15 +72,15 @@ describe('decommission', () => { [], ); expect( - await upstream`SELECT evtname FROM pg_event_trigger WHERE evtname LIKE 'zeroout%'`.values(), + await upstream`SELECT evtname FROM pg_event_trigger WHERE evtname LIKE 'zerooutcs%'`.values(), ).toEqual([]); expect( - await upstream`SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'zeroout%'`.values(), + await upstream`SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'zerooutcs%'`.values(), ).toEqual([]); // Note: The app schema remains, since it is not shard specific. expect( - await upstream`SELECT nspname FROM pg_namespace WHERE nspname LIKE 'zeroout%'`.values(), - ).toEqual([['zeroout']]); + await upstream`SELECT nspname FROM pg_namespace WHERE nspname LIKE 'zerooutcs%'`.values(), + ).toEqual([['zerooutcs']]); }); }); diff --git a/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts b/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts index 895b0fbf1c..ec73e84e6e 100644 --- a/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts +++ b/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts @@ -53,7 +53,11 @@ litestream_replica_validation_total{db="/tmp/zbugs-sync-replica.db",name="file", .get('/metrics') .reply(200, () => metricsResponse); - return () => vi.useRealTimers(); + return () => { + nock.abortPendingRequests(); + nock.cleanAll(); + vi.useRealTimers(); + }; }); function getFirstMessage( diff --git a/packages/zero-client/package.json b/packages/zero-client/package.json index 5be53988d5..6c10408b1d 100644 --- a/packages/zero-client/package.json +++ b/packages/zero-client/package.json @@ -9,6 +9,12 @@ "lint": "oxlint --type-aware src/", "test": "vitest run", "test:watch": "vitest", + "test:chromium": "VITEST_BROWSER=chromium vitest run", + "test:chromium:watch": "VITEST_BROWSER=chromium vitest", + "test:firefox": "VITEST_BROWSER=firefox vitest run", + "test:firefox:watch": "VITEST_BROWSER=firefox vitest", + "test:webkit": "VITEST_BROWSER=webkit vitest run", + "test:webkit:watch": "VITEST_BROWSER=webkit vitest", "test:update": "vitest run -u", "bench": "vitest bench --run", "bench:watch": "vitest bench --watch", @@ -21,10 +27,9 @@ "@rocicorp/resolver": "^1.0.2" }, "devDependencies": { - "@vitest/ui": "^4.0.15", "ast-to-zql": "0.0.0", "datadog": "0.0.0", - "esbuild": "^0.25.10", + "esbuild": "^0.27.4", "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", diff --git a/packages/zero-client/src/client/error.test.ts b/packages/zero-client/src/client/error.test.ts index 8bea1a5a57..7b72b0e1ec 100644 --- a/packages/zero-client/src/client/error.test.ts +++ b/packages/zero-client/src/client/error.test.ts @@ -66,7 +66,9 @@ describe('ClientError', () => { }); expect(error.stack).toBeDefined(); - expect(error.stack).toContain('ClientError'); + // Stack formatting differs by engine: V8/Spidermonkey includes error class + // names, while WebKit often only includes callsite URLs and line numbers. + expect(error.stack).toMatch(/ClientError|error\.test\.ts:\d+:\d+/); }); }); @@ -136,7 +138,9 @@ describe('ServerError', () => { }); expect(error.stack).toBeDefined(); - expect(error.stack).toContain('ProtocolError'); + // Stack formatting differs by engine: V8/Spidermonkey includes error class names, + // while WebKit often only includes callsite URLs and line numbers. + expect(error.stack).toMatch(/ProtocolError|error\.test\.ts:\d+:\d+/); }); }); diff --git a/packages/zero-pg/package.json b/packages/zero-pg/package.json index 8dec0c5333..8850a1ea46 100644 --- a/packages/zero-pg/package.json +++ b/packages/zero-pg/package.json @@ -17,8 +17,8 @@ "@rocicorp/logger": "^5.4.0" }, "devDependencies": { - "@vitest/runner": "4.0.15", - "vitest": "4.0.15", + "@vitest/runner": "4.1.0", + "vitest": "4.1.0", "zero-cache": "0.0.0", "zero-server": "0.0.0" } diff --git a/packages/zero-protocol/src/error.test.ts b/packages/zero-protocol/src/error.test.ts index 131c1950e8..82cc5e7f2b 100644 --- a/packages/zero-protocol/src/error.test.ts +++ b/packages/zero-protocol/src/error.test.ts @@ -1,8 +1,8 @@ import {describe, expect, test} from 'vitest'; -import {ProtocolError, isProtocolError, type ErrorBody} from './error.ts'; import {ErrorKind} from './error-kind.ts'; import {ErrorOrigin} from './error-origin.ts'; +import {ProtocolError, isProtocolError, type ErrorBody} from './error.ts'; describe('ProtocolError', () => { test('exposes error body and metadata', () => { @@ -44,6 +44,8 @@ describe('ProtocolError', () => { }); expect(error.stack).toBeDefined(); - expect(error.stack).toContain('ProtocolError'); + // Stack formatting differs by engine: V8/Spidermonkey includes error class names, + // while WebKit often only includes callsite URLs and line numbers. + expect(error.stack).toMatch(/ProtocolError|error\.test\.ts:\d+:\d+/); }); }); diff --git a/packages/zero-react/package.json b/packages/zero-react/package.json index 317c5c4816..485fdddaad 100644 --- a/packages/zero-react/package.json +++ b/packages/zero-react/package.json @@ -9,6 +9,12 @@ "check-types:watch": "tsc --watch", "test": "vitest run", "test:watch": "vitest watch", + "test:chromium": "VITEST_BROWSER=chromium vitest run", + "test:chromium:watch": "VITEST_BROWSER=chromium vitest", + "test:firefox": "VITEST_BROWSER=firefox vitest run", + "test:firefox:watch": "VITEST_BROWSER=firefox vitest", + "test:webkit": "VITEST_BROWSER=webkit vitest run", + "test:webkit:watch": "VITEST_BROWSER=webkit vitest", "format": "prettier --write .", "check-format": "prettier --check .", "lint": "oxlint --type-aware src/" diff --git a/packages/zero-server/package.json b/packages/zero-server/package.json index 24f09dae99..41220a3766 100644 --- a/packages/zero-server/package.json +++ b/packages/zero-server/package.json @@ -21,14 +21,14 @@ }, "devDependencies": { "@prisma/adapter-pg": "^7.2.0", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "@prisma/client": "^7.2.0", - "drizzle-orm": "^0.44.2", + "drizzle-orm": "^0.45.1", "pg": "^8.16.3", "postgres": "3.4.7", "prisma": "^7.2.0", "shared": "0.0.0", - "vitest": "4.0.15", + "vitest": "4.1.0", "z2s": "0.0.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", diff --git a/packages/zero-solid/package.json b/packages/zero-solid/package.json index 40c0da3efe..8cf4c5126d 100644 --- a/packages/zero-solid/package.json +++ b/packages/zero-solid/package.json @@ -7,6 +7,12 @@ "scripts": { "test": "vitest run", "test:watch": "vitest", + "test:chromium": "VITEST_BROWSER=chromium vitest run", + "test:chromium:watch": "VITEST_BROWSER=chromium vitest", + "test:firefox": "VITEST_BROWSER=firefox vitest run", + "test:firefox:watch": "VITEST_BROWSER=firefox vitest", + "test:webkit": "VITEST_BROWSER=webkit vitest run", + "test:webkit:watch": "VITEST_BROWSER=webkit vitest", "check-types": "tsc", "check-types:watch": "tsc --watch", "format": "prettier --write .", @@ -18,10 +24,9 @@ }, "devDependencies": { "@solidjs/testing-library": "^0.8.10", - "jsdom": "^26.1.0", "shared": "0.0.0", "solid-js": "^1.9.4", - "vite-plugin-solid": "^2.11.7", + "vite-plugin-solid": "^2.11.11", "zero-client": "0.0.0" } } diff --git a/packages/zero-types/package.json b/packages/zero-types/package.json index be757d56ad..8bebe361b5 100644 --- a/packages/zero-types/package.json +++ b/packages/zero-types/package.json @@ -15,6 +15,6 @@ "devDependencies": { "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15" + "vitest": "4.1.0" } } diff --git a/packages/zero/package.json b/packages/zero/package.json index 31014556a6..ffe08ee122 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -79,17 +79,17 @@ }, "devDependencies": { "@op-engineering/op-sqlite": ">=15", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", "expo-sqlite": ">=15", "replicache": "15.2.1", "shared": "0.0.0", - "typedoc": "^0.28.15", - "typedoc-plugin-markdown": "^4.9.0", + "typedoc": "^0.28.17", + "typedoc-plugin-markdown": "^4.10.0", "typescript": "~5.9.3", - "vite": "7.2.7", - "vitest": "4.0.15", + "vite": "8.0.0", + "vitest": "4.1.0", "zero-cache": "0.0.0", "zero-client": "0.0.0", "zero-pg": "0.0.0", diff --git a/packages/zql/src/query/define-query.test.ts b/packages/zql/src/query/define-query.test.ts index 75e6dcb39c..4885344182 100644 --- a/packages/zql/src/query/define-query.test.ts +++ b/packages/zql/src/query/define-query.test.ts @@ -376,8 +376,8 @@ describe('defineQuery types', () => { >(); // Verify the validator's input type accepts undefined expectTypeOf< - Parameters<(typeof defaultValidator)['~standard']['validate']> - >().toEqualTypeOf<[unknown]>(); + Parameters<(typeof defaultValidator)['~standard']['validate']>[0] + >().toEqualTypeOf(); // Transform: completely different types const stringToNumberValidator = makeValidator(data => { @@ -396,8 +396,8 @@ describe('defineQuery types', () => { >(); // Verify the validator's input type accepts string expectTypeOf< - Parameters<(typeof stringToNumberValidator)['~standard']['validate']> - >().toEqualTypeOf<[unknown]>(); + Parameters<(typeof stringToNumberValidator)['~standard']['validate']>[0] + >().toEqualTypeOf(); }); test('defineQuery with with explicit types', () => { diff --git a/packages/zqlite-zql-test/package.json b/packages/zqlite-zql-test/package.json index 9e812e9bc2..7d9be3897a 100644 --- a/packages/zqlite-zql-test/package.json +++ b/packages/zqlite-zql-test/package.json @@ -15,10 +15,10 @@ }, "devDependencies": { "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.0.15", + "@vitest/runner": "4.1.0", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.0.15" + "vitest": "4.1.0" }, "dependencies": { "zqlite": "0.0.0" From 8eecaaab43d38965f9b9675763b9c06e3979c726 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Tue, 17 Mar 2026 12:37:39 -0400 Subject: [PATCH 148/495] fix(replicator): async writes (#5652) https://www.notion.so/replicache/Move-replication-code-to-use-async-sqlite-API-to-avoid-timeouts-31f3bed89545807eb764d2c79e856e3e Do not block the replicator's main thread when writing to SQLite. Prevents the case of stalling if a massive write comes in. This turns out to be faster than `node-sqlite3`. `node-sqlite3` is also: 1. deprecated 2. does not run the bedrock branch of sqlite 3. is slower than using a worker + better-sqlite3 image --- .../src/server/anonymous-otel-start.ts | 2 +- .../src/server/otel-diag-integration.test.ts | 2 +- .../src/server/otel-diag-logger.test.ts | 2 +- packages/zero-cache/src/server/otel-start.ts | 2 +- packages/zero-cache/src/server/replicator.ts | 11 ++ .../replicator/incremental-sync.test.ts | 96 ++++++--- .../services/replicator/incremental-sync.ts | 82 +++++--- .../src/services/replicator/replicator.ts | 22 ++- .../replicator/write-worker-client.ts | 163 ++++++++++++++++ .../services/replicator/write-worker.test.ts | 183 ++++++++++++++++++ .../src/services/replicator/write-worker.ts | 100 ++++++++++ packages/zero-cache/src/workers/replicator.ts | 35 ++-- 12 files changed, 615 insertions(+), 85 deletions(-) create mode 100644 packages/zero-cache/src/services/replicator/write-worker-client.ts create mode 100644 packages/zero-cache/src/services/replicator/write-worker.test.ts create mode 100644 packages/zero-cache/src/services/replicator/write-worker.ts diff --git a/packages/zero-cache/src/server/anonymous-otel-start.ts b/packages/zero-cache/src/server/anonymous-otel-start.ts index 7df7af2453..52e352aaef 100644 --- a/packages/zero-cache/src/server/anonymous-otel-start.ts +++ b/packages/zero-cache/src/server/anonymous-otel-start.ts @@ -18,7 +18,7 @@ import { getZeroConfig, type ZeroConfig, } from '../config/zero-config.js'; -import {setupOtelDiagnosticLogger} from './otel-diag-logger.js'; +import {setupOtelDiagnosticLogger} from './otel-diag-logger.ts'; export type ActiveUsers = { active_users_last_day: number; diff --git a/packages/zero-cache/src/server/otel-diag-integration.test.ts b/packages/zero-cache/src/server/otel-diag-integration.test.ts index c583f3fec7..d5157e32e7 100644 --- a/packages/zero-cache/src/server/otel-diag-integration.test.ts +++ b/packages/zero-cache/src/server/otel-diag-integration.test.ts @@ -1,6 +1,6 @@ import type {LogContext} from '@rocicorp/logger'; import {beforeEach, describe, expect, test, vi} from 'vitest'; -import {resetOtelDiagnosticLogger} from './otel-diag-logger.js'; +import {resetOtelDiagnosticLogger} from './otel-diag-logger.ts'; // Mock OpenTelemetry modules to avoid actual SDK initialization vi.mock('@opentelemetry/api', async () => { diff --git a/packages/zero-cache/src/server/otel-diag-logger.test.ts b/packages/zero-cache/src/server/otel-diag-logger.test.ts index 92a1031ac7..af60170687 100644 --- a/packages/zero-cache/src/server/otel-diag-logger.test.ts +++ b/packages/zero-cache/src/server/otel-diag-logger.test.ts @@ -4,7 +4,7 @@ import type {LogContext} from '@rocicorp/logger'; import { resetOtelDiagnosticLogger, setupOtelDiagnosticLogger, -} from './otel-diag-logger.js'; +} from './otel-diag-logger.ts'; // Mock the diag.setLogger function vi.mock('@opentelemetry/api', async () => { diff --git a/packages/zero-cache/src/server/otel-start.ts b/packages/zero-cache/src/server/otel-start.ts index 3cc9c42f11..b228861048 100644 --- a/packages/zero-cache/src/server/otel-start.ts +++ b/packages/zero-cache/src/server/otel-start.ts @@ -10,7 +10,7 @@ import { otelMetricsEnabled, otelTracesEnabled, } from '../../../otel/src/enabled.ts'; -import {setupOtelDiagnosticLogger} from './otel-diag-logger.js'; +import {setupOtelDiagnosticLogger} from './otel-diag-logger.ts'; class OtelManager { static #instance: OtelManager; diff --git a/packages/zero-cache/src/server/replicator.ts b/packages/zero-cache/src/server/replicator.ts index ef6e71adca..2b93388c4d 100644 --- a/packages/zero-cache/src/server/replicator.ts +++ b/packages/zero-cache/src/server/replicator.ts @@ -10,6 +10,7 @@ import { ReplicatorService, type ReplicatorMode, } from '../services/replicator/replicator.ts'; +import {ThreadWriteWorkerClient} from '../services/replicator/write-worker-client.ts'; import { parentWorker, singleProcessMode, @@ -17,6 +18,7 @@ import { } from '../types/processes.ts'; import {getShardConfig} from '../types/shards.ts'; import { + getPragmaConfig, replicaFileModeSchema, setUpMessageHandlers, setupReplica, @@ -39,6 +41,14 @@ export default async function runWorker( const replica = await setupReplica(lc, fileMode, config.replica); + // Create the write worker for async SQLite writes. + const dbPath = replica.name; + const pragmas = getPragmaConfig(fileMode); + const workerClient = new ThreadWriteWorkerClient( + new URL('../services/replicator/write-worker.ts', import.meta.url), + ); + await workerClient.init(dbPath, mode, pragmas, config.log); + const runningLocalChangeStreamer = config.changeStreamer.mode === 'dedicated' && !config.changeStreamer.uri; const shard = getShardConfig(config); @@ -66,6 +76,7 @@ export default async function runWorker( mode, changeStreamer, replica, + workerClient, runningLocalChangeStreamer, // publish ReplicationStatusEvents ); diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index b20b9e0e87..7977f632fc 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -12,9 +12,9 @@ import { import type {JSONObject} from '../../../../shared/src/bigint-json.ts'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import type {ZeroEvent} from '../../../../zero-events/src/index.ts'; -import {Database} from '../../../../zqlite/src/db.ts'; +import type {Database} from '../../../../zqlite/src/db.ts'; import {initEventSinkForTesting} from '../../observability/events.ts'; -import {expectTables, initDB} from '../../test/lite.ts'; +import {DbFile, expectTables, initDB} from '../../test/lite.ts'; import {Subscription} from '../../types/subscription.ts'; import {orTimeoutWith} from '../../types/timeout.ts'; import { @@ -23,25 +23,36 @@ import { type SubscriberContext, } from '../change-streamer/change-streamer.ts'; import {IncrementalSyncer} from './incremental-sync.ts'; -import {initReplicationState} from './schema/replication-state.ts'; +import { + createReplicationStateTables, + initReplicationState, +} from './schema/replication-state.ts'; import {ReplicationMessages} from './test-utils.ts'; +import {ThreadWriteWorkerClient} from './write-worker-client.ts'; const TASK_ID = 'task-id'; const REPLICA_ID = 'incremental_sync_test_id'; describe('replicator/incremental-sync', () => { let lc: LogContext; - let replica: Database; + let dbFile: DbFile; + let mainDb: Database; + let worker: ThreadWriteWorkerClient; let syncer: IncrementalSyncer; + let syncing: Promise | undefined; let downstream: Subscription; let eventSink: ZeroEvent[]; let subscribeFn: MockedFunction< (ctx: SubscriberContext) => Promise> >; - beforeEach(() => { + beforeEach(async () => { lc = createSilentLogContext(); - replica = new Database(lc, ':memory:'); + dbFile = new DbFile('incremental-sync-test'); + mainDb = dbFile.connect(lc); + mainDb.pragma('journal_mode = wal'); + createReplicationStateTables(mainDb); + downstream = Subscription.create(); eventSink = []; initEventSinkForTesting( @@ -49,27 +60,47 @@ describe('replicator/incremental-sync', () => { new Date(Date.UTC(2025, 7, 14, 1, 2, 3)), ); subscribeFn = vi.fn(); + worker = new ThreadWriteWorkerClient( + new URL('./write-worker.ts', import.meta.url), + ); + await worker.init( + dbFile.path, + 'serving', + { + busyTimeout: 30000, + analysisLimit: 1000, + }, + {level: 'error', format: 'text'}, + ); syncer = new IncrementalSyncer( TASK_ID, REPLICA_ID, {subscribe: subscribeFn.mockResolvedValue(downstream)}, - replica, + mainDb, + worker, 'serving', true, ); }); - afterEach(() => { - syncer.stop(lc); + afterEach(async () => { + downstream?.cancel(); + syncer?.stop(lc); + // Wait for the run loop to finish so any in-flight worker call + // completes before we send 'stop' to the worker. + await syncing?.catch(() => {}); + await worker?.stop(); + mainDb?.close(); + dbFile?.delete(); }); test('replicates transactions', async () => { const issues = new ReplicationMessages({issues: ['issueID', 'bool']}); - initReplicationState(replica, ['zero_data'], '02'); + initReplicationState(mainDb, ['zero_data'], '02', {}, false); initDB( - replica, + mainDb, ` CREATE TABLE issues( issueID INTEGER, @@ -88,10 +119,11 @@ describe('replicator/incremental-sync', () => { `, ); - const syncing = syncer.run(lc); + syncing = syncer.run(lc); const notifications = syncer.subscribe(); const versionReady = notifications[Symbol.asyncIterator](); await versionReady.next(); // Get the initial nextStateVersion. + await vi.waitFor(() => expect(subscribeFn).toHaveBeenCalled()); expect(subscribeFn.mock.calls[0][0]).toEqual({ protocolVersion: PROTOCOL_VERSION, taskID: 'task-id', @@ -137,7 +169,7 @@ describe('replicator/incremental-sync', () => { } expectTables( - replica, + mainDb, { issues: [ { @@ -350,10 +382,10 @@ describe('replicator/incremental-sync', () => { test('replicates schema changes', async () => { const issues = new ReplicationMessages({issues: ['issueID', 'bool']}); - initReplicationState(replica, ['zero_data'], '09'); + initReplicationState(mainDb, ['zero_data'], '09', {}, false); initDB( - replica, + mainDb, ` CREATE TABLE issues( issueID INTEGER, @@ -365,10 +397,11 @@ describe('replicator/incremental-sync', () => { `, ); - const syncing = syncer.run(lc); + syncing = syncer.run(lc); const notifications = syncer.subscribe(); const versionReady = notifications[Symbol.asyncIterator](); await versionReady.next(); // Get the initial nextStateVersion. + await vi.waitFor(() => expect(subscribeFn).toHaveBeenCalled()); expect(subscribeFn.mock.calls[0][0]).toEqual({ protocolVersion: PROTOCOL_VERSION, taskID: 'task-id', @@ -524,10 +557,10 @@ describe('replicator/incremental-sync', () => { test('does not notify on incomplete backfills', async () => { const issues = new ReplicationMessages({issues: ['issueID']}); - initReplicationState(replica, ['zero_data'], '09'); + initReplicationState(mainDb, ['zero_data'], '09', {}, false); initDB( - replica, + mainDb, /*sql*/ ` CREATE TABLE issues( issueID INTEGER PRIMARY KEY, @@ -541,10 +574,11 @@ describe('replicator/incremental-sync', () => { `, ); - void syncer.run(lc); + syncing = syncer.run(lc); const notifications = syncer.subscribe(); const versionReady = notifications[Symbol.asyncIterator](); await versionReady.next(); // Get the initial nextStateVersion. + await vi.waitFor(() => expect(subscribeFn).toHaveBeenCalled()); expect(subscribeFn.mock.calls[0][0]).toEqual({ protocolVersion: PROTOCOL_VERSION, taskID: 'task-id', @@ -594,7 +628,7 @@ describe('replicator/incremental-sync', () => { await noNotification(next); // And that row versions have not changed, even for backfilled rows. - const issuesDump = replica.prepare(/*sql*/ `SELECT * FROM issues`); + const issuesDump = mainDb.prepare(/*sql*/ `SELECT * FROM issues`); expect(issuesDump.all()).toEqual([ { _0_version: '100', @@ -652,7 +686,7 @@ describe('replicator/incremental-sync', () => { // The row version in the table metadata should be bumped. expect( - replica.prepare(/*sql*/ `SELECT * FROM "_zero.tableMetadata"`).get(), + mainDb.prepare(/*sql*/ `SELECT * FROM "_zero.tableMetadata"`).get(), ).toMatchObject({ minRowVersion: '110.02', schema: 'public', @@ -676,7 +710,7 @@ describe('replicator/incremental-sync', () => { }); test('retry on initial change-streamer connection failure', async () => { - initReplicationState(replica, ['zero_data'], '02'); + initReplicationState(mainDb, ['zero_data'], '02', {}, false); const {promise: hasRetried, resolve: retried} = resolver(); const syncer = new IncrementalSyncer( @@ -691,20 +725,22 @@ describe('replicator/incremental-sync', () => { return resolver().promise; }), }, - replica, + mainDb, + worker, 'serving', true, ); - void syncer.run(lc); + const localSyncing = syncer.run(lc); expect(await hasRetried).toBe(true); - void syncer.stop(lc); + syncer.stop(lc); + void localSyncing.catch(() => {}); }); test('retry on error in change-stream', async () => { - initReplicationState(replica, ['zero_data'], '02'); + initReplicationState(mainDb, ['zero_data'], '02', {}, false); const {promise: hasRetried, resolve: retried} = resolver(); const syncer = new IncrementalSyncer( @@ -719,17 +755,19 @@ describe('replicator/incremental-sync', () => { return resolver().promise; }), }, - replica, + mainDb, + worker, 'serving', true, ); - void syncer.run(lc); + const localSyncing = syncer.run(lc); downstream.fail(new Error('doh')); expect(await hasRetried).toBe(true); - void syncer.stop(lc); + syncer.stop(lc); + void localSyncing.catch(() => {}); }); }); diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.ts b/packages/zero-cache/src/services/replicator/incremental-sync.ts index ee0dc94e2a..e1f67b20f2 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.ts @@ -1,32 +1,34 @@ import type {LogContext} from '@rocicorp/logger'; import type {Database} from '../../../../zqlite/src/db.ts'; -import {StatementRunner} from '../../db/statements.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import type {Source} from '../../types/streams.ts'; +import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import type {DownloadStatus} from '../change-source/protocol/current.ts'; import { PROTOCOL_VERSION, type ChangeStreamer, type Downstream, } from '../change-streamer/change-streamer.ts'; +import type {CommitResult} from './change-processor.ts'; import {RunningState} from '../running-state.ts'; -import {ChangeProcessor} from './change-processor.ts'; import {Notifier} from './notifier.ts'; import {ReplicationStatusPublisher} from './replication-status.ts'; import type {ReplicaState, ReplicatorMode} from './replicator.ts'; -import {getSubscriptionState} from './schema/replication-state.ts'; +import type {WriteWorkerClient} from './write-worker-client.ts'; /** * The {@link IncrementalSyncer} manages a logical replication stream from upstream, * handling application lifecycle events (start, stop) and retrying the * connection with exponential backoff. The actual handling of the logical - * replication messages is done by the {@link ChangeProcessor}. + * replication messages is done by the {@link ChangeProcessor}, which runs + * in a worker thread via the {@link WriteWorkerClient}. */ export class IncrementalSyncer { readonly #taskID: string; readonly #id: string; readonly #changeStreamer: ChangeStreamer; - readonly #replica: StatementRunner; + readonly #statusDb: Database; + readonly #worker: WriteWorkerClient; readonly #mode: ReplicatorMode; readonly #publishReplicationStatus: boolean; readonly #notifier: Notifier; @@ -43,38 +45,38 @@ export class IncrementalSyncer { taskID: string, id: string, changeStreamer: ChangeStreamer, - replica: Database, + statusDb: Database, + worker: WriteWorkerClient, mode: ReplicatorMode, publishReplicationStatus: boolean, ) { this.#taskID = taskID; this.#id = id; this.#changeStreamer = changeStreamer; - this.#replica = new StatementRunner(replica); + this.#statusDb = statusDb; + this.#worker = worker; this.#mode = mode; this.#publishReplicationStatus = publishReplicationStatus; this.#notifier = new Notifier(); } async run(lc: LogContext) { + this.#worker.onError(err => this.#state.stop(lc, err)); lc.info?.(`Starting IncrementalSyncer`); - const {watermark: initialWatermark} = getSubscriptionState(this.#replica); + const {watermark: initialWatermark} = + await this.#worker.getSubscriptionState(); // Notify any waiting subscribers that the replica is ready to be read. void this.#notifier.notifySubscribers(); // Only the backup replicator publishes replication status events. const statusPublisher = this.#publishReplicationStatus - ? new ReplicationStatusPublisher(this.#replica.db) + ? new ReplicationStatusPublisher(this.#statusDb) : undefined; while (this.#state.shouldRun()) { - const {replicaVersion, watermark} = getSubscriptionState(this.#replica); - const processor = new ChangeProcessor( - this.#replica, - this.#mode, - (lc: LogContext, err: unknown) => this.stop(lc, err), - ); + const {replicaVersion, watermark} = + await this.#worker.getSubscriptionState(); let downstream: Source | undefined; let unregister = () => {}; @@ -144,32 +146,22 @@ export class IncrementalSyncer { backfillStatus = status; // Update the current status } - const result = processor.processMessage(lc, message); + const result = await this.#worker.processMessage( + message as ChangeStreamData, + ); + + this.#handleResult(lc, result, statusPublisher); if (result?.completedBackfill) { - // Publish the final status - const status = result.completedBackfill; - statusPublisher?.publish( - lc, - 'Replicating', - `Backfilled ${status.table} table`, - 0, - () => ({downloadStatus: [status]}), - ); backfillStatus = undefined; - } else if (result?.schemaUpdated) { - statusPublisher?.publish(lc, 'Replicating', 'Schema updated'); - } - if (result?.watermark && result?.changeLogUpdated) { - void this.#notifier.notifySubscribers({state: 'version-ready'}); } break; } } } - processor.abort(lc); + this.#worker.abort(); } catch (e) { err = e; - processor.abort(lc); + this.#worker.abort(); } finally { downstream?.cancel(); unregister(); @@ -180,6 +172,32 @@ export class IncrementalSyncer { lc.info?.('IncrementalSyncer stopped'); } + #handleResult( + lc: LogContext, + result: CommitResult | null, + statusPublisher: ReplicationStatusPublisher | undefined, + ) { + if (!result) { + return; + } + if (result.completedBackfill) { + // Publish the final status + const status = result.completedBackfill; + statusPublisher?.publish( + lc, + 'Replicating', + `Backfilled ${status.table} table`, + 0, + () => ({downloadStatus: [status]}), + ); + } else if (result.schemaUpdated) { + statusPublisher?.publish(lc, 'Replicating', 'Schema updated'); + } + if (result.watermark && result.changeLogUpdated) { + void this.#notifier.notifySubscribers({state: 'version-ready'}); + } + } + subscribe(): Source { return this.#notifier.subscribe(); } diff --git a/packages/zero-cache/src/services/replicator/replicator.ts b/packages/zero-cache/src/services/replicator/replicator.ts index 10bebeb8a3..56ba8ff6f6 100644 --- a/packages/zero-cache/src/services/replicator/replicator.ts +++ b/packages/zero-cache/src/services/replicator/replicator.ts @@ -1,11 +1,11 @@ import type {LogContext} from '@rocicorp/logger'; import type {ReadonlyJSONObject} from '../../../../shared/src/json.ts'; -import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; import type {Database} from '../../../../zqlite/src/db.ts'; import type {Source} from '../../types/streams.ts'; import type {ChangeStreamer} from '../change-streamer/change-streamer.ts'; import type {Service} from '../service.ts'; import {IncrementalSyncer} from './incremental-sync.ts'; +import type {WriteWorkerClient} from './write-worker-client.ts'; /** See {@link ReplicaStateNotifier.subscribe()}. */ export type ReplicaState = { @@ -56,6 +56,8 @@ export class ReplicatorService implements Replicator, Service { readonly id: string; readonly #lc: LogContext; readonly #incrementalSyncer: IncrementalSyncer; + readonly #worker: WriteWorkerClient; + #runPromise: Promise | undefined; constructor( lc: LogContext, @@ -63,19 +65,22 @@ export class ReplicatorService implements Replicator, Service { id: string, mode: ReplicatorMode, changeStreamer: ChangeStreamer, - replica: Database, + statusDb: Database, + worker: WriteWorkerClient, publishReplicationStatus: boolean, ) { this.id = id; this.#lc = lc .withContext('component', 'replicator') .withContext('serviceID', this.id); + this.#worker = worker; this.#incrementalSyncer = new IncrementalSyncer( taskID, `${taskID}/${id}`, changeStreamer, - replica, + statusDb, + worker, mode, publishReplicationStatus, ); @@ -86,15 +91,20 @@ export class ReplicatorService implements Replicator, Service { } run() { - return this.#incrementalSyncer.run(this.#lc); + this.#runPromise = this.#incrementalSyncer.run(this.#lc); + return this.#runPromise; } subscribe(): Source { return this.#incrementalSyncer.subscribe(); } - stop() { + async stop() { this.#incrementalSyncer.stop(this.#lc); - return promiseVoid; + // Wait for the syncer's run loop to finish so that any in-flight + // worker.processMessage() call completes and clears #pending + // before we send the 'stop' message to the worker. + await this.#runPromise; + await this.#worker.stop(); } } diff --git a/packages/zero-cache/src/services/replicator/write-worker-client.ts b/packages/zero-cache/src/services/replicator/write-worker-client.ts new file mode 100644 index 0000000000..94f1544072 --- /dev/null +++ b/packages/zero-cache/src/services/replicator/write-worker-client.ts @@ -0,0 +1,163 @@ +import {assert} from '../../../../shared/src/asserts.ts'; +import {resolver, type Resolver} from '@rocicorp/resolver'; +import {Worker} from 'node:worker_threads'; +import type {Database} from '../../../../zqlite/src/db.ts'; +import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; +import type {LogConfig} from '../../../../shared/src/logging.ts'; +import type {ChangeProcessorMode, CommitResult} from './change-processor.ts'; +import type {SubscriptionState} from './schema/replication-state.ts'; + +export type PragmaConfig = { + busyTimeout: number; + analysisLimit: number; + walAutocheckpoint?: number | undefined; +}; + +type ErrorHandler = (err: Error) => void; + +/** + * Interface for a write worker that processes replication messages. + */ +export interface WriteWorkerClient { + getSubscriptionState(): Promise; + processMessage(downstream: ChangeStreamData): Promise; + abort(): void; + stop(): Promise; + onError(handler: ErrorHandler): void; +} + +// Wire protocol types — errors are passed directly via structured clone +export type ArgsMap = { + init: [string, ChangeProcessorMode, PragmaConfig, LogConfig]; + getSubscriptionState: []; + processMessage: [ChangeStreamData]; + abort: []; + stop: []; +}; + +export type Method = keyof ArgsMap; + +export type Request = {method: M; args: ArgsMap[M]}; + +export type ResultMap = { + init: void; + getSubscriptionState: SubscriptionState; + processMessage: CommitResult | null; + abort: void; + stop: void; +}; + +export type Response = + | {method: M; result: ResultMap[M]; error?: undefined} + | {method: M; error: unknown; result?: undefined}; + +export type WriteError = {writeError: Error}; + +export function applyPragmas(db: Database, pragmas: PragmaConfig) { + db.pragma(`busy_timeout = ${pragmas.busyTimeout}`); + db.pragma(`analysis_limit = ${pragmas.analysisLimit}`); + if (pragmas.walAutocheckpoint !== undefined) { + db.pragma(`wal_autocheckpoint = ${pragmas.walAutocheckpoint}`); + } +} + +/** + * Delegates SQLite writes to a worker_thread, + * keeping the main event loop free for WebSocket heartbeats and IPC. + */ +export class ThreadWriteWorkerClient implements WriteWorkerClient { + readonly #worker: Worker; + #pending: Resolver | null = null; + #errorHandler: ErrorHandler = () => {}; + #terminated = false; + + constructor(workerUrl: URL) { + this.#worker = new Worker(workerUrl); + + this.#worker.on('message', (msg: Response | WriteError) => { + if ('writeError' in msg) { + const error = + msg.writeError instanceof Error + ? msg.writeError + : new Error(String(msg.writeError)); + this.#rejectAll(error); + this.#errorHandler(error); + return; + } + const r = this.#pending; + if (!r) return; // stale abort response + this.#pending = null; + if (msg.error !== undefined) { + r.reject( + msg.error instanceof Error ? msg.error : new Error(String(msg.error)), + ); + } else { + r.resolve(msg.result); + } + }); + + this.#worker.on('error', (err: Error) => { + this.#rejectAll(err); + this.#errorHandler(err); + }); + + this.#worker.on('exit', (code: number) => { + this.#terminated = true; + if (code !== 0) { + const err = new Error(`Worker exited with code ${code}`); + this.#rejectAll(err); + this.#errorHandler(err); + } + }); + } + + #rejectAll(err: Error) { + const r = this.#pending; + if (r) { + this.#pending = null; + r.reject(err); + } + } + + #call(method: M, args: ArgsMap[M]): Promise { + assert(this.#pending === null, `concurrent call: ${method}`); + const r = resolver(); + this.#pending = r as Resolver; + this.#worker.postMessage({method, args} satisfies Request); + return r.promise; + } + + init( + dbPath: string, + mode: ChangeProcessorMode, + pragmas: PragmaConfig, + logConfig: LogConfig, + ): Promise { + return this.#call('init', [dbPath, mode, pragmas, logConfig]); + } + + getSubscriptionState(): Promise { + return this.#call('getSubscriptionState', []); + } + + processMessage(downstream: ChangeStreamData): Promise { + return this.#call('processMessage', [downstream]); + } + + abort(): void { + if (!this.#terminated) { + this.#worker.postMessage({method: 'abort', args: []} satisfies Request); + } + } + + async stop(): Promise { + await this.#call('stop', []); + if (!this.#terminated) { + await this.#worker.terminate(); + } + } + + onError(handler: ErrorHandler): void { + this.#errorHandler = handler; + } +} diff --git a/packages/zero-cache/src/services/replicator/write-worker.test.ts b/packages/zero-cache/src/services/replicator/write-worker.test.ts new file mode 100644 index 0000000000..e162e8005e --- /dev/null +++ b/packages/zero-cache/src/services/replicator/write-worker.test.ts @@ -0,0 +1,183 @@ +import {afterEach, beforeEach, describe, expect, test} from 'vitest'; +import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; +import type {Database} from '../../../../zqlite/src/db.ts'; +import {DbFile, initDB} from '../../test/lite.ts'; +import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; +import {initReplicationState} from './schema/replication-state.ts'; +import {ReplicationMessages} from './test-utils.ts'; +import {ThreadWriteWorkerClient} from './write-worker-client.ts'; + +describe('write-worker', () => { + let dbFile: DbFile; + let mainDb: Database; + let worker: ThreadWriteWorkerClient; + + beforeEach(async () => { + const lc = createSilentLogContext(); + dbFile = new DbFile('write-worker-test'); + mainDb = dbFile.connect(lc); + mainDb.pragma('journal_mode = wal'); + + initReplicationState(mainDb, ['zero_data'], '02'); + initDB( + mainDb, + ` + CREATE TABLE issues( + issueID INTEGER, + bool BOOL, + _0_version TEXT, + PRIMARY KEY(issueID, bool) + ); + `, + ); + + worker = new ThreadWriteWorkerClient( + new URL('./write-worker.ts', import.meta.url), + ); + await worker.init( + dbFile.path, + 'serving', + { + busyTimeout: 30000, + analysisLimit: 1000, + }, + {level: 'error', format: 'text'}, + ); + }); + + afterEach(async () => { + await worker.stop(); + mainDb.close(); + dbFile.delete(); + }); + + test('getSubscriptionState returns correct state', async () => { + const state = await worker.getSubscriptionState(); + expect(state).toEqual({ + replicaVersion: '02', + publications: ['zero_data'], + watermark: '02', + }); + }); + + test('processMessage handles a full transaction', async () => { + const issues = new ReplicationMessages({issues: ['issueID', 'bool']}); + + const messages: ChangeStreamData[] = [ + ['begin', issues.begin(), {commitWatermark: '06'}], + ['data', issues.insert('issues', {issueID: 123, bool: true})], + ['data', issues.insert('issues', {issueID: 456, bool: false})], + ['commit', issues.commit(), {watermark: '06'}], + ]; + + let commitResult = null; + for (let i = 0; i < messages.length; i++) { + const result = await worker.processMessage(messages[i]); + if (result) { + commitResult = result; + } + } + + expect(commitResult).toEqual({ + watermark: '06', + completedBackfill: undefined, + schemaUpdated: false, + changeLogUpdated: true, + }); + + // Verify the data is in the database by reading with main thread connection. + const rows = mainDb + .prepare('SELECT issueID, bool, _0_version FROM issues ORDER BY issueID') + .all(); + expect(rows).toEqual([ + {issueID: 123, bool: 1, _0_version: '06'}, + {issueID: 456, bool: 0, _0_version: '06'}, + ]); + + // Verify watermark was updated. + const state = await worker.getSubscriptionState(); + expect(state.watermark).toBe('06'); + }); + + test('abort rolls back pending transaction', async () => { + const issues = new ReplicationMessages({issues: ['issueID', 'bool']}); + + // Start a transaction but don't commit + await worker.processMessage([ + 'begin', + issues.begin(), + {commitWatermark: '06'}, + ]); + await worker.processMessage([ + 'data', + issues.insert('issues', {issueID: 123, bool: true}), + ]); + + // Abort should roll back + worker.abort(); + + // Verify nothing was written + const rows = mainDb.prepare('SELECT * FROM issues').all(); + expect(rows).toEqual([]); + + // Should be able to process a new transaction after abort + const messages: ChangeStreamData[] = [ + ['begin', issues.begin(), {commitWatermark: '07'}], + ['data', issues.insert('issues', {issueID: 789, bool: false})], + ['commit', issues.commit(), {watermark: '07'}], + ]; + + for (let i = 0; i < messages.length; i++) { + await worker.processMessage(messages[i]); + } + + const rowsAfter = mainDb.prepare('SELECT issueID FROM issues').all(); + expect(rowsAfter).toEqual([{issueID: 789}]); + }); + + test('stop shuts down cleanly', async () => { + await worker.stop(); + // Create a new worker for afterEach cleanup + worker = new ThreadWriteWorkerClient( + new URL('./write-worker.ts', import.meta.url), + ); + await worker.init( + dbFile.path, + 'serving', + { + busyTimeout: 30000, + analysisLimit: 1000, + }, + {level: 'error', format: 'text'}, + ); + }); + + // This test verifies the ChangeProcessor's internal error path: + // ChangeProcessor catches the error via #fail, which posts a {writeError} + // message (rejecting the pending promise AND calling the errorHandler), + // rather than the error propagating through the worker's generic try/catch. + test('error handling: fail message on worker error', async () => { + let errorReceived: Error | undefined; + worker.onError(err => { + errorReceived = err; + }); + + // Send a processMessage without a begin - should cause a failure + await expect( + worker.processMessage([ + 'data', + { + tag: 'insert', + relation: { + schema: 'public', + name: 'nonexistent', + rowKey: {columns: ['id'], type: 'default'}, + }, + new: {id: [1, 'int4']}, + }, + ]), + ).rejects.toThrow(); + + expect(errorReceived).toBeDefined(); + }); +}); diff --git a/packages/zero-cache/src/services/replicator/write-worker.ts b/packages/zero-cache/src/services/replicator/write-worker.ts new file mode 100644 index 0000000000..e47c05cf3b --- /dev/null +++ b/packages/zero-cache/src/services/replicator/write-worker.ts @@ -0,0 +1,100 @@ +import type {LogContext} from '@rocicorp/logger'; +import {must} from '../../../../shared/src/must.ts'; +import type {LogConfig} from '../../../../shared/src/logging.ts'; +import {createLogContext} from '../../server/logging.ts'; +import {Database} from '../../../../zqlite/src/db.ts'; +import {StatementRunner} from '../../db/statements.ts'; +import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; +import {ChangeProcessor, type ChangeProcessorMode} from './change-processor.ts'; +import {getSubscriptionState} from './schema/replication-state.ts'; +import { + applyPragmas, + type ArgsMap, + type Method, + type PragmaConfig, + type ResultMap, + type WriteError, + type Request, + type Response, +} from './write-worker-client.ts'; + +import {parentPort} from 'node:worker_threads'; + +if (!parentPort) { + throw new Error('write-worker must be run as a worker thread'); +} + +const port = parentPort; + +type API = {[M in Method]: (...args: ArgsMap[M]) => ResultMap[M]}; + +function createAPI(): API { + let db: Database | undefined; + let runner: StatementRunner | undefined; + let processor: ChangeProcessor | undefined; + let mode: ChangeProcessorMode | undefined; + let lc: LogContext | undefined; + + function createProcessor() { + processor = new ChangeProcessor(must(runner), must(mode), (_lc, err) => { + port.postMessage({ + writeError: err instanceof Error ? err : new Error(String(err)), + } satisfies WriteError); + }); + } + + return { + init( + dbPath: string, + cpMode: ChangeProcessorMode, + pragmas: PragmaConfig, + logConfig: LogConfig, + ) { + lc = createLogContext({log: logConfig}, {worker: 'write-worker'}); + db = new Database(lc, dbPath); + applyPragmas(db, pragmas); + runner = new StatementRunner(db); + mode = cpMode; + createProcessor(); + }, + + getSubscriptionState() { + return getSubscriptionState(must(runner)); + }, + + processMessage(downstream: ChangeStreamData) { + return must(processor).processMessage(must(lc), downstream); + }, + + abort() { + must(processor).abort(must(lc)); + createProcessor(); + }, + + stop() { + db?.close(); + db = undefined; + runner = undefined; + processor = undefined; + }, + }; +} + +const api = createAPI(); + +port.on('message', (msg: Request) => { + try { + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TS can't narrow msg.method + msg.args together + const result = (api[msg.method] as (...args: any[]) => unknown)( + ...msg.args, + ); + // abort is fire-and-forget — no pending slot on the client side. + if (msg.method !== 'abort') { + port.postMessage({method: msg.method, result} as Response); + } + } catch (e) { + if (msg.method !== 'abort') { + port.postMessage({method: msg.method, error: e} as Response); + } + } +}); diff --git a/packages/zero-cache/src/workers/replicator.ts b/packages/zero-cache/src/workers/replicator.ts index a8fe0536c4..9e0f14763c 100644 --- a/packages/zero-cache/src/workers/replicator.ts +++ b/packages/zero-cache/src/workers/replicator.ts @@ -10,6 +10,10 @@ import type { ReplicaStateNotifier, Replicator, } from '../services/replicator/replicator.ts'; +import { + applyPragmas, + type PragmaConfig, +} from '../services/replicator/write-worker-client.ts'; import { getAscendingEvents, recordEvent, @@ -84,20 +88,27 @@ async function connect( lc.info?.(`setting ${file} to ${walMode} mode`); replica.pragma(`journal_mode = ${walMode}`); - // The duration of the loop in which the replicator attempts - // to begin a transaction while litestream is performing a - // checkpoint. - replica.pragma('busy_timeout = 30000'); + const pragmas = getPragmaConfig(mode); + applyPragmas(replica, pragmas); replica.pragma('optimize = 0x10002'); - // Cap the running time of `PRAGMA optimize` calls that happen - // after replicating schema changes. 1000 is the limit recommended - // in https://sqlite.org/lang_analyze.html#approx - replica.pragma('analysis_limit = 1000'); lc.info?.(`optimized ${file}`); return replica; } +/** + * Returns the PragmaConfig for a given replica file mode. + * This is used by both the main thread (setupReplica) and + * the write worker thread to apply the same pragma settings. + */ +export function getPragmaConfig(mode: ReplicaFileMode): PragmaConfig { + return { + busyTimeout: 30000, + analysisLimit: 1000, + walAutocheckpoint: mode === 'backup' ? 0 : undefined, + }; +} + export async function setupReplica( lc: LogContext, mode: ReplicaFileMode, @@ -106,12 +117,8 @@ export async function setupReplica( lc.info?.(`setting up ${mode} replica`); switch (mode) { - case 'backup': { - const replica = await connect(lc, replicaOptions, 'wal', mode); - // https://litestream.io/tips/#disable-autocheckpoints-for-high-write-load-servers - replica.pragma('wal_autocheckpoint = 0'); - return replica; - } + case 'backup': + return await connect(lc, replicaOptions, 'wal', mode); case 'serving-copy': { // In 'serving-copy' mode, the original file is being used for 'backup' From 9c3c32e2f05698ded490525b4ea22a9733dc6256 Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Tue, 17 Mar 2026 18:11:37 -0700 Subject: [PATCH 149/495] fix(z2s): remove COLLATE "ucs_basic" to enable index usage (#5663) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit z2s was unconditionally adding COLLATE "ucs_basic" to ORDER BY and WHERE clauses, and casting uuid/enum columns in order to ensure order and comparison consistency between zql and z2s results. This prevented PostgreSQL from using indexes on those columns, causing full table scans. Changes: - Remove COLLATE "ucs_basic" from all ORDER BY and WHERE clauses - Remove ::text cast for uuid/enum columns; compare using native types - uuid parameters now cast to ::uuid, enum parameters cast to their enum type Tradeoff: z2s server-side ordering for text/enum/uuid columns may differ from zql client-side ordering. This means optimistic client-side mutation results could differ from authoritative server-side mutation results. This is accepted — aligning collation across JS, SQLite, and customer PostgreSQL databases while maintaining index usage is not feasible today. The optimistic→authoritative flash for edge cases where ordering differs is a better tradeoff than full table scans on common query cases. --- packages/z2s/src/compiler.output.test.ts | 68 ++++++------- packages/z2s/src/compiler.ts | 37 ++----- packages/z2s/src/sql.test.ts | 98 +++++++++---------- packages/z2s/src/sql.ts | 19 ++-- packages/zero-server/src/custom.ts | 9 +- .../src/collate.pg.test.ts | 34 +++++-- 6 files changed, 124 insertions(+), 141 deletions(-) diff --git a/packages/z2s/src/compiler.output.test.ts b/packages/z2s/src/compiler.output.test.ts index 2590824623..781f728e79 100644 --- a/packages/z2s/src/compiler.output.test.ts +++ b/packages/z2s/src/compiler.output.test.ts @@ -219,7 +219,7 @@ test('select from different schema', () => { FROM "alternate_schema"."user" AS "alternate_user_0" - ORDER BY "alternate_user_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "alternate_user_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [], } @@ -256,7 +256,7 @@ test('orderBy', () => { ), ).toMatchInlineSnapshot(` { - "text": "ORDER BY "user"."name" COLLATE "ucs_basic" ASC NULLS FIRST, "user"."age" DESC NULLS LAST", + "text": "ORDER BY "user"."name" ASC NULLS FIRST, "user"."age" DESC NULLS LAST", "values": [], } `); @@ -277,7 +277,7 @@ test('orderBy', () => { ), ).toMatchInlineSnapshot(` { - "text": "ORDER BY "user"."name" COLLATE "ucs_basic" ASC NULLS FIRST, "user"."age" DESC NULLS LAST, "user"."id" COLLATE "ucs_basic" ASC NULLS FIRST", + "text": "ORDER BY "user"."name" ASC NULLS FIRST, "user"."age" DESC NULLS LAST, "user"."id" ASC NULLS FIRST", "values": [], } `); @@ -316,9 +316,9 @@ test('compile with enum', () => { COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" FROM (SELECT "enumTable_0"."id" as "id","enumTable_0"."status" as "status","enumTable_0"."statusArray" as "statusArray" FROM "enumTable" AS "enumTable_0" - WHERE "enumTable_0"."status"::text = $1::text COLLATE "ucs_basic" + WHERE "enumTable_0"."status" = $1::text::"statusEnum" - ORDER BY "enumTable_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "enumTable_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [ "active", @@ -347,11 +347,11 @@ test('compile with enumArray', () => { COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" FROM (SELECT "enumTable_0"."id" as "id","enumTable_0"."status" as "status","enumTable_0"."statusArray" as "statusArray" FROM "enumTable" AS "enumTable_0" - WHERE "enumTable_0"."statusArray"::text = ARRAY( - SELECT value::text COLLATE "ucs_basic" FROM jsonb_array_elements_text($1::text::jsonb) + WHERE "enumTable_0"."statusArray" = ARRAY( + SELECT value::text::"statusEnum" FROM jsonb_array_elements_text($1::text::jsonb) ) - ORDER BY "enumTable_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "enumTable_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [ "["active"]", @@ -382,7 +382,7 @@ test('compile with timestamp (with timezone)', () => { FROM "timestampsTable" AS "timestampsTable_0" WHERE "timestampsTable_0"."timestampWithTz" = to_timestamp($1::text::bigint / 1000.0) - ORDER BY "timestampsTable_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "timestampsTable_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [ ""abc"", @@ -415,7 +415,7 @@ test('compile with timestamp array (with timezone)', () => { SELECT to_timestamp(value::text::bigint / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) ) - ORDER BY "timestampsTable_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "timestampsTable_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [ ""abc"", @@ -446,7 +446,7 @@ test('compile with timestamp (without timezone)', () => { FROM "timestampsTable" AS "timestampsTable_0" WHERE "timestampsTable_0"."timestampWithoutTz" = to_timestamp($1::text::bigint / 1000.0) AT TIME ZONE 'UTC' - ORDER BY "timestampsTable_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "timestampsTable_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [ ""abc"", @@ -479,7 +479,7 @@ test('compile with timestamp (without timezone) array', () => { SELECT to_timestamp(value::text::bigint / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) ) - ORDER BY "timestampsTable_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "timestampsTable_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [ ""abc"", @@ -510,7 +510,7 @@ test('any', () => { "text": "( "user"."name" = ANY (ARRAY( - SELECT value::text COLLATE "ucs_basic" FROM jsonb_array_elements_text($1::text::jsonb) + SELECT value::text FROM jsonb_array_elements_text($1::text::jsonb) )) )", "values": [ @@ -541,7 +541,7 @@ test('any', () => { ( "user"."name" = ANY (ARRAY( - SELECT value::text COLLATE "ucs_basic" FROM jsonb_array_elements_text($1::text::jsonb) + SELECT value::text FROM jsonb_array_elements_text($1::text::jsonb) )) )", "values": [ @@ -622,7 +622,7 @@ test('distinctFrom', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" IS NOT DISTINCT FROM $1::text COLLATE "ucs_basic"", + "text": ""user"."name" IS NOT DISTINCT FROM $1::text", "values": [ null, ], @@ -647,7 +647,7 @@ test('distinctFrom', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" IS DISTINCT FROM $1::text COLLATE "ucs_basic"", + "text": ""user"."name" IS DISTINCT FROM $1::text", "values": [ null, ], @@ -782,7 +782,7 @@ test('simple', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" = $1::text COLLATE "ucs_basic"", + "text": ""user"."name" = $1::text", "values": [ "test", ], @@ -807,7 +807,7 @@ test('simple', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" != $1::text COLLATE "ucs_basic"", + "text": ""user"."name" != $1::text", "values": [ "test", ], @@ -932,7 +932,7 @@ test('simple', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" LIKE $1::text COLLATE "ucs_basic"", + "text": ""user"."name" LIKE $1::text", "values": [ "%test%", ], @@ -957,7 +957,7 @@ test('simple', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" NOT LIKE $1::text COLLATE "ucs_basic"", + "text": ""user"."name" NOT LIKE $1::text", "values": [ "%test%", ], @@ -982,7 +982,7 @@ test('simple', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" ILIKE $1::text COLLATE "ucs_basic"", + "text": ""user"."name" ILIKE $1::text", "values": [ "%test%", ], @@ -1007,7 +1007,7 @@ test('simple', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" NOT ILIKE $1::text COLLATE "ucs_basic"", + "text": ""user"."name" NOT ILIKE $1::text", "values": [ "%test%", ], @@ -1035,7 +1035,7 @@ test('simple', () => { "text": "( "user"."id" = ANY (ARRAY( - SELECT value::text COLLATE "ucs_basic" FROM jsonb_array_elements_text($1::text::jsonb) + SELECT value::text FROM jsonb_array_elements_text($1::text::jsonb) )) )", "values": [ @@ -1066,7 +1066,7 @@ test('simple', () => { ( "user"."id" = ANY (ARRAY( - SELECT value::text COLLATE "ucs_basic" FROM jsonb_array_elements_text($1::text::jsonb) + SELECT value::text FROM jsonb_array_elements_text($1::text::jsonb) )) )", "values": [ @@ -1093,7 +1093,7 @@ test('simple', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" IS NOT DISTINCT FROM $1::text COLLATE "ucs_basic"", + "text": ""user"."name" IS NOT DISTINCT FROM $1::text", "values": [ null, ], @@ -1118,7 +1118,7 @@ test('simple', () => { ), ).toMatchInlineSnapshot(` { - "text": ""user"."name" IS DISTINCT FROM $1::text COLLATE "ucs_basic"", + "text": ""user"."name" IS DISTINCT FROM $1::text", "values": [ null, ], @@ -1257,12 +1257,12 @@ test('related thru junction edge', () => { "text": "SELECT COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" FROM (SELECT ( - SELECT COALESCE(json_agg(row_to_json("inner_labels")), '[]'::json) FROM (SELECT "label_2"."id" as "id","label_2"."name" as "name" FROM "issue_label" AS "issueLabel_1" JOIN "label" AS "label_2" ON "issueLabel_1"."label_id" = "label_2"."id" WHERE ("issue_0"."id" = "issueLabel_1"."issue_id") ORDER BY "label_2"."id" COLLATE "ucs_basic" ASC NULLS FIRST ) "inner_labels" + SELECT COALESCE(json_agg(row_to_json("inner_labels")), '[]'::json) FROM (SELECT "label_2"."id" as "id","label_2"."name" as "name" FROM "issue_label" AS "issueLabel_1" JOIN "label" AS "label_2" ON "issueLabel_1"."label_id" = "label_2"."id" WHERE ("issue_0"."id" = "issueLabel_1"."issue_id") ORDER BY "label_2"."id" ASC NULLS FIRST ) "inner_labels" ) as "labels","issue_0"."id" as "id","issue_0"."title" as "title","issue_0"."description" as "description","issue_0"."closed" as "closed","issue_0"."ownerId" as "ownerId",EXTRACT(EPOCH FROM "issue_0"."created") * 1000 as "created" FROM "issue" AS "issue_0" - ORDER BY "issue_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "issue_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [], } @@ -1297,13 +1297,13 @@ test('related w/o junction edge', () => { FROM "user" AS "user_1" WHERE "issue_0"."ownerId" = "user_1"."id" - ORDER BY "user_1"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "user_1"."id" ASC NULLS FIRST ) "inner_owner" ) as "owner","issue_0"."id" as "id","issue_0"."title" as "title","issue_0"."description" as "description","issue_0"."closed" as "closed","issue_0"."ownerId" as "ownerId",EXTRACT(EPOCH FROM "issue_0"."created") * 1000 as "created" FROM "issue" AS "issue_0" - ORDER BY "issue_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "issue_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [], } @@ -1345,9 +1345,9 @@ test('scalar subquery with EXISTS generates = operator', () => { COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" FROM (SELECT "issue_0"."id" as "id","issue_0"."title" as "title","issue_0"."description" as "description","issue_0"."closed" as "closed","issue_0"."ownerId" as "ownerId",EXTRACT(EPOCH FROM "issue_0"."created") * 1000 as "created" FROM "issue" AS "issue_0" - WHERE "issue_0"."ownerId" = (SELECT "user_1"."id" FROM "user" AS "user_1" WHERE "user_1"."name" = $1::text COLLATE "ucs_basic" ORDER BY "user_1"."id" COLLATE "ucs_basic" ASC NULLS FIRST LIMIT 1) + WHERE "issue_0"."ownerId" = (SELECT "user_1"."id" FROM "user" AS "user_1" WHERE "user_1"."name" = $1::text ORDER BY "user_1"."id" ASC NULLS FIRST LIMIT 1) - ORDER BY "issue_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "issue_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [ "Alice", @@ -1391,9 +1391,9 @@ test('scalar subquery with NOT EXISTS generates IS NOT operator', () => { COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" FROM (SELECT "issue_0"."id" as "id","issue_0"."title" as "title","issue_0"."description" as "description","issue_0"."closed" as "closed","issue_0"."ownerId" as "ownerId",EXTRACT(EPOCH FROM "issue_0"."created") * 1000 as "created" FROM "issue" AS "issue_0" - WHERE "issue_0"."ownerId" IS NOT (SELECT "user_1"."id" FROM "user" AS "user_1" WHERE "user_1"."name" = $1::text COLLATE "ucs_basic" ORDER BY "user_1"."id" COLLATE "ucs_basic" ASC NULLS FIRST LIMIT 1) + WHERE "issue_0"."ownerId" IS NOT (SELECT "user_1"."id" FROM "user" AS "user_1" WHERE "user_1"."name" = $1::text ORDER BY "user_1"."id" ASC NULLS FIRST LIMIT 1) - ORDER BY "issue_0"."id" COLLATE "ucs_basic" ASC NULLS FIRST + ORDER BY "issue_0"."id" ASC NULLS FIRST ) "zql_root"", "values": [ "Alice", diff --git a/packages/z2s/src/compiler.ts b/packages/z2s/src/compiler.ts index d33cd44987..0f4887e26d 100644 --- a/packages/z2s/src/compiler.ts +++ b/packages/z2s/src/compiler.ts @@ -8,7 +8,6 @@ import { import {hasOwn} from '../../shared/src/has-own.ts'; import {type JSONValue} from '../../shared/src/json.ts'; import {must} from '../../shared/src/must.ts'; -import {pgToZqlStringTypeMap} from '../../zero-cache/src/types/pg-data-type.ts'; import type { AST, Condition, @@ -25,10 +24,7 @@ import { type NameMapper, } from '../../zero-schema/src/name-mapper.ts'; import type {Schema} from '../../zero-types/src/schema.ts'; -import type { - ServerColumnSchema, - ServerSchema, -} from '../../zero-types/src/server-schema.ts'; +import type {ServerSchema} from '../../zero-types/src/server-schema.ts'; import type {Format} from '../../zql/src/ivm/view.ts'; import {completeOrdering} from '../../zql/src/query/complete-ordering.ts'; import { @@ -36,7 +32,6 @@ import { sqlConvertColumnArg, sqlConvertPluralLiteralArg, sqlConvertSingularLiteralArg, - Z2S_COLLATION, type PluralLiteralType, } from './sql.ts'; @@ -166,35 +161,23 @@ export function orderBy( return sql``; } return sql`ORDER BY ${sql.join( - orderBy.map(([col, dir]) => { - const serverColumnSchema = getServerColumn(spec.server, table, col); - return dir === 'asc' + orderBy.map(([col, dir]) => + dir === 'asc' ? // Oh postgres. The table must be referred to by client name but the column by server name. // E.g., `SELECT server_col as client_col FROM server_table as client_table ORDER BY client_Table.server_col` sql`${colIdent(spec.server, { table, zql: col, - })}${maybeCollate(serverColumnSchema)} ASC NULLS FIRST` + })} ASC NULLS FIRST` : sql`${colIdent(spec.server, { table, zql: col, - })}${maybeCollate(serverColumnSchema)} DESC NULLS LAST`; - }), + })} DESC NULLS LAST`, + ), ', ', )}`; } -function maybeCollate(serverColumnSchema: ServerColumnSchema): SQLQuery { - if (serverColumnSchema.type === 'uuid' || serverColumnSchema.isEnum) { - return sql`::text COLLATE ${sql.ident(Z2S_COLLATION)}`; - } - if (Object.hasOwn(pgToZqlStringTypeMap, serverColumnSchema.type)) { - return sql` COLLATE ${sql.ident(Z2S_COLLATION)}`; - } - - return sql``; -} - function related( spec: Spec, relationships: readonly CorrelatedSubquery[], @@ -474,18 +457,10 @@ function valueComparison( const valuePosType = valuePos.type; switch (valuePosType) { case 'column': { - const serverColumnSchema = getServerColumn( - spec.server, - table, - valuePos.name, - ); const qualified: QualifiedColumn = { table, zql: valuePos.name, }; - if (serverColumnSchema.type === 'uuid' || serverColumnSchema.isEnum) { - return sql`${colIdent(spec.server, qualified)}::text`; - } return colIdent(spec.server, qualified); } case 'literal': diff --git a/packages/z2s/src/sql.test.ts b/packages/z2s/src/sql.test.ts index 522982c3bc..0b447ba829 100644 --- a/packages/z2s/src/sql.test.ts +++ b/packages/z2s/src/sql.test.ts @@ -162,13 +162,13 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "str" = $1::text COLLATE "ucs_basic"", - "values": [ - "str", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "str" = $1::text", + "values": [ + "str", + ], + } + `); }); test('boolean type', () => { @@ -210,13 +210,13 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "uuid"::text = $1::text COLLATE "ucs_basic"", - "values": [ - "8f1dceb2-b3dd-46cf-9deb-460e9d87541c", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "uuid"::text = $1::text::uuid", + "values": [ + "8f1dceb2-b3dd-46cf-9deb-460e9d87541c", + ], + } + `); }); test('enum type', () => { @@ -234,13 +234,13 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "enum"::text = $1::text COLLATE "ucs_basic"", - "values": [ - "ENUM_KEY", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "enum"::text = $1::text::"some_enum"", + "values": [ + "ENUM_KEY", + ], + } + `); }); test('timestamp type', () => { @@ -358,15 +358,15 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "str" = ARRAY( - SELECT value::text COLLATE "ucs_basic" FROM jsonb_array_elements_text($1::text::jsonb) - )", - "values": [ - "["a","b","c"]", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "str" = ARRAY( + SELECT value::text FROM jsonb_array_elements_text($1::text::jsonb) + )", + "values": [ + "["a","b","c"]", + ], + } + `); }); test('boolean[] type', () => { @@ -413,15 +413,15 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "uuid"::text = ARRAY( - SELECT value::text COLLATE "ucs_basic" FROM jsonb_array_elements_text($1::text::jsonb) - )", - "values": [ - "["8f1dceb2-b3dd-46cf-9deb-460e9d87541c","11111111-1111-1111-1111-111111111111"]", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "uuid"::text = ARRAY( + SELECT value::text::uuid FROM jsonb_array_elements_text($1::text::jsonb) + )", + "values": [ + "["8f1dceb2-b3dd-46cf-9deb-460e9d87541c","11111111-1111-1111-1111-111111111111"]", + ], + } + `); }); test('enum[] type', () => { @@ -439,15 +439,15 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "enum"::text = ARRAY( - SELECT value::text COLLATE "ucs_basic" FROM jsonb_array_elements_text($1::text::jsonb) - )", - "values": [ - "["ENUM_KEY","OTHER_KEY"]", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "enum"::text = ARRAY( + SELECT value::text::"some_enum" FROM jsonb_array_elements_text($1::text::jsonb) + )", + "values": [ + "["ENUM_KEY","OTHER_KEY"]", + ], + } + `); }); test('timestamp[] type', () => { @@ -514,7 +514,7 @@ describe('string arg packing', () => { ), ).toMatchInlineSnapshot(` { - "text": "SELECT * FROM "foo" WHERE $1::text::double precision AND $2::text::double precision AND $3::text::text COLLATE "ucs_basic" AND $4::text::boolean AND $5", + "text": "SELECT * FROM "foo" WHERE $1::text::double precision AND $2::text::double precision AND $3::text::text AND $4::text::boolean AND $5", "values": [ "1", "1.1", diff --git a/packages/z2s/src/sql.ts b/packages/z2s/src/sql.ts index df5ff43c2b..660b5193d4 100644 --- a/packages/z2s/src/sql.ts +++ b/packages/z2s/src/sql.ts @@ -12,8 +12,6 @@ import { import type {LiteralValue} from '../../zero-protocol/src/ast.ts'; import type {ServerColumnSchema} from '../../zero-types/src/server-schema.ts'; -export const Z2S_COLLATION = 'ucs_basic'; - export function formatPg(sql: SQLQuery) { const format = new ReusingFormat(escapePostgresIdentifier); return sql.format((items: readonly SQLItem[]) => formatFn(items, format)); @@ -175,13 +173,12 @@ function createPlaceholder(index: number, arg: SqlConvertArg) { } if (arg[sqlConvert] === 'literal') { - const collate = arg.type === 'string' ? ` COLLATE "${Z2S_COLLATION}"` : ''; const {value} = arg; if (Array.isArray(value)) { const elType = pgTypeForLiteralType(arg.type); - return formatPlural(index, `value::${elType}${collate}`); + return formatPlural(index, `value::${elType}`); } - return `$${index}::text::${pgTypeForLiteralType(arg.type)}${collate}`; + return `$${index}::text::${pgTypeForLiteralType(arg.type)}`; } const common = formatCommonToSingularAndPlural(index, arg); @@ -207,16 +204,12 @@ function formatCommonToSingularAndPlural( case 'timestamptz': case 'timestamp with time zone': return `to_timestamp(${valuePlaceholder}::text::bigint / 1000.0)`; - // uuid doesn't support collation, so we compare as text + // uuid: cast to native uuid type for proper comparison and index usage case 'uuid': - return arg.isComparison - ? `${valuePlaceholder}::text COLLATE "${Z2S_COLLATION}"` - : `${valuePlaceholder}::text::uuid`; + return `${valuePlaceholder}::text::uuid`; } if (arg.isEnum) { - return arg.isComparison - ? `${valuePlaceholder}::text COLLATE "${Z2S_COLLATION}"` - : `${valuePlaceholder}::text::"${arg.type}"`; + return `${valuePlaceholder}::text::"${arg.type}"`; } if (isPgStringType(arg.type)) { // For comparison cast to the general `text` type, not the @@ -224,7 +217,7 @@ function formatCommonToSingularAndPlural( // force the value being compared to the size/max-size of the column // type before comparison. return arg.isComparison - ? `${valuePlaceholder}::text COLLATE "${Z2S_COLLATION}"` + ? `${valuePlaceholder}::text` : `${valuePlaceholder}::text::${arg.type}`; } if (isPgNumberType(arg.type)) { diff --git a/packages/zero-server/src/custom.ts b/packages/zero-server/src/custom.ts index 76aa736440..8508fdf257 100644 --- a/packages/zero-server/src/custom.ts +++ b/packages/zero-server/src/custom.ts @@ -443,19 +443,12 @@ function primaryKeyClause( return sql`${sql.join( primaryKey.map( ([origName, serverName]) => - sql`${sql.ident(serverName)}${maybeCastColumn(serverTableSchema[serverName])} = ${sqlValue(row[origName], serverTableSchema[serverName])}`, + sql`${sql.ident(serverName)} = ${sqlValue(row[origName], serverTableSchema[serverName])}`, ), ' AND ', )}`; } -function maybeCastColumn(col: ServerColumnSchema) { - if (col.type === 'uuid' || col.isEnum) { - return sql`::text`; - } - return sql``; -} - function origAndServerNamesFor( originalNames: readonly string[], schema: TableSchema, diff --git a/packages/zql-integration-tests/src/collate.pg.test.ts b/packages/zql-integration-tests/src/collate.pg.test.ts index 97bc528fe4..b990c14a3c 100644 --- a/packages/zql-integration-tests/src/collate.pg.test.ts +++ b/packages/zql-integration-tests/src/collate.pg.test.ts @@ -1,3 +1,17 @@ +/** + * Collation consistency tests between z2s (PostgreSQL), zqlite (SQLite), and + * zql (in-memory). + * + * These tests are effectively relaxed: z2s no longer adds COLLATE "ucs_basic" + * to queries, so PostgreSQL uses its native (locale-aware) collation which may + * order text and enum columns differently than SQLite/zql byte ordering. + * + * The tests currently verify: + * - zql and zqlite produce identical ordering (both use byte-order comparison) + * - PostgreSQL returns the same *set* of rows (but possibly in different order) + * + * Kept in case we eventually align collations across all three environments. + */ import {Client} from 'pg'; import {afterAll, beforeAll, describe, expect, test} from 'vitest'; import {testLogConfig} from '../../otel/src/test-log-config.ts'; @@ -207,18 +221,28 @@ describe('collation behavior', () => { const memoryResult = await memoryQueryDelegate.run( memoryItemQuery.orderBy(col, 'asc'), ); - expect(zqlResult).toEqualPg(pgResult); - expect(memoryResult).toEqualPg(pgResult); + // ZQL (SQLite) and memory should produce the same ordering + // (both use byte-order comparison). + expect(zqlResult).toEqualPg(memoryResult); + // PG should return the same set of rows (order may differ + // due to locale-aware collation for text/enum columns). + expect(zqlResult).toEqual(expect.arrayContaining(pgResult as unknown[])); + expect(pgResult).toEqual(expect.arrayContaining(zqlResult as unknown[])); function makeQuery( query: Query<'item', Schema>, i: number, ): Query<'item', Schema> { return query - .where(col, '>', memoryResult[i].name) + .where(col, '>', memoryResult[i][col]) .limit(1) .orderBy(col, 'asc'); } + // Cursor-style tests: only compare ZQL vs memory. PG is excluded + // because its locale-aware collation (e.g. en_US.UTF-8) orders + // strings differently than ZQL/memory byte ordering, so + // WHERE col > 'x' ORDER BY col LIMIT 1 may return a different + // "next row" from PG than from ZQL/memory. for (let i = 0; i < memoryResult.length - 1; i++) { const memResult = await memoryQueryDelegate.run( makeQuery(memoryItemQuery, i), @@ -228,9 +252,7 @@ describe('collation behavior', () => { schema, 'item', ); - const pgResult = await runAsSQL(makeQuery(itemQuery, i), runPgQuery); - expect(zqlResult).toEqualPg(pgResult); - expect(memResult).toEqualPg(pgResult); + expect(zqlResult).toEqualPg(memResult); } return zqlResult; From a77f2a765140ec9febd2cb66f47c044628f2220d Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 18 Mar 2026 09:30:11 +0100 Subject: [PATCH 150/495] fix(zero-cache): Make sure we can load the write worker (#5662) We bundle zero-cache so we need to add an entry point for the write worker. --- packages/zero-cache/src/server/replicator.ts | 4 +--- packages/zero-cache/src/server/worker-urls.ts | 3 ++- packages/zero-cache/src/server/write-worker.ts | 1 + .../src/services/replicator/incremental-sync.test.ts | 4 +--- .../src/services/replicator/write-worker-client.ts | 9 +++++---- .../src/services/replicator/write-worker.test.ts | 8 ++------ .../src/services/replicator/write-worker.ts | 11 +++++------ 7 files changed, 17 insertions(+), 23 deletions(-) create mode 100644 packages/zero-cache/src/server/write-worker.ts diff --git a/packages/zero-cache/src/server/replicator.ts b/packages/zero-cache/src/server/replicator.ts index 2b93388c4d..073adc2fd4 100644 --- a/packages/zero-cache/src/server/replicator.ts +++ b/packages/zero-cache/src/server/replicator.ts @@ -44,9 +44,7 @@ export default async function runWorker( // Create the write worker for async SQLite writes. const dbPath = replica.name; const pragmas = getPragmaConfig(fileMode); - const workerClient = new ThreadWriteWorkerClient( - new URL('../services/replicator/write-worker.ts', import.meta.url), - ); + const workerClient = new ThreadWriteWorkerClient(); await workerClient.init(dbPath, mode, pragmas, config.log); const runningLocalChangeStreamer = diff --git a/packages/zero-cache/src/server/worker-urls.ts b/packages/zero-cache/src/server/worker-urls.ts index 2c8e0e76c4..cd8f1c7dd0 100644 --- a/packages/zero-cache/src/server/worker-urls.ts +++ b/packages/zero-cache/src/server/worker-urls.ts @@ -12,9 +12,10 @@ function resolve(path: string): URL { // These URLs are part of the build process. See ../../zero/tool/build.ts // All these urls must be relative to this file and be located in the same directory. +export const CHANGE_STREAMER_URL = resolve('./change-streamer.ts'); export const MAIN_URL = resolve('./main.ts'); export const MUTATOR_URL = resolve('./mutator.ts'); -export const CHANGE_STREAMER_URL = resolve('./change-streamer.ts'); export const REAPER_URL = resolve('./reaper.ts'); export const REPLICATOR_URL = resolve('./replicator.ts'); export const SYNCER_URL = resolve('./syncer.ts'); +export const WRITE_WORKER_URL = resolve('./write-worker.ts'); diff --git a/packages/zero-cache/src/server/write-worker.ts b/packages/zero-cache/src/server/write-worker.ts new file mode 100644 index 0000000000..c8e0aabbf4 --- /dev/null +++ b/packages/zero-cache/src/server/write-worker.ts @@ -0,0 +1 @@ +import '../services/replicator/write-worker.ts'; diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index 7977f632fc..774930186f 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -60,9 +60,7 @@ describe('replicator/incremental-sync', () => { new Date(Date.UTC(2025, 7, 14, 1, 2, 3)), ); subscribeFn = vi.fn(); - worker = new ThreadWriteWorkerClient( - new URL('./write-worker.ts', import.meta.url), - ); + worker = new ThreadWriteWorkerClient(); await worker.init( dbFile.path, 'serving', diff --git a/packages/zero-cache/src/services/replicator/write-worker-client.ts b/packages/zero-cache/src/services/replicator/write-worker-client.ts index 94f1544072..3da2347ccc 100644 --- a/packages/zero-cache/src/services/replicator/write-worker-client.ts +++ b/packages/zero-cache/src/services/replicator/write-worker-client.ts @@ -1,9 +1,10 @@ -import {assert} from '../../../../shared/src/asserts.ts'; import {resolver, type Resolver} from '@rocicorp/resolver'; import {Worker} from 'node:worker_threads'; +import {assert} from '../../../../shared/src/asserts.ts'; +import type {LogConfig} from '../../../../shared/src/logging.ts'; import type {Database} from '../../../../zqlite/src/db.ts'; +import {WRITE_WORKER_URL} from '../../server/worker-urls.ts'; import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; -import type {LogConfig} from '../../../../shared/src/logging.ts'; import type {ChangeProcessorMode, CommitResult} from './change-processor.ts'; import type {SubscriptionState} from './schema/replication-state.ts'; @@ -71,8 +72,8 @@ export class ThreadWriteWorkerClient implements WriteWorkerClient { #errorHandler: ErrorHandler = () => {}; #terminated = false; - constructor(workerUrl: URL) { - this.#worker = new Worker(workerUrl); + constructor() { + this.#worker = new Worker(WRITE_WORKER_URL); this.#worker.on('message', (msg: Response | WriteError) => { if ('writeError' in msg) { diff --git a/packages/zero-cache/src/services/replicator/write-worker.test.ts b/packages/zero-cache/src/services/replicator/write-worker.test.ts index e162e8005e..933c66edd8 100644 --- a/packages/zero-cache/src/services/replicator/write-worker.test.ts +++ b/packages/zero-cache/src/services/replicator/write-worker.test.ts @@ -31,9 +31,7 @@ describe('write-worker', () => { `, ); - worker = new ThreadWriteWorkerClient( - new URL('./write-worker.ts', import.meta.url), - ); + worker = new ThreadWriteWorkerClient(); await worker.init( dbFile.path, 'serving', @@ -138,9 +136,7 @@ describe('write-worker', () => { test('stop shuts down cleanly', async () => { await worker.stop(); // Create a new worker for afterEach cleanup - worker = new ThreadWriteWorkerClient( - new URL('./write-worker.ts', import.meta.url), - ); + worker = new ThreadWriteWorkerClient(); await worker.init( dbFile.path, 'serving', diff --git a/packages/zero-cache/src/services/replicator/write-worker.ts b/packages/zero-cache/src/services/replicator/write-worker.ts index e47c05cf3b..20199dd641 100644 --- a/packages/zero-cache/src/services/replicator/write-worker.ts +++ b/packages/zero-cache/src/services/replicator/write-worker.ts @@ -1,9 +1,10 @@ import type {LogContext} from '@rocicorp/logger'; -import {must} from '../../../../shared/src/must.ts'; +import {parentPort} from 'node:worker_threads'; import type {LogConfig} from '../../../../shared/src/logging.ts'; -import {createLogContext} from '../../server/logging.ts'; +import {must} from '../../../../shared/src/must.ts'; import {Database} from '../../../../zqlite/src/db.ts'; import {StatementRunner} from '../../db/statements.ts'; +import {createLogContext} from '../../server/logging.ts'; import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import {ChangeProcessor, type ChangeProcessorMode} from './change-processor.ts'; import {getSubscriptionState} from './schema/replication-state.ts'; @@ -12,14 +13,12 @@ import { type ArgsMap, type Method, type PragmaConfig, - type ResultMap, - type WriteError, type Request, type Response, + type ResultMap, + type WriteError, } from './write-worker-client.ts'; -import {parentPort} from 'node:worker_threads'; - if (!parentPort) { throw new Error('write-worker must be run as a worker thread'); } From 87fb91d27826185c9f02d5006d6fbaeba6e7b1cf Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Wed, 18 Mar 2026 19:21:19 +0100 Subject: [PATCH 151/495] fix: release script (#5664) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes `Could not extract protocol versions from protocol-version.js`: ``` resources/tmcw.json 4636ms (unchanged) src/bencher-metric-format.ts 20ms (unchanged) ... tsconfig.json 0ms (unchanged) Tasks: 33 successful, 33 total Cached: 0 cached, 33 total Time: 7.566s Executing: npx syncpack@13 fix-mismatches = Default Version Group ======================================================== 512 ✓ already valid - package.json - prod/package.json - apps/otel-proxy/package.json ... - tools/client-simulator/package.json - tools/load-generator/package.json - tools/process-tracker/package.json - tools/sqlite-io-yield-simulator/package.json - tools/verify-package-deps/package.json Error during execution: Error: Could not extract protocol versions from protocol-version.js ``` --- packages/zero/tool/release.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/zero/tool/release.js b/packages/zero/tool/release.js index 8b7966aa46..104c8fabdd 100755 --- a/packages/zero/tool/release.js +++ b/packages/zero/tool/release.js @@ -38,22 +38,24 @@ function writePackageData(packagePath, data) { } async function getProtocolVersions() { - const {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} = await import( - basePath( - 'packages', - 'zero', - 'out', - 'zero-protocol', - 'src', - 'protocol-version.js', - ) + const script = ` +import {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} from './packages/zero-protocol/src/protocol-version.ts'; + +console.log(JSON.stringify({PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL})); +`; + const output = execute( + `node --experimental-strip-types --no-warnings --input-type=module -e ${JSON.stringify(script)}`, + {stdio: 'pipe'}, + ); + const {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} = JSON.parse( + output ?? '{}', ); if ( typeof PROTOCOL_VERSION !== 'number' || typeof MIN_SERVER_SUPPORTED_SYNC_PROTOCOL !== 'number' ) { throw new Error( - 'Could not extract protocol versions from protocol-version.js', + 'Could not extract protocol versions from packages/zero-protocol/src/protocol-version.ts', ); } return {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL}; @@ -467,7 +469,7 @@ try { execute('npm install'); execute('npm run build'); execute('npm run format'); - execute('npx syncpack@13 fix-mismatches'); + execute('npx -y syncpack@13 fix-mismatches'); // Surface information about the code as image metadata (labels) for // production / release management. From 3d247f100c671acad4d11a14c5d21938a7b4b076 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Wed, 18 Mar 2026 20:36:55 +0100 Subject: [PATCH 152/495] chore: more fix release script (#5666) --- packages/zero/tool/release.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/zero/tool/release.js b/packages/zero/tool/release.js index 104c8fabdd..6d32f793c9 100755 --- a/packages/zero/tool/release.js +++ b/packages/zero/tool/release.js @@ -5,6 +5,7 @@ import {execSync} from 'node:child_process'; import * as fs from 'node:fs'; import * as os from 'node:os'; import * as path from 'path'; +import {pathToFileURL} from 'node:url'; /** @param {string[]} parts */ function basePath(...parts) { @@ -38,11 +39,10 @@ function writePackageData(packagePath, data) { } async function getProtocolVersions() { - const script = ` -import {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} from './packages/zero-protocol/src/protocol-version.ts'; - -console.log(JSON.stringify({PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL})); -`; + const protocolVersionURL = pathToFileURL( + basePath('packages', 'zero-protocol', 'src', 'protocol-version.ts'), + ).href; + const script = `import {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} from ${JSON.stringify(protocolVersionURL)}; console.log(JSON.stringify({PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL}));`; const output = execute( `node --experimental-strip-types --no-warnings --input-type=module -e ${JSON.stringify(script)}`, {stdio: 'pipe'}, From 029fb79153c65e59822293928f24da4b04b800ad Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 19 Mar 2026 10:35:51 +0100 Subject: [PATCH 153/495] chore: Fix release script for canary and stable builds We import the source files using static imports instead of "evaling" a string. Now uses .ts which allows us to use types and makes it easier to maintain. Remove dead code. --- packages/zero/tool/{release.js => release.ts} | 136 ++++-------------- 1 file changed, 28 insertions(+), 108 deletions(-) rename packages/zero/tool/{release.js => release.ts} (79%) mode change 100755 => 100644 diff --git a/packages/zero/tool/release.js b/packages/zero/tool/release.ts old mode 100755 new mode 100644 similarity index 79% rename from packages/zero/tool/release.js rename to packages/zero/tool/release.ts index 6d32f793c9..2eb7806ceb --- a/packages/zero/tool/release.js +++ b/packages/zero/tool/release.ts @@ -1,71 +1,39 @@ -//@ts-check - import commandLineArgs from 'command-line-args'; import {execSync} from 'node:child_process'; import * as fs from 'node:fs'; import * as os from 'node:os'; import * as path from 'path'; -import {pathToFileURL} from 'node:url'; +import { + MIN_SERVER_SUPPORTED_SYNC_PROTOCOL, + PROTOCOL_VERSION, +} from '../../zero-protocol/src/protocol-version.ts'; -/** @param {string[]} parts */ -function basePath(...parts) { +function basePath(...parts: string[]) { return path.join(process.cwd(), ...parts); } -/** - * @param {string} command - * @param {{stdio?:'inherit'|'pipe'|undefined, cwd?:string|undefined}|undefined} [options] - */ -function execute(command, options) { +function execute( + command: string, + options?: {stdio?: 'inherit' | 'pipe' | undefined; cwd?: string | undefined}, +) { console.log(`Executing: ${command}`); return execSync(command, {stdio: 'inherit', ...options}) ?.toString() ?.trim(); } -/** - * @param {fs.PathOrFileDescriptor} packagePath - */ -function getPackageData(packagePath) { +function getPackageData(packagePath: fs.PathOrFileDescriptor) { return JSON.parse(fs.readFileSync(packagePath, 'utf8')); } -/** - * @param {fs.PathOrFileDescriptor} packagePath - * @param {any} data - */ -function writePackageData(packagePath, data) { +function writePackageData(packagePath: fs.PathOrFileDescriptor, data: any) { fs.writeFileSync(packagePath, JSON.stringify(data, null, 2)); } -async function getProtocolVersions() { - const protocolVersionURL = pathToFileURL( - basePath('packages', 'zero-protocol', 'src', 'protocol-version.ts'), - ).href; - const script = `import {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} from ${JSON.stringify(protocolVersionURL)}; console.log(JSON.stringify({PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL}));`; - const output = execute( - `node --experimental-strip-types --no-warnings --input-type=module -e ${JSON.stringify(script)}`, - {stdio: 'pipe'}, - ); - const {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} = JSON.parse( - output ?? '{}', - ); - if ( - typeof PROTOCOL_VERSION !== 'number' || - typeof MIN_SERVER_SUPPORTED_SYNC_PROTOCOL !== 'number' - ) { - throw new Error( - 'Could not extract protocol versions from packages/zero-protocol/src/protocol-version.ts', - ); - } - return {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL}; -} - /** - * @param {string} version - Base version from package.json (e.g., "0.24.0") - * @param {string} remote + * @param version - Base version from package.json (e.g., "0.24.0") */ -function bumpCanaryVersion(version, remote) { +function bumpCanaryVersion(version: string, remote: string) { // Canary versions use the format: major.minor.patch-canary.attempt // // This ensures that canary versions are treated as prereleases in semver, @@ -124,47 +92,6 @@ function bumpCanaryVersion(version, remote) { return nextVersion; } -/** - * Find the latest canary tag for a given base version - * @param {string} baseVersion - e.g., "0.24.0" - * @param {string} remote - * @returns {string | null} - e.g., "zero/v0.24.0-canary.5" or null if none found - */ -function findLatestCanaryTag(baseVersion, remote) { - console.log( - `Looking for latest canary tag for base version ${baseVersion}...`, - ); - execute(`git fetch ${remote} --tags`, {stdio: 'pipe'}); - - const tagPattern = `zero/v${baseVersion}-canary.*`; - const tagsOutput = execute(`git tag -l "${tagPattern}"`, {stdio: 'pipe'}); - - if (!tagsOutput) { - return null; - } - - const tags = tagsOutput.split('\n').filter(Boolean); - const attemptRegex = new RegExp( - `^zero/v${baseVersion.replace(/\./g, '\\.')}-canary\\.(\\d+)$`, - ); - - let maxAttempt = -1; - let latestTag = null; - - for (const tag of tags) { - const match = tag.match(attemptRegex); - if (match) { - const attempt = parseInt(match[1]); - if (attempt > maxAttempt) { - maxAttempt = attempt; - latestTag = tag; - } - } - } - - return latestTag; -} - /** * Parse command line arguments */ @@ -239,7 +166,7 @@ function parseArgs() { process.exit(1); } - const isCanary = !Boolean(options.stable); + const isCanary = !options.stable; const remote = options.remote || 'origin'; return { @@ -253,13 +180,10 @@ function parseArgs() { }; } -/** - * Display help message - * @param {Array} optionDefinitions - */ -function showHelp(optionDefinitions) { +/** Display help message */ +function showHelp(optionDefinitions: Array) { console.log(` -Usage: node release.js [options] +Usage: node release.ts [options] Creates canary or stable release builds for @rocicorp/zero. @@ -278,22 +202,22 @@ Options:`); console.log(` Canary Examples: - node release.js --from main # Build canary from main - node release.js --from maint/zero/v0.24 # Build canary from maintenance branch - node release.js --from zero/v0.24.0 # Build canary from specific tag + node release.ts --from main # Build canary from main + node release.ts --from maint/zero/v0.24 # Build canary from maintenance branch + node release.ts --from zero/v0.24.0 # Build canary from specific tag Stable Release Examples: - node release.js --stable --from zero/v0.24.0-canary.3 # Promote specific canary to stable + node release.ts --stable --from zero/v0.24.0-canary.3 # Promote specific canary to stable Maintenance/cherry-pick workflow: 1. Create a maintenance branch from tag: git checkout -b maint/zero/v0.24 zero/v0.24.0 - 2. Cherry-pick commits: git cherry-pick -x + 2. Cherry-pick commits: git cherry-pick 3. Push to origin: git push origin maint/zero/v0.24 - 4. Run: node release.js --from maint/zero/v0.24 + 4. Run: node release.ts --from maint/zero/v0.24 Retrying after partial failure: - node release.js --from main --skip-git --skip-npm # Retry just docker - node release.js --from main --skip-git # Retry npm and docker + node release.ts --from main --skip-git --skip-npm # Retry just docker + node release.ts --from main --skip-git # Retry npm and docker `); } @@ -469,12 +393,7 @@ try { execute('npm install'); execute('npm run build'); execute('npm run format'); - execute('npx -y syncpack@13 fix-mismatches'); - - // Surface information about the code as image metadata (labels) for - // production / release management. - const {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} = - await getProtocolVersions(); + execute('npx syncpack@13 fix-mismatches'); execute('git status'); @@ -578,7 +497,7 @@ try { console.log( ` 1. Update base version in package.json if needed: node bump-version.js X.Y.Z`, ); - console.log(` 2. Run: node release.js --stable --from ${tagName}`); + console.log(` 2. Run: node release.ts --stable --from ${tagName}`); console.log( ` 3. When ready for users: npm dist-tag add @rocicorp/zero@X.Y.Z latest`, ); @@ -588,6 +507,7 @@ try { } console.log(``); } catch (error) { + // oxlint-disable-next-line restrict-template-expressions console.error(`Error during execution: ${error}`); process.exit(1); } From 4ccf00b160e7e61a5d20e4cac61d3687650a958b Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 19 Mar 2026 11:02:04 +0100 Subject: [PATCH 154/495] Revert "chore: Fix release script for canary and stable builds" This reverts commit 029fb79153c65e59822293928f24da4b04b800ad. --- packages/zero/tool/{release.ts => release.js} | 136 ++++++++++++++---- 1 file changed, 108 insertions(+), 28 deletions(-) rename packages/zero/tool/{release.ts => release.js} (79%) mode change 100644 => 100755 diff --git a/packages/zero/tool/release.ts b/packages/zero/tool/release.js old mode 100644 new mode 100755 similarity index 79% rename from packages/zero/tool/release.ts rename to packages/zero/tool/release.js index 2eb7806ceb..6d32f793c9 --- a/packages/zero/tool/release.ts +++ b/packages/zero/tool/release.js @@ -1,39 +1,71 @@ +//@ts-check + import commandLineArgs from 'command-line-args'; import {execSync} from 'node:child_process'; import * as fs from 'node:fs'; import * as os from 'node:os'; import * as path from 'path'; -import { - MIN_SERVER_SUPPORTED_SYNC_PROTOCOL, - PROTOCOL_VERSION, -} from '../../zero-protocol/src/protocol-version.ts'; +import {pathToFileURL} from 'node:url'; -function basePath(...parts: string[]) { +/** @param {string[]} parts */ +function basePath(...parts) { return path.join(process.cwd(), ...parts); } -function execute( - command: string, - options?: {stdio?: 'inherit' | 'pipe' | undefined; cwd?: string | undefined}, -) { +/** + * @param {string} command + * @param {{stdio?:'inherit'|'pipe'|undefined, cwd?:string|undefined}|undefined} [options] + */ +function execute(command, options) { console.log(`Executing: ${command}`); return execSync(command, {stdio: 'inherit', ...options}) ?.toString() ?.trim(); } -function getPackageData(packagePath: fs.PathOrFileDescriptor) { +/** + * @param {fs.PathOrFileDescriptor} packagePath + */ +function getPackageData(packagePath) { return JSON.parse(fs.readFileSync(packagePath, 'utf8')); } -function writePackageData(packagePath: fs.PathOrFileDescriptor, data: any) { +/** + * @param {fs.PathOrFileDescriptor} packagePath + * @param {any} data + */ +function writePackageData(packagePath, data) { fs.writeFileSync(packagePath, JSON.stringify(data, null, 2)); } +async function getProtocolVersions() { + const protocolVersionURL = pathToFileURL( + basePath('packages', 'zero-protocol', 'src', 'protocol-version.ts'), + ).href; + const script = `import {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} from ${JSON.stringify(protocolVersionURL)}; console.log(JSON.stringify({PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL}));`; + const output = execute( + `node --experimental-strip-types --no-warnings --input-type=module -e ${JSON.stringify(script)}`, + {stdio: 'pipe'}, + ); + const {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} = JSON.parse( + output ?? '{}', + ); + if ( + typeof PROTOCOL_VERSION !== 'number' || + typeof MIN_SERVER_SUPPORTED_SYNC_PROTOCOL !== 'number' + ) { + throw new Error( + 'Could not extract protocol versions from packages/zero-protocol/src/protocol-version.ts', + ); + } + return {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL}; +} + /** - * @param version - Base version from package.json (e.g., "0.24.0") + * @param {string} version - Base version from package.json (e.g., "0.24.0") + * @param {string} remote */ -function bumpCanaryVersion(version: string, remote: string) { +function bumpCanaryVersion(version, remote) { // Canary versions use the format: major.minor.patch-canary.attempt // // This ensures that canary versions are treated as prereleases in semver, @@ -92,6 +124,47 @@ function bumpCanaryVersion(version: string, remote: string) { return nextVersion; } +/** + * Find the latest canary tag for a given base version + * @param {string} baseVersion - e.g., "0.24.0" + * @param {string} remote + * @returns {string | null} - e.g., "zero/v0.24.0-canary.5" or null if none found + */ +function findLatestCanaryTag(baseVersion, remote) { + console.log( + `Looking for latest canary tag for base version ${baseVersion}...`, + ); + execute(`git fetch ${remote} --tags`, {stdio: 'pipe'}); + + const tagPattern = `zero/v${baseVersion}-canary.*`; + const tagsOutput = execute(`git tag -l "${tagPattern}"`, {stdio: 'pipe'}); + + if (!tagsOutput) { + return null; + } + + const tags = tagsOutput.split('\n').filter(Boolean); + const attemptRegex = new RegExp( + `^zero/v${baseVersion.replace(/\./g, '\\.')}-canary\\.(\\d+)$`, + ); + + let maxAttempt = -1; + let latestTag = null; + + for (const tag of tags) { + const match = tag.match(attemptRegex); + if (match) { + const attempt = parseInt(match[1]); + if (attempt > maxAttempt) { + maxAttempt = attempt; + latestTag = tag; + } + } + } + + return latestTag; +} + /** * Parse command line arguments */ @@ -166,7 +239,7 @@ function parseArgs() { process.exit(1); } - const isCanary = !options.stable; + const isCanary = !Boolean(options.stable); const remote = options.remote || 'origin'; return { @@ -180,10 +253,13 @@ function parseArgs() { }; } -/** Display help message */ -function showHelp(optionDefinitions: Array) { +/** + * Display help message + * @param {Array} optionDefinitions + */ +function showHelp(optionDefinitions) { console.log(` -Usage: node release.ts [options] +Usage: node release.js [options] Creates canary or stable release builds for @rocicorp/zero. @@ -202,22 +278,22 @@ Options:`); console.log(` Canary Examples: - node release.ts --from main # Build canary from main - node release.ts --from maint/zero/v0.24 # Build canary from maintenance branch - node release.ts --from zero/v0.24.0 # Build canary from specific tag + node release.js --from main # Build canary from main + node release.js --from maint/zero/v0.24 # Build canary from maintenance branch + node release.js --from zero/v0.24.0 # Build canary from specific tag Stable Release Examples: - node release.ts --stable --from zero/v0.24.0-canary.3 # Promote specific canary to stable + node release.js --stable --from zero/v0.24.0-canary.3 # Promote specific canary to stable Maintenance/cherry-pick workflow: 1. Create a maintenance branch from tag: git checkout -b maint/zero/v0.24 zero/v0.24.0 - 2. Cherry-pick commits: git cherry-pick + 2. Cherry-pick commits: git cherry-pick -x 3. Push to origin: git push origin maint/zero/v0.24 - 4. Run: node release.ts --from maint/zero/v0.24 + 4. Run: node release.js --from maint/zero/v0.24 Retrying after partial failure: - node release.ts --from main --skip-git --skip-npm # Retry just docker - node release.ts --from main --skip-git # Retry npm and docker + node release.js --from main --skip-git --skip-npm # Retry just docker + node release.js --from main --skip-git # Retry npm and docker `); } @@ -393,7 +469,12 @@ try { execute('npm install'); execute('npm run build'); execute('npm run format'); - execute('npx syncpack@13 fix-mismatches'); + execute('npx -y syncpack@13 fix-mismatches'); + + // Surface information about the code as image metadata (labels) for + // production / release management. + const {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} = + await getProtocolVersions(); execute('git status'); @@ -497,7 +578,7 @@ try { console.log( ` 1. Update base version in package.json if needed: node bump-version.js X.Y.Z`, ); - console.log(` 2. Run: node release.ts --stable --from ${tagName}`); + console.log(` 2. Run: node release.js --stable --from ${tagName}`); console.log( ` 3. When ready for users: npm dist-tag add @rocicorp/zero@X.Y.Z latest`, ); @@ -507,7 +588,6 @@ try { } console.log(``); } catch (error) { - // oxlint-disable-next-line restrict-template-expressions console.error(`Error during execution: ${error}`); process.exit(1); } From 8e0f600fb3a9185facf60cfd4971d260b266690e Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 19 Mar 2026 11:25:54 +0100 Subject: [PATCH 155/495] chore: Fix release script for canary and stable builds (#5668) We import the source files using static imports instead of "evaling" a string. Now uses .ts which allows us to use types and makes it easier to maintain. Remove dead code. --- package-lock.json | 1 + packages/zero/package.json | 1 + packages/zero/tool/{release.js => release.ts} | 132 ++++-------------- 3 files changed, 28 insertions(+), 106 deletions(-) rename packages/zero/tool/{release.js => release.ts} (80%) mode change 100755 => 100644 diff --git a/package-lock.json b/package-lock.json index 26a0355b7d..1da235a852 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43057,6 +43057,7 @@ "zero-cache": "0.0.0", "zero-client": "0.0.0", "zero-pg": "0.0.0", + "zero-protocol": "0.0.0", "zero-react": "0.0.0", "zero-server": "0.0.0", "zero-solid": "0.0.0", diff --git a/packages/zero/package.json b/packages/zero/package.json index ffe08ee122..f404aad204 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -93,6 +93,7 @@ "zero-cache": "0.0.0", "zero-client": "0.0.0", "zero-pg": "0.0.0", + "zero-protocol": "0.0.0", "zero-react": "0.0.0", "zero-server": "0.0.0", "zero-solid": "0.0.0", diff --git a/packages/zero/tool/release.js b/packages/zero/tool/release.ts old mode 100755 new mode 100644 similarity index 80% rename from packages/zero/tool/release.js rename to packages/zero/tool/release.ts index 6d32f793c9..d88060114a --- a/packages/zero/tool/release.js +++ b/packages/zero/tool/release.ts @@ -1,71 +1,39 @@ -//@ts-check - import commandLineArgs from 'command-line-args'; import {execSync} from 'node:child_process'; import * as fs from 'node:fs'; import * as os from 'node:os'; import * as path from 'path'; -import {pathToFileURL} from 'node:url'; +import { + MIN_SERVER_SUPPORTED_SYNC_PROTOCOL, + PROTOCOL_VERSION, +} from '../../zero-protocol/src/protocol-version.ts'; -/** @param {string[]} parts */ -function basePath(...parts) { +function basePath(...parts: string[]) { return path.join(process.cwd(), ...parts); } -/** - * @param {string} command - * @param {{stdio?:'inherit'|'pipe'|undefined, cwd?:string|undefined}|undefined} [options] - */ -function execute(command, options) { +function execute( + command: string, + options?: {stdio?: 'inherit' | 'pipe' | undefined; cwd?: string | undefined}, +) { console.log(`Executing: ${command}`); return execSync(command, {stdio: 'inherit', ...options}) ?.toString() ?.trim(); } -/** - * @param {fs.PathOrFileDescriptor} packagePath - */ -function getPackageData(packagePath) { +function getPackageData(packagePath: fs.PathOrFileDescriptor) { return JSON.parse(fs.readFileSync(packagePath, 'utf8')); } -/** - * @param {fs.PathOrFileDescriptor} packagePath - * @param {any} data - */ -function writePackageData(packagePath, data) { +function writePackageData(packagePath: fs.PathOrFileDescriptor, data: any) { fs.writeFileSync(packagePath, JSON.stringify(data, null, 2)); } -async function getProtocolVersions() { - const protocolVersionURL = pathToFileURL( - basePath('packages', 'zero-protocol', 'src', 'protocol-version.ts'), - ).href; - const script = `import {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} from ${JSON.stringify(protocolVersionURL)}; console.log(JSON.stringify({PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL}));`; - const output = execute( - `node --experimental-strip-types --no-warnings --input-type=module -e ${JSON.stringify(script)}`, - {stdio: 'pipe'}, - ); - const {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} = JSON.parse( - output ?? '{}', - ); - if ( - typeof PROTOCOL_VERSION !== 'number' || - typeof MIN_SERVER_SUPPORTED_SYNC_PROTOCOL !== 'number' - ) { - throw new Error( - 'Could not extract protocol versions from packages/zero-protocol/src/protocol-version.ts', - ); - } - return {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL}; -} - /** - * @param {string} version - Base version from package.json (e.g., "0.24.0") - * @param {string} remote + * @param version - Base version from package.json (e.g., "0.24.0") */ -function bumpCanaryVersion(version, remote) { +function bumpCanaryVersion(version: string, remote: string) { // Canary versions use the format: major.minor.patch-canary.attempt // // This ensures that canary versions are treated as prereleases in semver, @@ -124,47 +92,6 @@ function bumpCanaryVersion(version, remote) { return nextVersion; } -/** - * Find the latest canary tag for a given base version - * @param {string} baseVersion - e.g., "0.24.0" - * @param {string} remote - * @returns {string | null} - e.g., "zero/v0.24.0-canary.5" or null if none found - */ -function findLatestCanaryTag(baseVersion, remote) { - console.log( - `Looking for latest canary tag for base version ${baseVersion}...`, - ); - execute(`git fetch ${remote} --tags`, {stdio: 'pipe'}); - - const tagPattern = `zero/v${baseVersion}-canary.*`; - const tagsOutput = execute(`git tag -l "${tagPattern}"`, {stdio: 'pipe'}); - - if (!tagsOutput) { - return null; - } - - const tags = tagsOutput.split('\n').filter(Boolean); - const attemptRegex = new RegExp( - `^zero/v${baseVersion.replace(/\./g, '\\.')}-canary\\.(\\d+)$`, - ); - - let maxAttempt = -1; - let latestTag = null; - - for (const tag of tags) { - const match = tag.match(attemptRegex); - if (match) { - const attempt = parseInt(match[1]); - if (attempt > maxAttempt) { - maxAttempt = attempt; - latestTag = tag; - } - } - } - - return latestTag; -} - /** * Parse command line arguments */ @@ -239,7 +166,7 @@ function parseArgs() { process.exit(1); } - const isCanary = !Boolean(options.stable); + const isCanary = !options.stable; const remote = options.remote || 'origin'; return { @@ -253,13 +180,10 @@ function parseArgs() { }; } -/** - * Display help message - * @param {Array} optionDefinitions - */ -function showHelp(optionDefinitions) { +/** Display help message */ +function showHelp(optionDefinitions: Array) { console.log(` -Usage: node release.js [options] +Usage: node release.ts [options] Creates canary or stable release builds for @rocicorp/zero. @@ -278,22 +202,22 @@ Options:`); console.log(` Canary Examples: - node release.js --from main # Build canary from main - node release.js --from maint/zero/v0.24 # Build canary from maintenance branch - node release.js --from zero/v0.24.0 # Build canary from specific tag + node release.ts --from main # Build canary from main + node release.ts --from maint/zero/v0.24 # Build canary from maintenance branch + node release.ts --from zero/v0.24.0 # Build canary from specific tag Stable Release Examples: - node release.js --stable --from zero/v0.24.0-canary.3 # Promote specific canary to stable + node release.ts --stable --from zero/v0.24.0-canary.3 # Promote specific canary to stable Maintenance/cherry-pick workflow: 1. Create a maintenance branch from tag: git checkout -b maint/zero/v0.24 zero/v0.24.0 2. Cherry-pick commits: git cherry-pick -x 3. Push to origin: git push origin maint/zero/v0.24 - 4. Run: node release.js --from maint/zero/v0.24 + 4. Run: node release.ts --from maint/zero/v0.24 Retrying after partial failure: - node release.js --from main --skip-git --skip-npm # Retry just docker - node release.js --from main --skip-git # Retry npm and docker + node release.ts --from main --skip-git --skip-npm # Retry just docker + node release.ts --from main --skip-git # Retry npm and docker `); } @@ -471,11 +395,6 @@ try { execute('npm run format'); execute('npx -y syncpack@13 fix-mismatches'); - // Surface information about the code as image metadata (labels) for - // production / release management. - const {PROTOCOL_VERSION, MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} = - await getProtocolVersions(); - execute('git status'); if (isCanary) { @@ -578,7 +497,7 @@ try { console.log( ` 1. Update base version in package.json if needed: node bump-version.js X.Y.Z`, ); - console.log(` 2. Run: node release.js --stable --from ${tagName}`); + console.log(` 2. Run: node release.ts --stable --from ${tagName}`); console.log( ` 3. When ready for users: npm dist-tag add @rocicorp/zero@X.Y.Z latest`, ); @@ -588,6 +507,7 @@ try { } console.log(``); } catch (error) { + // oxlint-disable-next-line restrict-template-expressions console.error(`Error during execution: ${error}`); process.exit(1); } From cf07a1147c61856a87333e40617d382f0c7592e3 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Thu, 19 Mar 2026 15:39:40 -0700 Subject: [PATCH 156/495] fix(view-syncer): fixed missing PK failure (#5670) - fix `mustGetPrimaryKey` failures when queries touch replica tables that exist in the view-syncer schema but are missing from an older client schema - add regression tests for subset client schemas covering `whereExists` helper tables plus scalar companion hydration and advancement --- .../view-syncer/pipeline-driver.test.ts | 149 ++++++++++++++++++ .../services/view-syncer/pipeline-driver.ts | 6 +- 2 files changed, 151 insertions(+), 4 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts index 508c14bb7a..bc7a47d8f4 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.test.ts @@ -184,6 +184,10 @@ describe('view-syncer/pipeline-driver', () => { tables: [issues, comments, issueLabels, labels, uniques], }); + const subsetClientSchema = createSchema({ + tables: [issues], + }); + const ISSUES_AND_COMMENTS: AST = { table: 'issues', orderBy: [['id', 'desc']], @@ -1283,6 +1287,62 @@ describe('view-syncer/pipeline-driver', () => { `); }); + test('subset client schema can hydrate whereExists helper tables', () => { + pipelines.init(subsetClientSchema); + + expect([ + ...pipelines.addQuery( + 'hash-subset-schema-exists', + 'querySubsetSchemaExists', + ISSUES_QUERY_WITH_EXISTS, + startTimer(), + ), + ]).toMatchInlineSnapshot(` + [ + { + "queryID": "querySubsetSchemaExists", + "row": { + "_0_version": "123", + "closed": false, + "id": "1", + }, + "rowKey": { + "id": "1", + }, + "table": "issues", + "type": "add", + }, + { + "queryID": "querySubsetSchemaExists", + "row": { + "_0_version": "123", + "issueID": "1", + "labelID": "1", + "legacyID": "1-1", + }, + "rowKey": { + "legacyID": "1-1", + }, + "table": "issueLabels", + "type": "add", + }, + { + "queryID": "querySubsetSchemaExists", + "row": { + "_0_version": "123", + "id": "1", + "name": "bug", + }, + "rowKey": { + "id": "1", + }, + "table": "labels", + "type": "add", + }, + ] + `); + }); + test('whereExists added by permissions return no rows', () => { pipelines.init(clientSchema); expect([ @@ -1900,6 +1960,58 @@ describe('view-syncer/pipeline-driver', () => { }); }); + test('subset client schema can hydrate scalar subquery companion tables', () => { + pipelines.init(subsetClientSchema); + + expect([ + ...pipelines.addQuery( + 'hash-scalar-subset-schema', + 'queryScalarSubsetSchema', + ISSUES_WITH_SCALAR_SUBQUERY, + startTimer(), + ), + ]).toMatchInlineSnapshot(` + [ + { + "queryID": "queryScalarSubsetSchema", + "row": { + "_0_version": "123", + "closed": false, + "id": "1", + }, + "rowKey": { + "id": "1", + }, + "table": "issues", + "type": "add", + }, + { + "queryID": "queryScalarSubsetSchema", + "row": { + "_0_version": "123", + "id": "10", + "issueID": "1", + "upvotes": 0, + }, + "rowKey": { + "id": "10", + }, + "table": "comments", + "type": "add", + }, + ] + `); + + expect( + pipelines.queries().get('queryScalarSubsetSchema')?.transformedAst.where, + ).toEqual({ + type: 'simple', + op: '=', + left: {type: 'column', name: 'id'}, + right: {type: 'literal', value: '1'}, + }); + }); + test('scalar subquery with no matching rows', () => { pipelines.init(clientSchema); @@ -2069,6 +2181,43 @@ describe('view-syncer/pipeline-driver', () => { `); }); + test('subset client schema advances scalar companion tables', () => { + pipelines.init(subsetClientSchema); + + [ + ...pipelines.addQuery( + 'hash-scalar-subset-schema', + 'queryScalarSubsetSchema', + ISSUES_WITH_SCALAR_SUBQUERY, + startTimer(), + ), + ]; + + replicator.processTransaction( + '134', + messages.update('comments', {id: '10', issueID: '1', upvotes: 5}), + ); + + expect(changes()).toMatchInlineSnapshot(` + [ + { + "queryID": "queryScalarSubsetSchema", + "row": { + "_0_version": "134", + "id": "10", + "issueID": "1", + "upvotes": 5, + }, + "rowKey": { + "id": "10", + }, + "table": "comments", + "type": "edit", + }, + ] + `); + }); + test('companion pipeline throws ResetPipelinesSignal when scalar value changes', () => { pipelines.init(clientSchema); diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 75e9cabd31..6cea66a09f 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -47,7 +47,7 @@ import { } from '../../observability/metrics.ts'; import type {InspectorDelegate} from '../../server/inspector-delegate.ts'; import {type RowKey} from '../../types/row-key.ts'; -import {upstreamSchema, type ShardID} from '../../types/shards.ts'; +import {type ShardID} from '../../types/shards.ts'; import { getSubscriptionState, ZERO_VERSION_COLUMN_NAME, @@ -246,9 +246,7 @@ export class PipelineDriver { this.#primaryKeys = primaryKeys; primaryKeys.clear(); for (const [table, spec] of this.#tableSpecs.entries()) { - if (table.startsWith(upstreamSchema(this.#shardID))) { - primaryKeys.set(table, spec.tableSpec.primaryKey); - } + primaryKeys.set(table, spec.tableSpec.primaryKey); } buildPrimaryKeys(clientSchema, primaryKeys); const {replicaVersion} = getSubscriptionState(db); From 0c994b630e522e9f0446f12a9e0196d57ac7b954 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 19 Mar 2026 22:29:34 -0700 Subject: [PATCH 157/495] fix: handle IPC_CHANNEL_CLOSED race condition during shutdown (#5671) https://rocicorp.slack.com/archives/C0ABMK92H47/p1771004195637349 https://rocicorp.slack.com/archives/C0ABMK92H47/p1772051456373259 https://rocicorp.slack.com/archives/C0ABMK92H47/p1773961845465689 https://rocicorp.slack.com/archives/C0AK5KX8HGE/p1773961846449149 --- packages/zero-cache/src/workers/replicator.ts | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/zero-cache/src/workers/replicator.ts b/packages/zero-cache/src/workers/replicator.ts index 9e0f14763c..4df59a0d72 100644 --- a/packages/zero-cache/src/workers/replicator.ts +++ b/packages/zero-cache/src/workers/replicator.ts @@ -10,14 +10,14 @@ import type { ReplicaStateNotifier, Replicator, } from '../services/replicator/replicator.ts'; -import { - applyPragmas, - type PragmaConfig, -} from '../services/replicator/write-worker-client.ts'; import { getAscendingEvents, recordEvent, } from '../services/replicator/schema/replication-state.ts'; +import { + applyPragmas, + type PragmaConfig, +} from '../services/replicator/write-worker-client.ts'; import type {Worker} from '../types/processes.ts'; export const replicaFileModeSchema = v.literalUnion( @@ -169,7 +169,23 @@ export function handleSubscriptionsFrom( }); for await (const msg of subscription) { - subscriber.send(['notify', msg]); + try { + subscriber.send(['notify', msg]); + } catch (e) { + const log = + e instanceof Error && + 'code' in e && + // This can happen in a race condition if the subscribing process + // is closed before the 'close' message is processed. + e.code === 'ERR_IPC_CHANNEL_CLOSED' + ? 'warn' + : 'error'; + + lc[log]?.( + `error sending replicator notification to ${subscriber.pid}: ${String(e)}`, + e, + ); + } } }); } From 3fec6fe487a40aa367c755e31f28c81924617540 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Fri, 20 Mar 2026 08:29:21 -0700 Subject: [PATCH 158/495] fix(z2s): add `time`/`timetz` SQL generation and `timetz` type handler (#5667) Two bugs affected `time` and `timetz` column handling in z2s: ## Bug 1: `time`/`timetz` not handled in SQL parameter conversion (`packages/z2s/src/sql.ts`) `formatCommonToSingularAndPlural` had no cases for `time`, `time without time zone`, `timetz`, or `time with time zone`. These types fell through to the generic string/number handlers instead of getting the proper milliseconds-to- interval conversion. Added the missing cases using `(value::text::int * interval'1ms')::time`, with `AT TIME ZONE 'UTC'` for the no-timezone variants (`time` / `time without time zone`) and without it for the timezone-aware variants (`timetz` / `time with time zone`), mirroring the existing pattern for `timestamp`/`timestamptz`. ## Bug 2: `timetz` had no type handler in the Postgres client (`packages/zero-cache/src/types/pg.ts`) `postgresTypeConfig` was missing a `timetz` entry entirely, meaning `timetz` columns fell back to default (string) handling and bypassed `postgresTimeToMilliseconds` parsing. Added the missing `timetz` handler. Also extracted a shared `serializeTime` helper to avoid duplicating the serialize logic between `time` and `timetz`. ## Tests added - `packages/zero-cache/src/types/pg.test.ts`: `serializeTime` behavior (string passthrough, number conversion, unsupported type errors, round-trip), and timezone offset handling in `postgresTimeToMilliseconds` - `packages/z2s/src/sql.pg.test.ts` / `compiler.pg.test.ts`: integration tests against a real Postgres instance covering `time` and `timetz` read/write/filter --------- Co-authored-by: Erik Arvidsson --- packages/z2s/package.json | 8 ++ packages/z2s/src/compiler.output.test.ts | 49 +++++++++- packages/z2s/src/compiler.pg.test.ts | 111 +++++++++++++++++++++++ packages/z2s/src/compiler.ts | 47 +++++++--- packages/z2s/src/sql.pg.test.ts | 39 +++++++- packages/z2s/src/sql.test.ts | 36 ++++---- packages/z2s/src/sql.ts | 23 ++++- packages/zero-cache/src/test/db.ts | 8 +- packages/zero-cache/src/types/pg.test.ts | 83 +++++++++++++++++ packages/zero-cache/src/types/pg.ts | 30 ++++-- 10 files changed, 383 insertions(+), 51 deletions(-) create mode 100644 packages/z2s/src/compiler.pg.test.ts diff --git a/packages/z2s/package.json b/packages/z2s/package.json index abad25f976..865f5ef283 100644 --- a/packages/z2s/package.json +++ b/packages/z2s/package.json @@ -11,6 +11,14 @@ "check-types:watch": "tsc --watch", "lint": "oxlint --type-aware src/", "test": "vitest run", + "test:no-pg": "vitest run --project z2s/no-pg", + "test:no-pg:watch": "vitest --project z2s/no-pg", + "test:pg15": "vitest run --project z2s/pg-15", + "test:pg15:watch": "vitest --project z2s/pg-15", + "test:pg16": "vitest run --project z2s/pg-16", + "test:pg16:watch": "vitest --project z2s/pg-16", + "test:pg17": "vitest run --project z2s/pg-17", + "test:pg17:watch": "vitest --project z2s/pg-17", "test:watch": "vitest watch" }, "dependencies": { diff --git a/packages/z2s/src/compiler.output.test.ts b/packages/z2s/src/compiler.output.test.ts index 781f728e79..b91e7d045a 100644 --- a/packages/z2s/src/compiler.output.test.ts +++ b/packages/z2s/src/compiler.output.test.ts @@ -98,6 +98,16 @@ const timestampsTable = table('timestampsTable') }) .primaryKey('id'); +const timesTable = table('timesTable') + .columns({ + id: string(), + timeWithTz: number(), + timeWithTzArray: json(), + timeWithoutTz: number(), + timeWithoutTzArray: json(), + }) + .primaryKey('id'); + const alternateUser = table('alternate_user') .from('alternate_schema.user') .columns({ @@ -117,6 +127,7 @@ const schema = createSchema({ childTable, enumTable, timestampsTable, + timesTable, alternateUser, ], }); @@ -166,6 +177,13 @@ const serverSchema: ServerSchema = { timestampWithTz: {type: 'timestamptz', isArray: false, isEnum: false}, timestampWithTzArray: {type: 'timestamptz', isArray: true, isEnum: false}, }, + 'timesTable': { + id: {type: 'text', isArray: false, isEnum: false}, + timeWithoutTz: {type: 'time', isArray: false, isEnum: false}, + timeWithoutTzArray: {type: 'time', isArray: true, isEnum: false}, + timeWithTz: {type: 'timetz', isArray: false, isEnum: false}, + timeWithTzArray: {type: 'timetz', isArray: true, isEnum: false}, + }, 'alternate_schema.user': { id: {type: 'text', isArray: false, isEnum: false}, name: {type: 'text', isArray: false, isEnum: false}, @@ -378,7 +396,7 @@ test('compile with timestamp (with timezone)', () => { { "text": "SELECT COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" - FROM (SELECT "timestampsTable_0"."id" as "id",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000 as "timestampWithTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" + FROM (SELECT "timestampsTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000)::bigint + 86400000) % 86400000 as "timestampWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" FROM "timestampsTable" AS "timestampsTable_0" WHERE "timestampsTable_0"."timestampWithTz" = to_timestamp($1::text::bigint / 1000.0) @@ -409,7 +427,7 @@ test('compile with timestamp array (with timezone)', () => { { "text": "SELECT COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" - FROM (SELECT "timestampsTable_0"."id" as "id",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000 as "timestampWithTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" + FROM (SELECT "timestampsTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000)::bigint + 86400000) % 86400000 as "timestampWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" FROM "timestampsTable" AS "timestampsTable_0" WHERE "timestampsTable_0"."timestampWithTzArray" = ARRAY( SELECT to_timestamp(value::text::bigint / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) @@ -442,7 +460,7 @@ test('compile with timestamp (without timezone)', () => { { "text": "SELECT COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" - FROM (SELECT "timestampsTable_0"."id" as "id",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000 as "timestampWithTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" + FROM (SELECT "timestampsTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000)::bigint + 86400000) % 86400000 as "timestampWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" FROM "timestampsTable" AS "timestampsTable_0" WHERE "timestampsTable_0"."timestampWithoutTz" = to_timestamp($1::text::bigint / 1000.0) AT TIME ZONE 'UTC' @@ -473,7 +491,7 @@ test('compile with timestamp (without timezone) array', () => { { "text": "SELECT COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" - FROM (SELECT "timestampsTable_0"."id" as "id",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000 as "timestampWithTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" + FROM (SELECT "timestampsTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000)::bigint + 86400000) % 86400000 as "timestampWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" FROM "timestampsTable" AS "timestampsTable_0" WHERE "timestampsTable_0"."timestampWithoutTzArray" = ARRAY( SELECT to_timestamp(value::text::bigint / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) @@ -488,6 +506,29 @@ test('compile with timestamp (without timezone) array', () => { `); }); +test('compile with time/timetz projects milliseconds', () => { + expect( + formatPgInternalConvert( + compile(serverSchema, schema, { + table: 'timesTable', + related: [], + }), + ), + ).toMatchInlineSnapshot(` + { + "text": "SELECT + COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" + FROM (SELECT "timesTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timesTable_0"."timeWithTz") * 1000)::bigint + 86400000) % 86400000 as "timeWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timesTable_0"."timeWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timeWithTzArray",EXTRACT(EPOCH FROM "timesTable_0"."timeWithoutTz") * 1000 as "timeWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timesTable_0"."timeWithoutTzArray")) * 1000) as "timeWithoutTzArray" + FROM "timesTable" AS "timesTable_0" + + + ORDER BY "timesTable_0"."id" ASC NULLS FIRST + ) "zql_root"", + "values": [], + } + `); +}); + test('any', () => { expect( formatPgInternalConvert( diff --git a/packages/z2s/src/compiler.pg.test.ts b/packages/z2s/src/compiler.pg.test.ts new file mode 100644 index 0000000000..b71cee8ebd --- /dev/null +++ b/packages/z2s/src/compiler.pg.test.ts @@ -0,0 +1,111 @@ +import type {JSONValue} from 'postgres'; +import {afterAll, beforeAll, describe, expect, test} from 'vitest'; +import {createSchema} from '../../zero-schema/src/builder/schema-builder.ts'; +import { + json, + number, + string, + table, +} from '../../zero-schema/src/builder/table-builder.ts'; +import type {ServerSchema} from '../../zero-types/src/server-schema.ts'; +import {testDBs} from '../../zero-cache/src/test/db.ts'; +import type {PostgresDB} from '../../zero-cache/src/types/pg.ts'; +import {compile, extractZqlResult} from './compiler.ts'; +import {formatPgInternalConvert} from './sql.ts'; + +const DB_NAME = 'compiler-test'; + +const timesTable = table('timesTable') + .from('times') + .columns({ + id: string(), + timeWithoutTz: number().from('time_without_tz'), + timeWithoutTzArray: json().from('time_without_tz_array'), + timeWithTz: number().from('time_with_tz'), + timeWithTzArray: json().from('time_with_tz_array'), + }) + .primaryKey('id'); + +const schema = createSchema({tables: [timesTable]}); + +const serverSchema: ServerSchema = { + times: { + id: {type: 'text', isArray: false, isEnum: false}, + time_without_tz: {type: 'time', isArray: false, isEnum: false}, + time_without_tz_array: {type: 'time', isArray: true, isEnum: false}, + time_with_tz: {type: 'timetz', isArray: false, isEnum: false}, + time_with_tz_array: {type: 'timetz', isArray: true, isEnum: false}, + }, +}; + +describe('compiler with PostgreSQL', () => { + let pg: PostgresDB; + + beforeAll(async () => { + pg = await testDBs.create(DB_NAME); + await pg.unsafe("SET TIME ZONE 'UTC'"); + await pg.unsafe(` + CREATE TABLE times ( + id TEXT PRIMARY KEY, + time_without_tz TIME NOT NULL, + time_without_tz_array TIME[] NOT NULL, + time_with_tz TIMETZ NOT NULL, + time_with_tz_array TIMETZ[] NOT NULL + ); + + INSERT INTO times ( + id, + time_without_tz, + time_without_tz_array, + time_with_tz, + time_with_tz_array + ) VALUES ( + 'row1', + '09:08:07.654', + ARRAY['09:08:07.654'::time, '00:00:00'::time], + '01:00:00+02', + ARRAY['01:00:00+02'::timetz, '23:00:00-02'::timetz] + ); + `); + }); + + afterAll(async () => { + await testDBs.drop(pg); + }); + + test('compiled reads match canonical PG time parsing', async () => { + const raw = await pg.unsafe(` + SELECT + id, + time_without_tz AS "timeWithoutTz", + time_without_tz_array AS "timeWithoutTzArray", + time_with_tz AS "timeWithTz", + time_with_tz_array AS "timeWithTzArray" + FROM times + ORDER BY id + `); + + expect(raw).toEqual([ + { + id: 'row1', + timeWithoutTz: 32887654, + timeWithoutTzArray: [32887654, 0], + timeWithTz: 82800000, + timeWithTzArray: [82800000, 3600000], + }, + ]); + + const sqlQuery = formatPgInternalConvert( + compile(serverSchema, schema, { + table: 'timesTable', + related: [], + }), + ); + + const compiled = extractZqlResult( + await pg.unsafe(sqlQuery.text, sqlQuery.values as JSONValue[]), + ); + + expect(compiled).toEqual(raw); + }); +}); diff --git a/packages/z2s/src/compiler.ts b/packages/z2s/src/compiler.ts index 0f4887e26d..08aa7dc7bc 100644 --- a/packages/z2s/src/compiler.ts +++ b/packages/z2s/src/compiler.ts @@ -625,20 +625,43 @@ function selectIdent(server: ServerSpec, column: QualifiedColumn): SQLQuery { server.mapper.columnName(column.table.zql, column.zql) ]; const serverType = serverColumnSchema.type; - if ( - !serverColumnSchema.isEnum && - (serverType === 'date' || - serverType === 'timestamp' || - serverType === 'timestamp without time zone' || - serverType === 'timestamptz' || - serverType === 'timestamp with time zone') - ) { - if (serverColumnSchema.isArray) { - // Map EXTRACT(EPOCH FROM ...) * 1000 over array elements - return sql`ARRAY(SELECT EXTRACT(EPOCH FROM unnest(${colIdent(server, column)})) * 1000) as ${sql.ident(column.zql)}`; + if (!serverColumnSchema.isEnum) { + let needsNormalization = false; + switch (serverType) { + case 'timestamptz': + // @ts-expect-error Fallthrough intended + case 'timetz': + needsNormalization = true; + // fallthrough + + case 'date': + case 'time': + case 'time without time zone': + case 'time with time zone': + case 'timestamp': + case 'timestamp without time zone': + case 'timestamp with time zone': { + // EXTRACT(EPOCH FROM timetz) can be negative when the UTC offset is + // positive (e.g. 01:00+02 = 23:00 UTC prev day = -3600s). Wrap with + // modular arithmetic to normalize to 0..86400000. + const toMs = (epochExpr: SQLQuery): SQLQuery => + needsNormalization + ? sql`((${epochExpr})::bigint + 86400000) % 86400000` + : epochExpr; + + if (serverColumnSchema.isArray) { + return sql`ARRAY(SELECT ${toMs( + sql`EXTRACT(EPOCH FROM unnest(${colIdent(server, column)})) * 1000`, + )}) as ${sql.ident(column.zql)}`; + } + + return sql`${toMs( + sql`EXTRACT(EPOCH FROM ${colIdent(server, column)}) * 1000`, + )} as ${sql.ident(column.zql)}`; + } } - return sql`EXTRACT(EPOCH FROM ${colIdent(server, column)}) * 1000 as ${sql.ident(column.zql)}`; } + return sql`${colIdent(server, column)} as ${sql.ident(column.zql)}`; } diff --git a/packages/z2s/src/sql.pg.test.ts b/packages/z2s/src/sql.pg.test.ts index dd4bdd48c5..ed5139b4ef 100644 --- a/packages/z2s/src/sql.pg.test.ts +++ b/packages/z2s/src/sql.pg.test.ts @@ -1,6 +1,6 @@ import type {SQLQuery} from '@databases/sql'; import type {JSONValue} from 'postgres'; -import {beforeAll, describe, expect, test} from 'vitest'; +import {afterAll, beforeAll, describe, expect, test} from 'vitest'; import {testDBs} from '../../zero-cache/src/test/db.ts'; import type {PostgresDB} from '../../zero-cache/src/types/pg.ts'; import {formatPgInternalConvert, sql, sqlConvertColumnArg} from './sql.ts'; @@ -23,6 +23,10 @@ beforeAll(async () => { `); }); +afterAll(async () => { + await testDBs.drop(pg); +}); + describe('SQL builder with PostgreSQL', () => { test('where & any', async () => { // Insert test data @@ -156,6 +160,39 @@ describe('SQL builder with PostgreSQL', () => { expect(result).toEqual([{content: value, summary: value}]); }, ); + + test.each([ + {type: 'time', value: 32887654}, + {type: 'timetz', value: 32887654}, + ] as const)( + 'numeric $type inserts round-trip as milliseconds', + async ({type, value}) => { + await using pg = await testDBs.create( + `${DB_NAME}_${type}`, + undefined, + {}, + ); + + const table = `round_trip_${type}`; + await pg.unsafe(` + SET TIME ZONE 'UTC'; + DROP TABLE IF EXISTS "${table}"; + CREATE TABLE "${table}" ( + value ${type.toUpperCase()} NOT NULL + ); + `); + + const stmt = formatPgInternalConvert(sql` + INSERT INTO ${sql.ident(table)} (value) + VALUES (${sqlConvertArg(type, value)}) + RETURNING value + `); + + const result = await pg.unsafe(stmt.text, stmt.values as JSONValue[]); + + expect(result).toEqual([{value}]); + }, + ); }); const pluralComparison = { diff --git a/packages/z2s/src/sql.test.ts b/packages/z2s/src/sql.test.ts index 0b447ba829..fb3706c230 100644 --- a/packages/z2s/src/sql.test.ts +++ b/packages/z2s/src/sql.test.ts @@ -465,15 +465,15 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "timestamp" = ARRAY( - SELECT to_timestamp(value::text::bigint / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) - )", - "values": [ - "[1712345678901,1712345678902]", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "timestamp" = ARRAY( + SELECT to_timestamp(value::text::bigint / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) + )", + "values": [ + "[1712345678901,1712345678902]", + ], + } + `); }); test('timestamptz[] type', () => { @@ -491,15 +491,15 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "timestampz" = ARRAY( - SELECT to_timestamp(value::text::bigint / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) - )", - "values": [ - "[1712345678901,1712345678902]", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "timestampz" = ARRAY( + SELECT to_timestamp(value::text::bigint / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) + )", + "values": [ + "[1712345678901,1712345678902]", + ], + } + `); }); }); diff --git a/packages/z2s/src/sql.ts b/packages/z2s/src/sql.ts index 660b5193d4..8e80311f03 100644 --- a/packages/z2s/src/sql.ts +++ b/packages/z2s/src/sql.ts @@ -196,14 +196,29 @@ function formatCommonToSingularAndPlural( // being bool/json/numeric/whatever and the bindings try to coerce // the inputs to those types. const valuePlaceholder = arg.plural ? 'value' : `$${index}`; + let atTimeZone = ` AT TIME ZONE 'UTC'`; switch (arg.type) { + case 'timestamptz': + // @ts-expect-error Fallthrough intended + case 'timestamp with time zone': + atTimeZone = ''; + // fallthrough + case 'date': case 'timestamp': case 'timestamp without time zone': - return `to_timestamp(${valuePlaceholder}::text::bigint / 1000.0) AT TIME ZONE 'UTC'`; - case 'timestamptz': - case 'timestamp with time zone': - return `to_timestamp(${valuePlaceholder}::text::bigint / 1000.0)`; + return `to_timestamp(${valuePlaceholder}::text::bigint / 1000.0)${atTimeZone}`; + + case 'timetz': + // @ts-expect-error Fallthrough intended + case 'time with time zone': + atTimeZone = ''; + // fallthrough + + case 'time': + case 'time without time zone': + return `(${valuePlaceholder}::text::int * interval'1ms')::time${atTimeZone}`; + // uuid: cast to native uuid type for proper comparison and index usage case 'uuid': return `${valuePlaceholder}::text::uuid`; diff --git a/packages/zero-cache/src/test/db.ts b/packages/zero-cache/src/test/db.ts index ffe7b34661..b1cb07fc0d 100644 --- a/packages/zero-cache/src/test/db.ts +++ b/packages/zero-cache/src/test/db.ts @@ -59,7 +59,7 @@ export class TestDBs { database: string, onNotice?: OnNoticeFn, typeOpts: TypeOptions | false = {}, - ): Promise { + ): Promise { const exists = this.#dbs[database]; if (exists !== undefined) { console.warn('dropping database', database); @@ -84,7 +84,11 @@ export class TestDBs { ...(typeOpts ? postgresTypeConfig(typeOpts) : {}), }); this.#dbs[database] = db; - return db; + return Object.assign(db, { + [Symbol.asyncDispose]: async () => { + await this.#drop(db); + }, + }); } async drop(...dbs: postgres.Sql[]) { diff --git a/packages/zero-cache/src/types/pg.test.ts b/packages/zero-cache/src/types/pg.test.ts index eddbcf2c26..9726f3bde5 100644 --- a/packages/zero-cache/src/types/pg.test.ts +++ b/packages/zero-cache/src/types/pg.test.ts @@ -2,6 +2,7 @@ import {describe, expect, test} from 'vitest'; import { millisecondsToPostgresTime, postgresTimeToMilliseconds, + postgresTypeConfig, timestampToFpMillis, } from './pg.ts'; @@ -347,4 +348,86 @@ describe('postgresTimeToMilliseconds', () => { expect(postgresTimeToMilliseconds(input)).toBe(expected); }); }); + + describe('timezone offset handling', () => { + test.each([ + // UTC offset - no change + ['UTC +00', '12:00:00+00', 43200000], + // Positive offsets subtract from UTC + ['positive offset +01', '12:00:00+01', 39600000], + ['positive offset +05:30', '12:00:00+05:30', 23400000], + ['positive offset +14', '12:00:00+14', 79200000], // normalizes (wraps to 22:00) + // Negative offsets add to UTC + ['negative offset -05', '12:00:00-05', 61200000], + ['negative offset -05:30', '12:00:00-05:30', 63000000], + // Normalization: result < 0 wraps to previous day + ['midnight UTC+01 wraps to 23:00', '00:00:00+01', 82800000], + ['midnight UTC+05:30 wraps', '00:00:00+05:30', 66600000], + // Normalization: result > 24h wraps forward + ['23:00 UTC-02 wraps to 01:00 next day', '23:00:00-02', 3600000], + ])('should apply timezone offset: %s', (_caseName, input, expected) => { + expect(postgresTimeToMilliseconds(input)).toBe(expected); + }); + }); +}); + +describe('serializeTime (via postgresTypeConfig)', () => { + const {time, timetz} = postgresTypeConfig().types; + + describe('string inputs are passed through unchanged', () => { + test.each([ + ['plain time string', '12:34:56'], + ['time with milliseconds', '12:34:56.789'], + ['time with UTC offset', '12:34:56+00'], + ['time with positive offset', '12:34:56+05:30'], + ['time with negative offset', '12:34:56-08'], + ['midnight', '00:00:00'], + ])('%s', (_caseName, input) => { + expect(time.serialize(input)).toBe(input); + expect(timetz.serialize(input)).toBe(input); + }); + }); + + describe('number inputs are converted via millisecondsToPostgresTime', () => { + test.each([ + ['midnight (0)', 0, '00:00:00.000+00'], + ['1 hour', 3600000, '01:00:00.000+00'], + ['noon', 43200000, '12:00:00.000+00'], + [ + 'complex time', + 12 * 3600000 + 34 * 60000 + 56 * 1000 + 789, + '12:34:56.789+00', + ], + ['max value', 86399999, '23:59:59.999+00'], + ])('%s', (_caseName, input, expected) => { + expect(time.serialize(input)).toBe(expected); + expect(timetz.serialize(input)).toBe(expected); + }); + }); + + describe('unsupported input types throw', () => { + test.each([ + ['boolean true', true], + ['boolean false', false], + ['plain object', {}], + ['array', []], + ['null', null], + ])('%s', (_caseName, input) => { + expect(() => time.serialize(input)).toThrow(/Unsupported type/); + expect(() => timetz.serialize(input)).toThrow(/Unsupported type/); + }); + }); + + describe('round trip: serialize then parse', () => { + test.each([ + ['midnight', 0], + ['one millisecond', 1], + ['noon', 43200000], + ['complex time', 45296789], + ['max', 86399999], + ])('%s', (_caseName, ms) => { + const serialized = time.serialize(ms) as string; + expect(postgresTimeToMilliseconds(serialized)).toBe(ms); + }); + }); }); diff --git a/packages/zero-cache/src/types/pg.ts b/packages/zero-cache/src/types/pg.ts index 218133eba2..db23fac313 100644 --- a/packages/zero-cache/src/types/pg.ts +++ b/packages/zero-cache/src/types/pg.ts @@ -81,6 +81,17 @@ function serializeTimestamp(val: unknown): string { } const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000; + +function serializeTime(x: unknown, type: 'time' | 'timetz'): string { + switch (typeof x) { + case 'string': + return x; // Let Postgres parse it + case 'number': + return millisecondsToPostgresTime(x); + } + throw new Error(`Unsupported type "${typeof x}" for ${type}: ${x}`); +} + export function millisecondsToPostgresTime(milliseconds: number): string { if (milliseconds < 0) { throw new Error('Milliseconds cannot be negative'); @@ -243,18 +254,17 @@ export const postgresTypeConfig = ({sendStringAsJson}: TypeOptions = {}) => ({ time: { to: TIME, from: [TIME, TIMETZ], - serialize: (x: unknown) => { - switch (typeof x) { - case 'string': - return x; // Let Postgres parse it - case 'number': - return millisecondsToPostgresTime(x); - } - - throw new Error(`Unsupported type "${typeof x}" for time: ${x}`); - }, + serialize: (x: unknown) => serializeTime(x, 'time'), parse: postgresTimeToMilliseconds, }, + + timetz: { + to: TIMETZ, + from: [TIME, TIMETZ], + serialize: (x: unknown) => serializeTime(x, 'timetz'), + parse: postgresTimeToMilliseconds, + }, + // The DATE type is stored directly as the PG normalized date string. date: { to: DATE, From b75d8481aff4782fe628cc72e06feccb329f40de Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 20 Mar 2026 12:12:44 -0700 Subject: [PATCH 159/495] feat: schema change hooks for publication changes (#5674) ## Feature Schema change hooks to work around supabase's [lack of event trigger support for publications](https://github.com/supabase/supautils/issues/123). To detect publication changes on supabase, the `ALTER PUBLICATION` statement must be bookend by `COMMENT ON PUBLICATION` statements within a transaction: ```sql BEGIN; COMMENT ON PUBLICATION zero_pub IS 'anything'; ALTER PUBLICATION zero_pub ADD TABLE ...; COMMENT ON PUBLICATION zero_pub IS 'anything'; ... other statements ... COMMIT; ``` * The `COMMENT` statements must be on the publication being modified. * All 3 statements must be in the same transaction. * The value of the comment is irrelevant; `NULL` is also fine. ### Non-supabase * `COMMENT` statements are safe (i.e. have no effect) if event triggers for publications actually work. ## Rollback Safety Changes to the messages emitted by event triggers is backwards compatible with previous versions of the processing code, allowing a rollback to one previous (minor) version. --- .../src/scripts/decommission.pg.test.ts | 1 + .../pg/change-source.end-to-mid.pg.test.ts | 149 ++++++++++++++++++ .../change-source/pg/change-source.ts | 83 +++++++--- .../change-source/pg/decommission.pg.test.ts | 1 + .../change-source/pg/schema/ddl.pg.test.ts | 101 +++++++++++- .../services/change-source/pg/schema/ddl.ts | 83 +++++++++- .../change-source/pg/schema/init.pg.test.ts | 10 +- .../services/change-source/pg/schema/init.ts | 20 ++- .../change-source/pg/schema/shard.pg.test.ts | 1 + 9 files changed, 410 insertions(+), 39 deletions(-) diff --git a/packages/zero-cache/src/scripts/decommission.pg.test.ts b/packages/zero-cache/src/scripts/decommission.pg.test.ts index cda5aed835..359ef94c92 100644 --- a/packages/zero-cache/src/scripts/decommission.pg.test.ts +++ b/packages/zero-cache/src/scripts/decommission.pg.test.ts @@ -79,6 +79,7 @@ describe('decommission', () => { ['zeroout_drop_index_13'], ['zeroout_alter_publication_13'], ['zeroout_alter_schema_13'], + ['zeroout_comment_13'], ]); expect( await upstream`SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'zeroout%'`.values(), diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts index 113940d488..dba37f1c0b 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.end-to-mid.pg.test.ts @@ -1809,6 +1809,155 @@ describe('change-source/pg/end-to-mid-test', {timeout: 30000}, () => { }, ], ], + [ + 'working ALTER PUBLICATION trigger not affected by surrounding COMMENTs', + /*sql*/ ` + COMMENT ON PUBLICATION zero_some_public IS 'bonk'; + ALTER PUBLICATION zero_some_public SET TABLE existing, TABLE existing_full, + TABLE foo (id, "newInt", flt); + COMMENT ON PUBLICATION zero_some_public IS 'bonk'; + `, + [ + [ + { + tag: 'add-column', + table: {schema: 'public', name: 'foo'}, + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, + backfill: {attNum: expect.any(Number)}, + }, + ], + [{tag: 'backfill-completed'}], + ], + {foo: []}, + [ + { + name: 'foo', + columns: { + id: { + characterMaximumLength: null, + dataType: 'text|NOT_NULL', + elemPgTypeClass: null, + dflt: null, + notNull: false, + pos: 1, + }, + ['_0_version']: { + characterMaximumLength: null, + dataType: 'TEXT', + elemPgTypeClass: null, + notNull: false, + pos: 2, + }, + flt: { + characterMaximumLength: null, + dataType: 'float8', + elemPgTypeClass: null, + dflt: null, + notNull: false, + pos: 3, + }, + newInt: { + characterMaximumLength: null, + dataType: 'int4', + elemPgTypeClass: null, + dflt: null, + notNull: false, + pos: 4, + }, + }, + }, + ], + [], + ], + [ + 'disable ALTER PUBLICATION trigger', + /*sql*/ `DROP EVENT TRIGGER ${APP_ID}_alter_publication_0;`, + [], + {}, + [], + [], + ], + // Cases hereafter no longer have the ALTER PUBLICATION TRIGGER + [ + 'missing ALTER PUBLICATION trigger covered by surrounding COMMENTs', + /*sql*/ ` + COMMENT ON PUBLICATION zero_some_public IS 'bonk'; + ALTER PUBLICATION zero_some_public SET TABLE existing, TABLE existing_full, + TABLE foo (id, "newInt", int, flt); + COMMENT ON PUBLICATION zero_some_public IS 'bonk'; + + -- Additional comments have no effect. + COMMENT ON PUBLICATION zero_some_public IS 'bonk'; + COMMENT ON PUBLICATION zero_some_public IS NULL; + `, + [ + [ + { + tag: 'add-column', + table: {schema: 'public', name: 'foo'}, + tableMetadata: { + schemaOID: expect.any(Number), + relationOID: expect.any(Number), + rowKey: {id: {attNum: 1}}, + }, + backfill: {attNum: expect.any(Number)}, + }, + ], + [{tag: 'backfill-completed'}], + ], + {foo: []}, + [ + { + name: 'foo', + columns: { + id: { + characterMaximumLength: null, + dataType: 'text|NOT_NULL', + elemPgTypeClass: null, + dflt: null, + notNull: false, + pos: 1, + }, + ['_0_version']: { + characterMaximumLength: null, + dataType: 'TEXT', + elemPgTypeClass: null, + notNull: false, + pos: 2, + }, + flt: { + characterMaximumLength: null, + dataType: 'float8', + elemPgTypeClass: null, + dflt: null, + notNull: false, + pos: 3, + }, + newInt: { + characterMaximumLength: null, + dataType: 'int4', + elemPgTypeClass: null, + dflt: null, + notNull: false, + pos: 4, + }, + int: { + characterMaximumLength: null, + dataType: 'int4', + elemPgTypeClass: null, + dflt: null, + notNull: false, + pos: 5, + }, + }, + }, + ], + [], + ], ] satisfies [ name: string, statements: string, diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 260921d375..965478894b 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -81,7 +81,11 @@ import type { } from './logical-replication/pgoutput.types.ts'; import {subscribe} from './logical-replication/stream.ts'; import {fromBigInt, toStateVersionString, type LSN} from './lsn.ts'; -import {replicationEventSchema, type DdlUpdateEvent} from './schema/ddl.ts'; +import { + replicationEventSchema, + type DdlUpdateEvent, + type SchemaSnapshotEvent, +} from './schema/ddl.ts'; import {updateShardSchema} from './schema/init.ts'; import { getPublicationInfo, @@ -662,7 +666,7 @@ class ChangeMaker { const errorDetails: JSONObject = {error: message}; if (err instanceof UnsupportedSchemaChangeError) { errorDetails.reason = err.description; - errorDetails.context = err.ddlUpdate.context; + errorDetails.context = err.event.context; } else { errorDetails.reason = String(err); } @@ -688,7 +692,7 @@ class ChangeMaker { err, )}`, err instanceof UnsupportedSchemaChangeError - ? err.ddlUpdate.context + ? err.event.context : // 'content' can be a large byte Buffer. Exclude it from logging output. {...msg, content: undefined}, ); @@ -747,13 +751,21 @@ class ChangeMaker { return [['data', {...msg, relations: msg.relations.map(makeRelation)}]]; case 'message': - if (msg.prefix !== this.#shardPrefix) { + if (!msg.prefix.startsWith(this.#shardPrefix)) { this.#lc.debug?.('ignoring message for different shard', msg.prefix); return []; } - return this.#handleCustomMessage(msg); + switch (msg.prefix.substring(this.#shardPrefix.length)) { + case '': // Legacy prefix + case '/ddl': + return this.#handleDdlMessage(msg); + default: + this.#lc.debug?.('ignoring unknown message type', msg.prefix); + return []; + } case 'commit': + this.#lastSnapshotInTx = undefined; return [ [ 'commit', @@ -777,23 +789,48 @@ class ChangeMaker { } #preSchema: PublishedSchema | undefined; + #lastSnapshotInTx: PublishedSchema | undefined; - #handleCustomMessage(msg: MessageMessage) { + #handleDdlMessage(msg: MessageMessage) { const event = this.#parseReplicationEvent(msg.content); // Cancel manual schema adjustment timeouts when an upstream schema change // is about to happen, so as to avoid interfering / redundant work. clearTimeout(this.#replicaIdentityTimer); - if (event.type === 'ddlStart') { - // Store the schema in order to diff it with a potential ddlUpdate. - this.#preSchema = event.schema; - return []; + let previousSchema: PublishedSchema | null; + const {type} = event; + switch (type) { + case 'ddlStart': + // Store the schema in order to diff it with a subsequent ddlUpdate. + this.#preSchema = event.schema; + return []; + case 'ddlUpdate': + // guaranteed by event triggers + previousSchema = must( + this.#preSchema, + `ddlUpdate received without a ddlStart`, + ); + break; + case 'schemaSnapshot': + previousSchema = this.#lastSnapshotInTx ?? null; + break; + default: // Ignore unknown types for forwards compatibility + this.#lc.info?.(`ignoring unknown ddl message type: ${type}`); + return []; + } + + // Store the schema (from either a ddlUpdate or schemaSnapshot) to + // diff against the next schemaSnapshot. + this.#lastSnapshotInTx = event.schema; + if (!previousSchema) { + this.#lc.info?.(`received ${msg.prefix}/${type} event`); + return []; // First schemaSnapshot in the tx. } - // ddlUpdate - const changes = this.#makeSchemaChanges( - must(this.#preSchema, `ddlUpdate received without a ddlStart`), - event, - ).map(change => ['data', change] satisfies Data); + this.#lc.info?.(`processing ${msg.prefix}/${type} event`, event); + + const changes = this.#makeSchemaChanges(previousSchema, event).map( + change => ['data', change] satisfies Data, + ); this.#lc .withContext('tag', event.event.tag) @@ -845,7 +882,7 @@ class ChangeMaker { */ #makeSchemaChanges( preSchema: PublishedSchema, - update: DdlUpdateEvent, + update: DdlUpdateEvent | SchemaSnapshotEvent, ): SchemaChange[] { try { const [prevTbl, prevIdx] = specsByID(preSchema); @@ -912,7 +949,8 @@ class ChangeMaker { }; if (!update.event.tag.startsWith('CREATE')) { // Tables introduced to the publication via ALTER statements - // must be backfilled. + // or the COMMENT statement (from schemaSnapshots) must be + // backfilled. createTable.backfill = mapValues(spec.columns, ({pos: attNum}) => ({ attNum, })) satisfies Record; @@ -992,10 +1030,11 @@ class ChangeMaker { } } - // All columns introduced by a publication change require backfill. + // All columns introduced by a publication change require backfill + // (which appear as ALTER PUBLICATION or COMMENT tags). // Columns created by ALTER TABLE, on the other hand, only require // backfill if they have non-constant defaults. - const alwaysBackfill = ddlTag === 'ALTER PUBLICATION'; + const alwaysBackfill = ddlTag !== 'ALTER TABLE'; // ADD for (const id of added) { @@ -1325,11 +1364,11 @@ function makeRelation(relation: PostgresRelation): MessageRelation { class UnsupportedSchemaChangeError extends Error { readonly name = 'UnsupportedSchemaChangeError'; readonly description: string; - readonly ddlUpdate: DdlUpdateEvent; + readonly event: DdlUpdateEvent | SchemaSnapshotEvent; constructor( description: string, - ddlUpdate: DdlUpdateEvent, + event: DdlUpdateEvent | SchemaSnapshotEvent, options?: ErrorOptions, ) { super( @@ -1337,7 +1376,7 @@ class UnsupportedSchemaChangeError extends Error { options, ); this.description = description; - this.ddlUpdate = ddlUpdate; + this.event = event; } } diff --git a/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts index fdc7ab11cc..0c1fbdbe45 100644 --- a/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/decommission.pg.test.ts @@ -58,6 +58,7 @@ describe('decommission', () => { ['zerooutcs_drop_index_13'], ['zerooutcs_alter_publication_13'], ['zerooutcs_alter_schema_13'], + ['zerooutcs_comment_13'], ]); expect( await upstream`SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'zerooutcs%'`.values(), diff --git a/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts index be0cdc9579..e1de063b42 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts @@ -14,8 +14,10 @@ import { createEventTriggerStatements, ddlStartEventSchema, ddlUpdateEventSchema, + schemaSnapshotEventSchema, type DdlStartEvent, type DdlUpdateEvent, + type SchemaSnapshotEvent, } from './ddl.ts'; const SLOT_NAME = 'ddl_test_slot'; @@ -70,11 +72,14 @@ describe('change-source/tables/ddl', () => { }; }); - async function drainReplicationMessages(num: number): Promise { + async function expectReplicationMessagesToMatchObject( + expected: unknown[], + ): Promise { const drained: Message[] = []; - while (drained.length < num) { + while (drained.length < expected.length) { drained.push(await messages.dequeue()); } + expect(drained).toMatchObject(expected); return drained; } @@ -1307,8 +1312,7 @@ describe('change-source/tables/ddl', () => { await tx.unsafe(query); }); - const messages = await drainReplicationMessages(6); - expect(messages).toMatchObject([ + const messages = await expectReplicationMessagesToMatchObject([ {tag: 'begin'}, {tag: 'relation'}, {tag: 'insert'}, @@ -1340,6 +1344,47 @@ describe('change-source/tables/ddl', () => { }, ); + test.each([ + [ + 'schema snapshot', + `COMMENT ON PUBLICATION zero_sum IS 'foo'`, + { + context: { + query: `COMMENT ON PUBLICATION zero_sum IS 'foo'`, + }, + type: 'schemaSnapshot', + version: 1, + event: {tag: 'COMMENT'}, + schema: DDL_START.schema, + }, + ], + ] satisfies [string, string, SchemaSnapshotEvent][])( + '%s', + async (_, query, schemaSnapshot) => { + await upstream.begin(async tx => { + await tx`INSERT INTO pub.boo(id) VALUES('1')`; + await tx.unsafe(query); + }); + + const messages = await expectReplicationMessagesToMatchObject([ + {tag: 'begin'}, + {tag: 'relation'}, + {tag: 'insert'}, + { + tag: 'message', + prefix: 'zap/0/ddl', + content: expect.any(Uint8Array), + flags: 1, + transactional: true, + }, + {tag: 'commit'}, + ]); + + const msg = messages[3] as MessageMessage; + expect(parseSchemaSnapshotEvent(msg)).toMatchObject(schemaSnapshot); + }, + ); + // Run the same DDL commands on tables in the "private" schema // (or the "nonzeropub" publication) and verify that they do not trigger // "ddlUpdate" events. @@ -1396,8 +1441,7 @@ describe('change-source/tables/ddl', () => { }); // There should only be a ddlStart message, and no ddlUpdate message. - const messages = await drainReplicationMessages(5); - expect(messages).toMatchObject([ + const messages = await expectReplicationMessagesToMatchObject([ {tag: 'begin'}, {tag: 'relation'}, {tag: 'insert'}, @@ -1423,6 +1467,41 @@ describe('change-source/tables/ddl', () => { }, ); + test.each([ + [ + `COMMENT ON TABLE zero.foo IS 'whatever';`, + [/ignoring COMMENT.*zero.foo/], + ], + [ + `COMMENT ON PUBLICATION nonzeropub IS 'whatever';`, + [/ignoring COMMENT.*nonzeropub/], + ], + ] satisfies [string, RegExp[]][])( + 'ignore unrelated comments: %s', + async (query, expectedNotices) => { + while (notices.size()) { + await notices.dequeue(); + } + + await upstream.begin(async tx => { + await tx`INSERT INTO pub.boo(id) VALUES('1')`; + await tx.unsafe(query); + }); + + await expectReplicationMessagesToMatchObject([ + {tag: 'begin'}, + {tag: 'relation'}, + {tag: 'insert'}, + {tag: 'commit'}, + ]); + + for (const n of expectedNotices) { + const notice = await notices.dequeue(); + expect(notice.message).toMatch(n); + } + }, + ); + test('postgres documentation: current_query() is unreliable', async () => { await upstream`CREATE PROCEDURE procedure_name() LANGUAGE SQL @@ -1433,8 +1512,7 @@ describe('change-source/tables/ddl', () => { `ALTER TABLE pub.foo ADD boo text; ALTER TABLE pub.foo DROP boo;`, ); - const messages = await drainReplicationMessages(10); - expect(messages).toMatchObject([ + const messages = await expectReplicationMessagesToMatchObject([ {tag: 'begin'}, { tag: 'message', @@ -1529,3 +1607,10 @@ function parseDDLUpdateEvent(msg: MessageMessage) { ddlUpdateEventSchema, ); } + +function parseSchemaSnapshotEvent(msg: MessageMessage) { + return v.parse( + JSON.parse(new TextDecoder().decode(msg.content)), + schemaSnapshotEventSchema, + ); +} diff --git a/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts b/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts index dbf4336f67..726bdfad76 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts @@ -60,9 +60,59 @@ export const ddlUpdateEventSchema = ddlEventSchema.extend({ export type DdlUpdateEvent = v.Infer; +/** + * The `schemaSnapshot` message is a snapshot of a schema taken in response to + * a `COMMENT ON PUBLICATION` command, which is a hook recognized by zero + * to manually emit schema snapshots to support detection of schema changes + * from `ALTER PUBLICATION` commands on supabase, which does not fire event + * triggers for them (https://github.com/supabase/supautils/issues/123). + * + * The hook is exercised by bookmarking the publication change with + * `COMMENT ON PUBLICATION` statements within e.g. + * + * ```sql + * BEGIN; + * COMMENT ON PUBLICATION my_publication IS 'whatever'; + * ALTER PUBLICATION my_publication ...; + * COMMENT ON PUBLICATION my_publication IS 'whatever'; + * COMMIT; + * ``` + * + * The `change-source` will perform the diff between a `schemaSnapshot` + * events and its preceding `schemaSnapshot` (or `ddlUpdate`) within the + * transaction. + * + * In the case where event trigger support is missing, this results in + * diffing the `schemaSnapshot`s before and after the `ALTER PUBLICATION` + * statement, thus effecting the same logic that would have been exercised + * between the `ddlStart` and `ddlEvent` events fired by a database with + * fully functional event triggers. + * + * Note that if the same transaction is run on a database that *does* + * support event triggers on `ALTER PUBLICATION` statements, the sequence + * of emitted messages will be: + * + * * `schemaSnapshot` + * * `ddlStart` + * * `ddlUpdate` + * * `schemaSnapshot` + * + * Since `schemaSnapshot` messages are diffed with the preceding + * `schemaSnapshot` or `ddlUpdate` event (if any), there will be no schema + * difference between the `ddlUpdate` and the second `schemaSnapshot`, and + * thus the extra `COMMENT` statements will effectively be no-ops. + */ +export const schemaSnapshotEventSchema = ddlEventSchema.extend({ + type: v.literal('schemaSnapshot'), + event: v.object({tag: v.string()}), +}); + +export type SchemaSnapshotEvent = v.Infer; + export const replicationEventSchema = v.union( ddlStartEventSchema, ddlUpdateEventSchema, + schemaSnapshotEventSchema, ); export type ReplicationEvent = v.Infer; @@ -162,6 +212,8 @@ DECLARE schema_specs TEXT; message TEXT; event TEXT; + event_type TEXT; + event_prefix TEXT; BEGIN publications := ARRAY[${lit(publications)}]; @@ -230,13 +282,34 @@ BEGIN RETURN; END IF; + ELSIF target.object_type = 'publication' THEN + SELECT 1 WHERE target.object_identity = ANY (publications) + INTO relevant; + IF relevant IS NULL THEN + PERFORM ${schema}.notice_ignore(tag, target); + RETURN; + END IF; + -- no-op CREATE IF NOT EXIST statements ELSIF tag LIKE 'CREATE %' AND target.object_type IS NULL THEN PERFORM ${schema}.notice_ignore(tag, target); RETURN; END IF; - RAISE INFO 'Creating ddlUpdate for % %', tag, row_to_json(target); + IF tag = 'COMMENT' THEN + -- Only make schemaSnapshots for COMMENT ON PUBLICATION + IF target.object_type != 'publication' THEN + PERFORM ${schema}.notice_ignore(tag, target); + RETURN; + END IF; + event_type := 'schemaSnapshot'; + event_prefix := '/ddl'; + ELSE + event_type := 'ddlUpdate'; + event_prefix := ''; -- TODO: Use '/ddl' for both when rollback safe + END IF; + + RAISE INFO 'Creating % for % %', event_type, tag, row_to_json(target); -- Construct and emit the DdlUpdateEvent message. SELECT json_build_object('tag', tag) INTO event; @@ -244,7 +317,7 @@ BEGIN SELECT ${schema}.schema_specs() INTO schema_specs; SELECT json_build_object( - 'type', 'ddlUpdate', + 'type', event_type, 'version', ${PROTOCOL_VERSION}, 'schema', schema_specs::json, 'event', event::json, @@ -253,7 +326,7 @@ BEGIN PERFORM pg_logical_emit_message(true, ${lit( `${appID}/${shardNum}`, - )}, message); + )} || event_prefix, message); END $$ LANGUAGE plpgsql; `; @@ -295,7 +368,7 @@ CREATE EVENT TRIGGER ${sharded(`${appID}_ddl_start`)} `); // A per-tag ddl_command_end trigger that dispatches to ${schema}.emit_ddl_end(tag) - for (const tag of TAGS) { + for (const tag of [...TAGS, 'COMMENT']) { const tagID = tag.toLowerCase().replace(' ', '_'); triggers.push(/*sql*/ ` CREATE OR REPLACE FUNCTION ${schema}.emit_${tagID}() @@ -326,7 +399,7 @@ export function dropEventTriggerStatements( `); // A per-tag ddl_command_end trigger that dispatches to ${schema}.emit_ddl_end(tag) - for (const tag of TAGS) { + for (const tag of [...TAGS, 'COMMENT']) { const tagID = tag.toLowerCase().replace(' ', '_'); stmts.push(/*sql*/ ` DROP EVENT TRIGGER IF EXISTS ${id(`${appID}_${tagID}_${shardID}`)}; diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts index d777c34a29..7de4b65308 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.pg.test.ts @@ -13,7 +13,11 @@ import { } from '../../../../test/db.ts'; import type {PostgresDB} from '../../../../types/pg.ts'; import {id} from '../../../../types/sql.ts'; -import {ensureShardSchema, updateShardSchema} from './init.ts'; +import { + CURRENT_SCHEMA_VERSION, + ensureShardSchema, + updateShardSchema, +} from './init.ts'; import {addReplica, metadataPublicationName} from './shard.ts'; const APP_ID = 'zappz'; @@ -21,8 +25,8 @@ const SHARD_NUM = 23; // Update as necessary. const CURRENT_SCHEMA_VERSIONS = { - dataVersion: 16, - schemaVersion: 16, + dataVersion: CURRENT_SCHEMA_VERSION, + schemaVersion: CURRENT_SCHEMA_VERSION, minSafeVersion: 1, lock: 'v', } as const; diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.ts index a9ab8b2466..5ff706f815 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.ts @@ -239,7 +239,16 @@ function getIncrementalMigrations( // Upgrade DDL trigger to fire on all ALTER TABLE statements // to catch the *removal* of a table from the published set. - 16: { + // (subsumed by v17) + 16: {}, + + // Upgrade DDL triggers to support the COMMENT ON PUBLICATION hook for + // working around the lack of event trigger support for PUBLICATION + // changes in supabase. + // + // This also adds forwards-compatible support for hierarchical logical + // message prefixes and unknown ddl event types. + 17: { migrateSchema: async (lc, sql) => { const [{publications}] = await sql<{publications: string[]}[]>` SELECT publications FROM ${sql(shardConfigTable)}`; @@ -250,6 +259,15 @@ function getIncrementalMigrations( }; } +// Referenced in tests. +export const CURRENT_SCHEMA_VERSION = Object.keys( + getIncrementalMigrations({ + appID: 'unused', + shardNum: 0, + publications: ['foo'], + }), +).reduce((prev, curr) => Math.max(prev, parseInt(curr)), 0); + export async function decommissionLegacyShard( lc: LogContext, db: PostgresDB, diff --git a/packages/zero-cache/src/services/change-source/pg/schema/shard.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/shard.pg.test.ts index 69e1db8508..587b56dbf3 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/shard.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/shard.pg.test.ts @@ -93,6 +93,7 @@ describe('change-source/pg', () => { 'zro_drop_index_0', 'zro_alter_publication_0', 'zro_alter_schema_0', + 'zro_comment_0', ]); }); From c97592077b2deff0c24a35672582aab8aa9796e1 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 20 Mar 2026 14:57:12 -0700 Subject: [PATCH 160/495] chore: publish a successful replication status after recovering (#5675) --- packages/zero-cache/src/server/change-streamer.ts | 12 ++++++++++-- .../change-streamer-service.pg.test.ts | 9 +++++++++ .../change-streamer/change-streamer-service.ts | 11 +++++++++++ .../src/services/replicator/replication-status.ts | 6 +++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index eb82309a86..22e910118c 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -1,6 +1,6 @@ import {assert} from '../../../shared/src/asserts.ts'; import {must} from '../../../shared/src/must.ts'; -import {DatabaseInitError} from '../../../zqlite/src/db.ts'; +import {Database, DatabaseInitError} from '../../../zqlite/src/db.ts'; import {getServerContext} from '../config/server-context.ts'; import {getNormalizedZeroConfig} from '../config/zero-config.ts'; import {deleteLiteDB} from '../db/delete-lite-db.ts'; @@ -18,7 +18,10 @@ import { CHANGE_STREAMER_APP_NAME, } from '../services/change-streamer/schema/tables.ts'; import {exitAfter, runUntilKilled} from '../services/life-cycle.ts'; -import {replicationStatusError} from '../services/replicator/replication-status.ts'; +import { + replicationStatusError, + ReplicationStatusPublisher, +} from '../services/replicator/replication-status.ts'; import {pgClient} from '../types/pg.ts'; import { parentWorker, @@ -99,6 +102,10 @@ export default async function runWorker( context, ); + const replicationStatusPublisher = new ReplicationStatusPublisher( + new Database(lc, replica.file, {readonly: true}), + ); + changeStreamer = await initializeStreamer( lc, shard, @@ -107,6 +114,7 @@ export default async function runWorker( protocol, changeDB, changeSource, + replicationStatusPublisher, subscriptionState, autoReset ?? false, backPressureLimitHeapProportion, diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index dd063f6993..a02d988d15 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -15,6 +15,7 @@ import type {Source} from '../../types/streams.ts'; import {Subscription, type Result} from '../../types/subscription.ts'; import {type ChangeStreamMessage} from '../change-source/protocol/current/downstream.ts'; import type {UpstreamStatusMessage} from '../change-source/protocol/current/status.ts'; +import {ReplicationStatusPublisher} from '../replicator/replication-status.ts'; import { getSubscriptionState, initReplicationState, @@ -76,6 +77,7 @@ describe('change-streamer/service', () => { acks: {push: status => acks.enqueue(status)}, }), }, + ReplicationStatusPublisher.forTesting(), replicaConfig, true, 0.04, @@ -908,6 +910,7 @@ describe('change-streamer/service', () => { 'ws', sql, source, + ReplicationStatusPublisher.forTesting(), replicaConfig, true, 0.04, @@ -934,6 +937,7 @@ describe('change-streamer/service', () => { 'ws', sql, source, + ReplicationStatusPublisher.forTesting(), replicaConfig, true, 0.04, @@ -957,6 +961,7 @@ describe('change-streamer/service', () => { 'ws', sql, source, + ReplicationStatusPublisher.forTesting(), replicaConfig, true, 0.04, @@ -993,6 +998,7 @@ describe('change-streamer/service', () => { 'ws', sql, source, + ReplicationStatusPublisher.forTesting(), replicaConfig, true, 0.04, @@ -1031,6 +1037,7 @@ describe('change-streamer/service', () => { 'ws', sql, source, + ReplicationStatusPublisher.forTesting(), replicaConfig, true, 0.04, @@ -1086,6 +1093,7 @@ describe('change-streamer/service', () => { 'ws', sql, source, + ReplicationStatusPublisher.forTesting(), replicaConfig, true, 0.04, @@ -1158,6 +1166,7 @@ describe('change-streamer/service', () => { 'ws', sql, source, + ReplicationStatusPublisher.forTesting(), replicaConfig, true, 0.04, diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 926656a767..18ac6ee0be 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -25,6 +25,7 @@ import { import { publishReplicationError, replicationStatusError, + type ReplicationStatusPublisher, } from '../replicator/replication-status.ts'; import type {SubscriptionState} from '../replicator/schema/replication-state.ts'; import { @@ -59,6 +60,7 @@ export async function initializeStreamer( discoveryProtocol: string, changeDB: PostgresDB, changeSource: ChangeSource, + replicationStatusPublisher: ReplicationStatusPublisher, subscriptionState: SubscriptionState, autoReset: boolean, backPressureLimitHeapProportion: number, @@ -86,6 +88,7 @@ export async function initializeStreamer( changeDB, replicaVersion, changeSource, + replicationStatusPublisher, autoReset, backPressureLimitHeapProportion, flowControlConsensusPaddingSeconds, @@ -252,6 +255,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { readonly #source: ChangeSource; readonly #storer: Storer; readonly #forwarder: Forwarder; + readonly #replicationStatusPublisher: ReplicationStatusPublisher; readonly #autoReset: boolean; readonly #state: RunningState; @@ -284,6 +288,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { changeDB: PostgresDB, replicaVersion: string, source: ChangeSource, + replicationStatusPublisher: ReplicationStatusPublisher, autoReset: boolean, backPressureLimitHeapProportion: number, flowControlConsensusPaddingSeconds: number, @@ -310,6 +315,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { this.#forwarder = new Forwarder(lc, { flowControlConsensusPaddingSeconds, }); + this.#replicationStatusPublisher = replicationStatusPublisher; this.#autoReset = autoReset; this.#state = new RunningState(this.id, undefined, setTimeoutFn); } @@ -342,6 +348,11 @@ class ChangeStreamerImpl implements ChangeStreamerService { this.#stream = stream; this.#state.resetBackoff(); + this.#replicationStatusPublisher.publish( + this.#lc, + 'Replicating', + `Replicating from ${lastWatermark}`, + ); watermark = null; for await (const change of stream.changes) { diff --git a/packages/zero-cache/src/services/replicator/replication-status.ts b/packages/zero-cache/src/services/replicator/replication-status.ts index 2f1398bce0..2213056cd6 100644 --- a/packages/zero-cache/src/services/replicator/replication-status.ts +++ b/packages/zero-cache/src/services/replicator/replication-status.ts @@ -9,7 +9,7 @@ import type { ReplicationStatusEvent, Status, } from '../../../../zero-events/src/status.ts'; -import type {Database} from '../../../../zqlite/src/db.ts'; +import {Database} from '../../../../zqlite/src/db.ts'; import {computeZqlSpecs, listIndexes} from '../../db/lite-tables.ts'; import type {LiteTableSpec} from '../../db/specs.ts'; import { @@ -25,6 +25,10 @@ export class ReplicationStatusPublisher { readonly #publish: typeof publishCriticalEvent; #timer: NodeJS.Timeout | undefined; + static forTesting(lc: LogContext = createSilentLogContext(), db?: Database) { + return new ReplicationStatusPublisher(db ?? new Database(lc, ':memory:')); + } + constructor(db: Database, publishFn = publishCriticalEvent) { this.#db = db; this.#publish = publishFn; From 1baf074ccfdb11a982fed2b89c1ceb63f6832a3a Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 20 Mar 2026 15:43:16 -0700 Subject: [PATCH 161/495] chore: reduce boilerplate in event trigger code (#5676) Pure refactoring --- .../services/change-source/pg/schema/ddl.ts | 29 ++++--------------- .../services/change-source/pg/schema/init.ts | 25 +++++++--------- 2 files changed, 16 insertions(+), 38 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts b/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts index 726bdfad76..3ad41e3463 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/ddl.ts @@ -222,6 +222,7 @@ BEGIN LIMIT 1 INTO target; -- Filter DDL updates that are not relevant to the shard (i.e. publications) when possible. + SELECT true INTO relevant; -- Note: ALTER TABLE statements may *remove* the table from the set of published -- tables, and there is no way to determine if the table "used to be" in the @@ -234,10 +235,6 @@ BEGIN JOIN pg_publication_tables AS pb ON pb.schemaname = ns.nspname AND pb.tablename = c.relname WHERE c.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; - IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(tag, target); - RETURN; - END IF; ELSIF target.object_type = 'index' THEN SELECT ns.nspname AS "schema", c.relname AS "name" FROM pg_class AS c @@ -246,30 +243,18 @@ BEGIN JOIN pg_publication_tables AS pb ON pb.schemaname = ns.nspname AND pb.tablename = ind.tablename WHERE c.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; - IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(tag, target); - RETURN; - END IF; ELSIF target.object_type = 'publication relation' THEN SELECT pb.pubname FROM pg_publication_rel AS rel JOIN pg_publication AS pb ON pb.oid = rel.prpubid WHERE rel.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; - IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(tag, target); - RETURN; - END IF; ELSIF target.object_type = 'publication namespace' THEN SELECT pb.pubname FROM pg_publication_namespace AS ns JOIN pg_publication AS pb ON pb.oid = ns.pnpubid WHERE ns.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; - IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(tag, target); - RETURN; - END IF; ELSIF target.object_type = 'schema' THEN SELECT ns.nspname AS "schema", c.relname AS "name" FROM pg_class AS c @@ -277,21 +262,17 @@ BEGIN JOIN pg_publication_tables AS pb ON pb.schemaname = ns.nspname AND pb.tablename = c.relname WHERE ns.oid = target.objid AND pb.pubname = ANY (publications) INTO relevant; - IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(tag, target); - RETURN; - END IF; ELSIF target.object_type = 'publication' THEN SELECT 1 WHERE target.object_identity = ANY (publications) INTO relevant; - IF relevant IS NULL THEN - PERFORM ${schema}.notice_ignore(tag, target); - RETURN; - END IF; -- no-op CREATE IF NOT EXIST statements ELSIF tag LIKE 'CREATE %' AND target.object_type IS NULL THEN + relevant := NULL; + END IF; + + IF relevant IS NULL THEN PERFORM ${schema}.notice_ignore(tag, target); RETURN; END IF; diff --git a/packages/zero-cache/src/services/change-source/pg/schema/init.ts b/packages/zero-cache/src/services/change-source/pg/schema/init.ts index 5ff706f815..93ffe4066f 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/init.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/init.ts @@ -91,14 +91,13 @@ function getIncrementalMigrations( minSafeVersion: 3, }, - // v5 changes the upstream schema organization from "zero_{SHARD_ID}" to + // v5: changes the upstream schema organization from "zero_{SHARD_ID}" to // the "{APP_ID}_0". An incremental migration indicates that the previous // SHARD_ID was "0" and the new APP_ID is "zero" (i.e. the default values // for those options). In this case, the upstream format is identical, and // no migration is necessary. However, the version is bumped to v5 to // indicate that it was created with the {APP_ID} configuration and should // not be decommissioned as a legacy shard. - 5: {}, 6: { migrateSchema: async (lc, sql) => { @@ -172,13 +171,12 @@ function getIncrementalMigrations( }, }, - // Fixes field ordering of compound indexes. This incremental migration + // v9: Fixes field ordering of compound indexes. This incremental migration // only fixes indexes resulting from new schema changes. A full resync is // required to fix existing indexes. // // The migration has been subsumed by the identical logic for migrating // to v12 (i.e. a trigger upgrade). - 9: {}, // Adds the `mutations` table used to track mutation results. 10: { @@ -191,13 +189,11 @@ function getIncrementalMigrations( }, }, - // Formerly dropped the schemaVersions table, but restored in the v13 + // v11: Formerly dropped the schemaVersions table, but restored in the v13 // migration for rollback safety. - 11: {}, - // Upgrade DDL trigger to query schemaOID, needed information for auto-backfill. + // v12: Upgrade DDL trigger to query schemaOID, needed information for auto-backfill. // (subsumed by v14) - 12: {}, // Recreates the legacy schemaVersions table that was prematurely dropped // in the (former) v11 migration. It needs to remain present for at least one @@ -222,9 +218,8 @@ function getIncrementalMigrations( }, }, - // Upgrade DDL trigger to log more info to PG logs. + // v14: Upgrade DDL trigger to log more info to PG logs. // (subsumed by v16) - 14: {}, // Add initialSyncContext column to replicas table. 15: { @@ -237,18 +232,20 @@ function getIncrementalMigrations( }, }, - // Upgrade DDL trigger to fire on all ALTER TABLE statements + // v16: Upgrade DDL trigger to fire on all ALTER TABLE statements // to catch the *removal* of a table from the published set. // (subsumed by v17) - 16: {}, - // Upgrade DDL triggers to support the COMMENT ON PUBLICATION hook for + // v17: Upgrade DDL triggers to support the COMMENT ON PUBLICATION hook for // working around the lack of event trigger support for PUBLICATION // changes in supabase. // // This also adds forwards-compatible support for hierarchical logical // message prefixes and unknown ddl event types. - 17: { + // (subsued by v18) + + // v18: Pure refactoring of event trigger code. + 18: { migrateSchema: async (lc, sql) => { const [{publications}] = await sql<{publications: string[]}[]>` SELECT publications FROM ${sql(shardConfigTable)}`; From d5f31bd36b4d4d2eef051029800bc9cd9b066f07 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 20 Mar 2026 16:02:03 -0700 Subject: [PATCH 162/495] fix: handle corrupted litestream restores (#5677) --- packages/zero-cache/src/services/litestream/commands.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/zero-cache/src/services/litestream/commands.ts b/packages/zero-cache/src/services/litestream/commands.ts index 86bee623be..36d49e3eaf 100644 --- a/packages/zero-cache/src/services/litestream/commands.ts +++ b/packages/zero-cache/src/services/litestream/commands.ts @@ -208,6 +208,9 @@ function replicaIsValid( snapshot, ); return true; + } catch (e) { + lc.error?.('Error while validating restored replica', e); + return false; } finally { db.close(); } From efb29a9aceba856f16dee8bcf8795a7c473921af Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 23 Mar 2026 10:27:12 -0700 Subject: [PATCH 163/495] fix: error handling in cdc queries (#5679) Fixes error handling when the CDC (or the pooler in front of it) is unhealthy: * avoid crashing on the pipelined read of the `owner` column * disconnect subscribers if catchup fails Reference: * https://rocicorp.slack.com/archives/C0ABMK92H47/p1774215153090909 --- .../src/services/change-streamer/storer.ts | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 1ff073f8b0..bc1f3501c2 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -400,6 +400,7 @@ export class Storer implements Service { if (tag === 'begin') { assert(!tx, 'received BEGIN in the middle of a transaction'); const {promise, resolve, reject} = resolver(); + void promise.then(() => {}); // handle rejections before the await tx = { pool: new TransactionPool( this.#lc.withContext('watermark', watermark), @@ -499,15 +500,21 @@ export class Storer implements Service { ); reader.run(this.#db); - // Ensure that the transaction has started (and is thus holding a snapshot - // of the database) before continuing on to commit more changes. This is - // done by performing a single read on the db, which determines the - // snapshot for the REPEATABLE_READ transaction. - const [{lastWatermark}] = await reader.processReadTask( - sql => sql` + let lastWatermark: string | undefined; + try { + // Ensure that the transaction has started (and is thus holding a snapshot + // of the database) before continuing on to commit more changes. This is + // done by performing a single read on the db, which determines the + // snapshot for the REPEATABLE_READ transaction. + [{lastWatermark}] = await reader.processReadTask( + sql => sql` SELECT * FROM ${this.#cdc('replicationState')} `, - ); + ); + } catch (e) { + subs.map(({subscriber}) => subscriber.fail(e)); + throw e; + } // Run the actual catchup queries in the background. Errors are handled in // #catchup() by disconnecting the associated subscriber. From 3d13c0c4e70c29efcd82be2c65c6961008a1a35e Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 23 Mar 2026 12:25:50 -0700 Subject: [PATCH 164/495] fix: then -> catch (#5680) --- packages/zero-cache/src/services/change-streamer/storer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index bc1f3501c2..21720f159a 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -400,7 +400,7 @@ export class Storer implements Service { if (tag === 'begin') { assert(!tx, 'received BEGIN in the middle of a transaction'); const {promise, resolve, reject} = resolver(); - void promise.then(() => {}); // handle rejections before the await + void promise.catch(() => {}); // handle rejections before the await tx = { pool: new TransactionPool( this.#lc.withContext('watermark', watermark), From abc462b121329f7fd85cdcae26bb0b15bd4d0970 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 23 Mar 2026 13:29:46 -0700 Subject: [PATCH 165/495] fix: more orphaned subscriber scenarios (#5681) --- .../change-streamer/storer.pg.test.ts | 9 + .../src/services/change-streamer/storer.ts | 273 ++++++++++-------- 2 files changed, 163 insertions(+), 119 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 3a870d3610..66eae81069 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -863,6 +863,9 @@ describe('change-streamer/storer', () => { }); test('ownership change detected at begin aborts transaction', async () => { + const [sub1, _1, stream1] = createSubscriber('00'); + const [sub2, _2, stream2] = createSubscriber('00'); + // Change ownership before storing begin — the storer's pipelined // SELECT will read the new owner immediately. await db`UPDATE "xero_5/cdc"."replicationState" SET owner = 'other-task'`; @@ -871,14 +874,20 @@ describe('change-streamer/storer', () => { '07', ['begin', messages.begin(), {commitWatermark: '08'}], ]); + storer.catchup(sub1, 'serving'); storer.store(['07', ['data', messages.insert('issues', {id: 'foo'})]]); storer.store(['08', ['commit', messages.commit(), {watermark: '08'}]]); + storer.catchup(sub2, 'serving'); await expect(done).rejects.toThrow( 'changeLog ownership has been assumed by other-task', ); // Prevent the beforeEach cleanup from re-throwing the rejected done. done = Promise.resolve(); + + // subscribers that were waiting to be caught up should be canceled + expect(stream1.active).toBe(false); + expect(stream2.active).toBe(false); }); test('ownership change not possible during transaction', async () => { diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 21720f159a..eb9c22037a 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -338,154 +338,189 @@ export class Storer implements Service { this.#stopped = stopped; this.#lc.info?.('starting storer'); + let err: unknown; try { await this.#processQueue(); + } catch (e) { + err = e; // used in finally + throw e; } finally { // Release any pending backpressure so the upstream can proceed if (this.#readyForMore !== null) { this.#readyForMore.resolve(); this.#readyForMore = null; } - const unprocessed = this.#queue.drain(); - if (unprocessed.length) { - this.#lc.warn?.( - `dropped ${unprocessed.length} entries from the changeLog queue`, - ); - } + this.#cancelQueueEntries( + this.#queue.drain().filter(entry => entry !== undefined), + err, + ); this.#running = false; signalStopped(); this.#lc.info?.('storer stopped'); } } + #cancelQueueEntries(queue: QueueEntry[], e: unknown) { + if (queue.length === 0) { + return; + } + this.#lc.info?.( + `canceling ${queue.length} entries from the changeLog queue`, + ); + const err = e instanceof Error ? e : new AbortError('server shutting down'); + for (const entry of queue) { + if (entry === 'stop') { + continue; + } + const type = entry[0]; + switch (type) { + case 'subscriber': { + // Disconnect subscribers waiting to be caught up so that they can + // reconnect and try again. + const {subscriber} = entry[1]; + this.#lc.info?.(`disconnecting ${subscriber.id}`); + subscriber.fail(err); + break; + } + } + } + } + async #processQueue() { let tx: PendingTransaction | null = null; let msg: QueueEntry | false; const catchupQueue: SubscriberAndMode[] = []; - while ((msg = await this.#queue.dequeue()) !== 'stop') { - const [msgType] = msg; - switch (msgType) { - case 'ready': { - const signalReady = msg[1]; - signalReady(); - continue; - } - case 'subscriber': { - const subscriber = msg[1]; - if (tx) { - catchupQueue.push(subscriber); // Wait for the current tx to complete. - } else { - await this.#startCatchup([subscriber]); // Catch up immediately. + try { + while ((msg = await this.#queue.dequeue()) !== 'stop') { + const [msgType] = msg; + switch (msgType) { + case 'ready': { + const signalReady = msg[1]; + signalReady(); + continue; } - continue; - } - case 'status': - this.#onConsumed(msg); - continue; - case 'abort': { - if (tx) { - tx.pool.abort(); - await tx.pool.done(); - tx = null; + case 'subscriber': { + const subscriber = msg[1]; + if (tx) { + catchupQueue.push(subscriber); // Wait for the current tx to complete. + } else { + await this.#startCatchup([subscriber]); // Catch up immediately. + } + continue; + } + case 'status': + this.#onConsumed(msg); + continue; + case 'abort': { + if (tx) { + tx.pool.abort(); + await tx.pool.done(); + tx = null; + } + continue; } - continue; } - } - // msgType === 'change' - const [_, watermark, json, change] = msg; - const tag = change?.tag; - this.#approximateQueuedBytes -= json.length; - - if (tag === 'begin') { - assert(!tx, 'received BEGIN in the middle of a transaction'); - const {promise, resolve, reject} = resolver(); - void promise.catch(() => {}); // handle rejections before the await - tx = { - pool: new TransactionPool( - this.#lc.withContext('watermark', watermark), - Mode.READ_COMMITTED, - ), - preCommitWatermark: watermark, - pos: 0, - startingReplicationState: promise, - ack: !change.skipAck, - }; - tx.pool.run(this.#db); - // Acquire a lock on the replicationState row to detect and/or prevent - // a concurrent ownership change. - void tx.pool.process(tx => { - tx /*sql*/ ` + // msgType === 'change' + const [_, watermark, json, change] = msg; + const tag = change?.tag; + this.#approximateQueuedBytes -= json.length; + + if (tag === 'begin') { + assert(!tx, 'received BEGIN in the middle of a transaction'); + const {promise, resolve, reject} = resolver(); + void promise.catch(() => {}); // handle rejections before the await + tx = { + pool: new TransactionPool( + this.#lc.withContext('watermark', watermark), + Mode.READ_COMMITTED, + ), + preCommitWatermark: watermark, + pos: 0, + startingReplicationState: promise, + ack: !change.skipAck, + }; + tx.pool.run(this.#db); + // Acquire a lock on the replicationState row to detect and/or prevent + // a concurrent ownership change. + void tx.pool.process(tx => { + tx /*sql*/ ` SELECT * FROM ${this.#cdc('replicationState')} FOR UPDATE`.then( - ([result]) => resolve(result), - reject, - ); - return []; - }); - } else { - assert(tx, () => `received change outside of transaction: ${json}`); - tx.pos++; - } - - const entry = { - watermark: tag === 'commit' ? watermark : tx.preCommitWatermark, - precommit: tag === 'commit' ? tx.preCommitWatermark : null, - pos: tx.pos, - change: json, - }; - - const processed = tx.pool.process(sql => [ - sql`INSERT INTO ${this.#cdc('changeLog')} ${sql(entry)}`, - ...(change !== null && isSchemaChange(change) - ? this.#trackBackfillMetadata(sql, change) - : []), - ]); - - if (tx.pos % 100 === 0) { - // Backpressure is exerted on commit when awaiting tx.pool.done(). - // However, backpressure checks need to be regularly done for - // very large transactions in order to avoid memory blowup. - await processed; - } - this.#maybeReleaseBackPressure(); - - if (tag === 'commit') { - const {owner} = await tx.startingReplicationState; - if (owner !== this.#taskID) { - // Ownership change reflected in the replicationState read in 'begin'. - tx.pool.fail( - new AbortError(`changeLog ownership has been assumed by ${owner}`), - ); + ([result]) => resolve(result), + reject, + ); + return []; + }); } else { - // Update the replication state. - const lastWatermark = watermark; - void tx.pool.process(tx => [ - tx` - UPDATE ${this.#cdc('replicationState')} SET ${tx({lastWatermark})}`, - ]); - tx.pool.setDone(); + assert(tx, () => `received change outside of transaction: ${json}`); + tx.pos++; } - await tx.pool.done(); + const entry = { + watermark: tag === 'commit' ? watermark : tx.preCommitWatermark, + precommit: tag === 'commit' ? tx.preCommitWatermark : null, + pos: tx.pos, + change: json, + }; - // ACK the LSN to the upstream Postgres. - if (tx.ack) { - this.#onConsumed(['commit', change, {watermark}]); + const processed = tx.pool.process(sql => [ + sql`INSERT INTO ${this.#cdc('changeLog')} ${sql(entry)}`, + ...(change !== null && isSchemaChange(change) + ? this.#trackBackfillMetadata(sql, change) + : []), + ]); + + if (tx.pos % 100 === 0) { + // Backpressure is exerted on commit when awaiting tx.pool.done(). + // However, backpressure checks need to be regularly done for + // very large transactions in order to avoid memory blowup. + await processed; + } + this.#maybeReleaseBackPressure(); + + if (tag === 'commit') { + const {owner} = await tx.startingReplicationState; + if (owner !== this.#taskID) { + // Ownership change reflected in the replicationState read in 'begin'. + tx.pool.fail( + new AbortError( + `changeLog ownership has been assumed by ${owner}`, + ), + ); + } else { + // Update the replication state. + const lastWatermark = watermark; + void tx.pool.process(tx => [ + tx` + UPDATE ${this.#cdc('replicationState')} SET ${tx({lastWatermark})}`, + ]); + tx.pool.setDone(); + } + + await tx.pool.done(); + + // ACK the LSN to the upstream Postgres. + if (tx.ack) { + this.#onConsumed(['commit', change, {watermark}]); + } + tx = null; + + // Before beginning the next transaction, open a READONLY snapshot to + // concurrently catchup any queued subscribers. + await this.#startCatchup(catchupQueue.splice(0)); + } else if (tag === 'rollback') { + // Aborted transactions are not stored in the changeLog. Abort the current tx + // and process catchup of subscribers that were waiting for it to end. + tx.pool.abort(); + await tx.pool.done(); + tx = null; + + await this.#startCatchup(catchupQueue.splice(0)); } - tx = null; - - // Before beginning the next transaction, open a READONLY snapshot to - // concurrently catchup any queued subscribers. - await this.#startCatchup(catchupQueue.splice(0)); - } else if (tag === 'rollback') { - // Aborted transactions are not stored in the changeLog. Abort the current tx - // and process catchup of subscribers that were waiting for it to end. - tx.pool.abort(); - await tx.pool.done(); - tx = null; - - await this.#startCatchup(catchupQueue.splice(0)); } + } catch (e) { + catchupQueue.forEach(({subscriber}) => subscriber.fail(e)); + throw e; } } From 5a5ea6b786d126fb12f34b1b81a846b8b00a754b Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Mon, 23 Mar 2026 20:04:42 -1000 Subject: [PATCH 166/495] one (#5672) --- apps/zbugs/package.json | 4 +- package-lock.json | 1486 ++++++++---------------------------- packages/zero/package.json | 2 +- 3 files changed, 306 insertions(+), 1186 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 46947d87b8..c9231b65f0 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -44,7 +44,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.2", + "@rocicorp/zero": "1.0.0", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", @@ -81,7 +81,7 @@ "@types/react-dom": "18.3.5", "@vitejs/plugin-react": "^6.0.1", "@vitest/runner": "4.1.0", - "drizzle-kit": "^0.31.10", + "drizzle-kit": "0.31.9", "drizzle-orm": "^0.45.1", "postcss-preset-env": "^7.4.3", "prettier": "^3.8.1", diff --git a/package-lock.json b/package-lock.json index 1da235a852..ffa0c71b11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "0.26.2", + "@rocicorp/zero": "1.0.0", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", @@ -90,7 +90,7 @@ "@types/react-dom": "18.3.5", "@vitejs/plugin-react": "^6.0.1", "@vitest/runner": "4.1.0", - "drizzle-kit": "^0.31.10", + "drizzle-kit": "0.31.9", "drizzle-orm": "^0.45.1", "postcss-preset-env": "^7.4.3", "prettier": "^3.8.1", @@ -105,130 +105,62 @@ "vitest": "4.1.0" } }, - "apps/zbugs/node_modules/drizzle-orm": { - "version": "0.45.1", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", - "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", + "apps/zbugs/node_modules/drizzle-kit": { + "version": "0.31.9", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.9.tgz", + "integrity": "sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg==", "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=4", - "@electric-sql/pglite": ">=0.2.0", - "@libsql/client": ">=0.10.0", - "@libsql/client-wasm": ">=0.10.0", - "@neondatabase/serverless": ">=0.10.0", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1.13", - "@prisma/client": "*", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/sql.js": "*", - "@upstash/redis": ">=1.34.7", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=14.0.0", - "gel": ">=2", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "sql.js": ">=1", - "sqlite3": ">=5" + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "esbuild-register": "^3.5.0" }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@libsql/client-wasm": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "gel": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "prisma": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "apps/zbugs/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "apps/zql-viz": { @@ -389,6 +321,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.49.2", "@algolia/requester-browser-xhr": "5.49.2", @@ -1412,6 +1345,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -1845,7 +1779,6 @@ "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", @@ -1864,7 +1797,6 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1893,7 +1825,6 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1907,7 +1838,6 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1921,7 +1851,6 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1935,7 +1864,6 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1952,7 +1880,6 @@ "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1981,7 +1908,6 @@ "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1998,7 +1924,6 @@ "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -2045,7 +1970,6 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2059,7 +1983,6 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2088,7 +2011,6 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2102,7 +2024,6 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2116,7 +2037,6 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2130,7 +2050,6 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2144,7 +2063,6 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2158,7 +2076,6 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2172,7 +2089,6 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2189,7 +2105,6 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2508,7 +2423,6 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -2939,7 +2853,6 @@ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2956,7 +2869,6 @@ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -3435,7 +3347,6 @@ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -3685,6 +3596,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -3707,6 +3619,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -6280,6 +6193,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6620,6 +6534,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7174,7 +7089,8 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz", "integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.20", @@ -8114,7 +8030,6 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -8125,7 +8040,6 @@ "integrity": "sha512-D7RYYHfErCgEllGxNwdYdkgzLna7zkzUECBV3snbUpf7RvIpB5l1LpCgzuVoc5KVew5h7N1Tn4LnT/tBSUZsQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config-plugins": "~55.0.6", "@expo/config-types": "^55.0.5", @@ -8146,7 +8060,6 @@ "integrity": "sha512-cIox6FjZlFaaX40rbQ3DvP9e87S5X85H9uw+BAxJE5timkMhuByy3GAlOsj1h96EyzSiol7Q6YIGgY1Jiz4M+A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config-types": "^55.0.5", "@expo/json-file": "~10.0.12", @@ -8169,7 +8082,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8186,7 +8098,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8204,7 +8115,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8215,7 +8125,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8228,8 +8137,7 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-55.0.5.tgz", "integrity": "sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/config/node_modules/resolve-from": { "version": "5.0.0", @@ -8237,7 +8145,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8248,7 +8155,6 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8260,7 +8166,6 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8271,7 +8176,6 @@ "integrity": "sha512-rVvHC4I6xlPcg+mAO09ydUi2Wjv1ZytpLmHOSzvXzBAz9mMrJggqCe4s4dubjJvi/Ino/xQCLhbaLCnTtLpikg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8287,7 +8191,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8304,7 +8207,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8322,7 +8224,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8336,7 +8237,6 @@ "integrity": "sha512-nRITNbnu3RKSHPvKVehrSU4KG2VY9V8nvULOHBw98ukHCAU4bGrU5APvcblOkX3JAap+xEHsg/mZvqlvkLInmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/env": "^2.0.11", "@expo/spawn-async": "^1.7.2", @@ -8360,7 +8260,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8377,7 +8276,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8395,7 +8293,6 @@ "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "brace-expansion": "^5.0.2" }, @@ -8412,7 +8309,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8423,7 +8319,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8437,7 +8332,6 @@ "integrity": "sha512-3KguH7kyKqq7pNwLb9j6BBdD/bjmNwXZG/HPWT6GWIXbwrvAJt2JNyYTP5agWJ8jbbuys1yuCzmkX+TU6rmI7A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8454,7 +8348,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8471,7 +8364,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8489,7 +8381,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8500,7 +8391,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8514,7 +8404,6 @@ "integrity": "sha512-inbDycp1rMAelAofg7h/mMzIe+Owx6F7pur3XdQ3EPTy00tme+4P6FWgHKUcjN8dBSrnbRNpSyh5/shzHyVCyQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "json5": "^2.2.3" @@ -8526,7 +8415,6 @@ "integrity": "sha512-4kfdv48sKzokijMqi07fINYA9/XprshmPgSLf8i69XgzIv2YdRyBbb70SzrufB7PDneFoltz8N83icW8gOOj1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~55.0.8", "chalk": "^4.1.2" @@ -8538,7 +8426,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8555,7 +8442,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8573,7 +8459,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8587,7 +8472,6 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -8611,7 +8495,6 @@ "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2" }, @@ -8625,7 +8508,6 @@ "integrity": "sha512-ZuXiK/9fCrIuLjPSe1VYmfp0Sa85kCMwd8QQpgyi5ufppYKRtLBg14QOgUqj8ZMbJTxE0xqzd0XR7kOs3vAK9A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/json-file": "^10.0.12", "@expo/spawn-async": "^1.7.2", @@ -8641,7 +8523,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8658,7 +8539,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8676,7 +8556,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8690,7 +8569,6 @@ "integrity": "sha512-o4xdVdBpe4aTl3sPMZ2u3fJH4iG1I768EIRk1xRZP+GaFI93MaR3JvoFibYqxeTmLQ1p1kNEVqylfUjezxx45g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -8703,7 +8581,6 @@ "integrity": "sha512-dV5oCShQ1umKBKagMMT4B/N+SREsQe3lU4Zgmko5AO0rxKV0tynZT6xXs+e2JxuqT4Rz997atg7pki0BnZb4uw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.25.2", @@ -8723,16 +8600,14 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.2.tgz", "integrity": "sha512-QZ5WKbJOWkCrMq0/kfhV9ry8te/OaS34YgLVpG8u9y2gix96TlpRTbxM/YATjNcUR2s4fiQmPCOxkGtog4i37g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8740,7 +8615,6 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8753,16 +8627,14 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@expo/xcpretty": { "version": "4.4.1", @@ -8770,7 +8642,6 @@ "integrity": "sha512-KZNxZvnGCtiM2aYYZ6Wz0Ix5r47dAvpNLApFtZWnSoERzAdOMzVBOPysBoM0JlF6FKWZ8GPqgn6qt3dV/8Zlpg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "chalk": "^4.1.0", @@ -8786,7 +8657,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8803,7 +8673,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8821,7 +8690,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9502,7 +9370,6 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -9513,7 +9380,6 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9531,7 +9397,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9542,7 +9407,6 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9557,7 +9421,6 @@ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9572,7 +9435,6 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9586,7 +9448,6 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9603,7 +9464,6 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9617,7 +9477,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9628,7 +9487,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9639,7 +9497,6 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9650,7 +9507,6 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9664,7 +9520,6 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9681,7 +9536,6 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9712,7 +9566,6 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9740,7 +9593,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -9757,7 +9609,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9775,7 +9626,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9789,7 +9639,6 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10449,6 +10298,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10579,6 +10429,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10775,6 +10626,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -10871,6 +10723,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -13735,6 +13588,7 @@ "integrity": "sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.5.0" }, @@ -13826,20 +13680,6 @@ "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/@prisma/config/node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, "node_modules/@prisma/debug": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.5.0.tgz", @@ -14120,7 +13960,6 @@ "integrity": "sha512-lAJ6PDZv95FdT9s9uhc9ivhikW1Zwh4j9XdXM7J2l4oUA3t37qfoBmTSDLuPyE3Bi+Xtwa11hJm0BUTT2sc/gg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14131,7 +13970,6 @@ "integrity": "sha512-XbcN/BEa64pVlb0Hb/E/Ph2SepjVN/FcNKrJcQvtaKZA6mBSO8pW8Eircdlr61/KBH94LihHbQoQDzkQFpeaTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.83.2" @@ -14146,7 +13984,6 @@ "integrity": "sha512-X/RAXDfe6W+om/Fw1i6htTxQXFhBJ2jgNOWx3WpI3KbjeIWbq7ib6vrpTeIAW2NUMg+K3mML1NzgD4dpZeqdjA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -14207,7 +14044,6 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -14218,7 +14054,6 @@ "integrity": "sha512-9uK6X1miCXqtL4c759l74N/XbQeneWeQVjoV7SD2CGJuW7ZefxaoYenwGPs7rMoCdtS6wuIyR3hXQ+uWEBGYXA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -14240,8 +14075,7 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-native/codegen/node_modules/brace-expansion": { "version": "1.1.12", @@ -14249,7 +14083,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14262,7 +14095,6 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14284,7 +14116,6 @@ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14298,7 +14129,6 @@ "integrity": "sha512-f6a+mJEJ6Joxlt/050TqYUr7uRRbeKnz8lnpL7JajhpsgZLEbkJRjH8HY5QiLcRdUwWFtizml4V+vcO3P4RxoQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.84.1", "debug": "^4.4.0", @@ -14330,7 +14160,6 @@ "integrity": "sha512-rUU/Pyh3R5zT0WkVgB+yA6VwOp7HM5Hz4NYE97ajFS07OUIcv8JzBL3MXVdSSjLfldfqOuPEuKUaZcAOwPgabw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14341,7 +14170,6 @@ "integrity": "sha512-LIGhh4q4ette3yW5OzmukNMYwmINYrRGDZqKyTYc/VZyNpblZPw72coXVHXdfpPT6+YlxHqXzn3UjFZpNODGCQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "debug": "^4.4.0", @@ -14357,7 +14185,6 @@ "integrity": "sha512-Z83ra+Gk6ElAhH3XRrv3vwbwCPTb04sPPlNpotxcFZb5LtRQZwT91ZQEXw3GOJCVIFp9EQ/gj8AQbVvtHKOUlQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.84.1", @@ -14382,7 +14209,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -14400,7 +14226,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -14423,7 +14248,6 @@ "integrity": "sha512-t4fYfa7xopbUF5S4+ihNEwgaq4wLZLKLY0Ms8z72lkMteVd3bOX2Foxa8E2wTfRvdhPOkSpOsTeNDmD8ON4DoQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14434,7 +14258,6 @@ "integrity": "sha512-z9go6NJMsLSDJT5MW6VGugRsZHjYvUTwxtsVc3uLt4U9W6T3J6FWI2wHpXIzd2dUkXRfAiRQ3Zi8ZQQ8fRFg9A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -14449,7 +14272,6 @@ "integrity": "sha512-Zi4EVaAm28+icD19NN07Gh8Pqg/84QQu+jn4patfWKNkcToRFP5vPEbbp0eLOGWS+BVB1d1Fn5lvMrJsBbFcOg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.2", @@ -14474,7 +14296,6 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -14492,7 +14313,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -14515,7 +14335,6 @@ "integrity": "sha512-7uVlPBE3uluRNRX4MW7PUJIO1LDBTpAqStKHU7LHH+GRrdZbHsWtOEAX8PiY4GFfBEvG8hEjiuTOqAxMjV+hDg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14526,7 +14345,6 @@ "integrity": "sha512-UsTe2AbUugsfyI7XIHMQq4E7xeC8a6GrYwuK+NohMMMJMxmyM3JkzIk+GB9e2il6ScEQNMJNaj+q+i5za8itxQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14536,8 +14354,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.2.tgz", "integrity": "sha512-gkZAb9LoVVzNuYzzOviH7DiPTXQoZPHuiTH2+O2+VWNtOkiznjgvqpwYAhg58a5zfRq5GXlbBdf5mzRj5+3Y5Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-stately/flags": { "version": "3.1.2", @@ -14912,381 +14729,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, "node_modules/@rushstack/node-core-library": { "version": "5.18.0", "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.18.0.tgz", @@ -15526,7 +14968,6 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -15537,7 +14978,6 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -16473,6 +15913,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -16610,6 +16051,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.23" }, @@ -16627,6 +16069,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -16734,6 +16177,7 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -17164,7 +16608,6 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*" } @@ -17311,6 +16754,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -17387,6 +16831,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -17546,8 +16991,7 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -17914,6 +17358,7 @@ "integrity": "sha512-tG/iOrgbiHQks0ew7CdelUyNEHkv8NLrt+CqdTivIuoSnXvO7scWMn4Kqo78/UGY1NJ6Hv+vp8BvRnED/bjFdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.0", @@ -17937,6 +17382,7 @@ "integrity": "sha512-2RU7pZELY9/aVMLmABNy1HeZ4FX23FXGY1jRuHLHgWa2zaAE49aNW2GLzebW+BmbTZIKKyFF1QXvk7DEWViUCQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/browser": "4.1.0", "@vitest/mocker": "4.1.0", @@ -18251,7 +17697,6 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -18373,6 +17818,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -18458,6 +17904,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -18518,6 +17965,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.15.2", "@algolia/client-abtesting": "5.49.2", @@ -18559,8 +18007,7 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", @@ -18987,8 +18434,7 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", @@ -19220,7 +18666,6 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -19243,7 +18688,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -19260,7 +18704,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19278,7 +18721,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -19318,7 +18760,6 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -19336,7 +18777,6 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -19441,8 +18881,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/babel-plugin-transform-flow-enums": { "version": "0.0.2", @@ -19450,7 +18889,6 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -19461,7 +18899,6 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -19489,7 +18926,6 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -19543,7 +18979,6 @@ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "18 || 20 || >=22" } @@ -19732,7 +19167,6 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -19746,7 +19180,6 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -19942,7 +19375,6 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -19953,7 +19385,6 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -19967,7 +19398,6 @@ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^4.0.2" }, @@ -20016,6 +19446,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -20036,7 +19467,6 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -20476,7 +19906,6 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -20505,7 +19934,6 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -20606,7 +20034,6 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -20620,7 +20047,6 @@ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -20739,7 +20165,6 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -22057,6 +21482,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -22232,7 +21658,6 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -22474,8 +21899,7 @@ "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.3.tgz", "integrity": "sha512-XENsHi3MBzWOCAXif3yZvU1Ah0l+nhJj1sjWL6TnOAYKvGiFhbTx32xHN7+wLMLUOCj7Nr0evADWG4R8JtqCDA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/docker-compose": { "version": "0.24.8", @@ -22694,62 +22118,130 @@ "url": "https://dotenvx.com" } }, - "node_modules/drizzle-kit": { - "version": "0.31.10", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", - "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@drizzle-team/brocli": "^0.10.2", - "@esbuild-kit/esm-loader": "^2.5.5", - "esbuild": "^0.25.4", - "tsx": "^4.21.0" - }, - "bin": { - "drizzle-kit": "bin.cjs" - } - }, - "node_modules/drizzle-kit/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "node_modules/drizzle-orm": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", + "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } } }, "node_modules/dunder-proto": { @@ -22991,7 +22483,6 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -23070,6 +22561,7 @@ "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -23361,6 +22853,19 @@ "node": ">=12" } }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, "node_modules/esbuild-sunos-64": { "version": "0.14.47", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", @@ -24207,7 +23712,6 @@ "integrity": "sha512-OXIrxSYKlT/1Av1AMyUWeSTW1GChGofWV14sB73o5eFbfuz6ocv18fnKx+Ji67ZC7a0RztDctcZTuEQK84S4iw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/require-utils": "^55.0.2", "@expo/spawn-async": "^1.7.2", @@ -24224,7 +23728,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -24241,7 +23744,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24259,7 +23761,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -24270,7 +23771,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -24294,8 +23794,7 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/express": { "version": "4.22.1", @@ -24716,7 +24215,6 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", - "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -24730,7 +24228,6 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bser": "2.1.1" } @@ -24769,8 +24266,7 @@ "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.9.tgz", "integrity": "sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/figures": { "version": "3.2.0", @@ -24821,6 +24317,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -25084,8 +24581,7 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -25112,8 +24608,7 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/for-each": { "version": "0.3.5", @@ -25450,7 +24945,6 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -25532,7 +25026,6 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -25573,7 +25066,6 @@ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", @@ -25626,7 +25118,6 @@ "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "brace-expansion": "^5.0.2" }, @@ -25765,6 +25256,7 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.x" } @@ -26138,16 +25630,14 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.9.tgz", "integrity": "sha512-hZ5O7PDz1vQ99TS7HD3FJ9zVynfU1y+VWId6U1Pldvd8hmAYrNec/XLPYJKD3dLOW6NXak6aAQAuMuSo3ji0tQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.32.0", @@ -26155,7 +25645,6 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -26195,6 +25684,7 @@ "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -26205,7 +25695,6 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -26218,8 +25707,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/hpack.js": { "version": "2.1.6", @@ -27279,7 +26767,6 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -27297,7 +26784,6 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -27373,7 +26859,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -27392,7 +26877,6 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -27403,7 +26887,6 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -27430,7 +26913,6 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -27452,7 +26934,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -27470,7 +26951,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -27487,7 +26967,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -27502,8 +26981,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", @@ -27511,7 +26989,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -27525,7 +27002,6 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -27541,7 +27017,6 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -27624,7 +27099,6 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -27643,7 +27117,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -27661,7 +27134,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -27678,7 +27150,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -27693,8 +27164,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", @@ -27702,7 +27172,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -27730,14 +27199,14 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -27818,8 +27287,7 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/jsesc": { "version": "3.1.0", @@ -27965,7 +27433,6 @@ "integrity": "sha512-EZgbsXMrGS+oK+Ta12mCjzBFse+SIewGdwrSTr5g+MSymnjpox2x05ceI20PQejJOFvOgzcXrfDk/SdY7dSCtw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -28093,7 +27560,6 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -28105,7 +27571,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -28115,8 +27580,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lightningcss": { "version": "1.32.0", @@ -28470,8 +27934,7 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -28485,7 +27948,6 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -28499,7 +27961,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -28513,7 +27974,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -28529,7 +27989,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -28539,8 +27998,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -28548,7 +28006,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -28559,7 +28016,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -28570,7 +28026,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -28707,6 +28162,7 @@ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", @@ -28741,7 +28197,6 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -28798,8 +28253,7 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -29268,8 +28722,7 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge-anything": { "version": "5.1.7", @@ -29326,7 +28779,6 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -29382,7 +28834,6 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -29399,7 +28850,6 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -29416,7 +28866,6 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29430,7 +28879,6 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -29451,7 +28899,6 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -29467,7 +28914,6 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -29489,7 +28935,6 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -29504,7 +28949,6 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29518,7 +28962,6 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -29533,7 +28976,6 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -29556,7 +28998,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -29567,7 +29008,6 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -29589,7 +29029,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -29600,7 +29039,6 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -29619,7 +29057,6 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -29645,7 +29082,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -29662,7 +29098,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -29679,8 +29114,7 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro/node_modules/image-size": { "version": "1.2.1", @@ -29688,7 +29122,6 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -29705,7 +29138,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -29716,7 +29148,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -29730,7 +29161,6 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -29741,7 +29171,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -29755,7 +29184,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -31899,7 +31327,8 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/mri": { "version": "1.2.0", @@ -31943,8 +31372,7 @@ "resolved": "https://registry.npmjs.org/multitars/-/multitars-0.2.4.tgz", "integrity": "sha512-XgLbg1HHchFauMCQPRwMj6MSyDd5koPlTA1hM3rUFkeXzGpjU/I9fP3to7yrObE9jcN8ChIOQGrM0tV0kUZaKg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mysql2": { "version": "3.15.3", @@ -31952,6 +31380,7 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -32158,7 +31587,6 @@ "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "dev": true, "license": "(BSD-3-Clause OR GPL-2.0)", - "peer": true, "engines": { "node": ">= 6.13.0" } @@ -32179,8 +31607,7 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.36", @@ -32230,7 +31657,6 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -32309,6 +31735,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -32358,8 +31785,7 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nypm": { "version": "0.6.5", @@ -32392,7 +31818,6 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -32585,7 +32010,6 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -32604,7 +32028,6 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -32615,7 +32038,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -32629,7 +32051,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -32645,7 +32066,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -32655,8 +32075,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -32664,7 +32083,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -32675,7 +32093,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -32686,7 +32103,6 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -32700,7 +32116,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -32815,6 +32230,7 @@ "integrity": "sha512-TdrKhDZCgEYqONFo/j+KvGan7/k3tP5Ouz88wCqpOvJtI2QmcLfGsm1fcMvDnTik48Jj6z83IJBqlkmK9DnY1A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -32947,7 +32363,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -33135,7 +32550,6 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -33149,7 +32563,6 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } @@ -33285,7 +32698,6 @@ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -33303,7 +32715,6 @@ "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": "20 || >=22" } @@ -33352,6 +32763,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", @@ -33669,7 +33081,6 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -33731,6 +33142,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -34944,6 +34356,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -35204,6 +34617,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "7.5.0", "@prisma/dev": "0.20.0", @@ -35246,7 +34660,6 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -35296,7 +34709,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -35307,7 +34719,6 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -35553,7 +34964,6 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -35678,6 +35088,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -35691,7 +35102,6 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -35703,7 +35113,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -35725,6 +35134,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -35799,6 +35209,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -35875,6 +35286,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -36151,8 +35563,7 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/regexp-to-ast": { "version": "0.5.0", @@ -36662,8 +36073,7 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz", "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/responselike": { "version": "3.0.0", @@ -36686,7 +36096,6 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -36701,7 +36110,6 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -36712,7 +36120,6 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -36858,53 +36265,6 @@ "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", "license": "MIT" }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -37220,7 +36580,6 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -37240,6 +36599,7 @@ "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -37663,7 +37023,6 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -37743,7 +37102,6 @@ "integrity": "sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -37829,6 +37187,7 @@ "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", @@ -38039,7 +37398,6 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -38053,7 +37411,6 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -38070,8 +37427,7 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -38079,7 +37435,6 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -38093,7 +37448,6 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -38126,7 +37480,6 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -38363,8 +37716,7 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/style-to-js": { "version": "1.1.21", @@ -38454,7 +37806,6 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -38469,7 +37820,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -38564,6 +37914,7 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -38759,7 +38110,6 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -38848,7 +38198,6 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -38863,8 +38212,7 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.12", @@ -38872,7 +38220,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -38885,7 +38232,6 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -38907,7 +38253,6 @@ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -39076,8 +38421,7 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/thunky": { "version": "1.1.0", @@ -39179,8 +38523,7 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -39217,8 +38560,7 @@ "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz", "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/totalist": { "version": "3.0.1", @@ -39356,13 +38698,15 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -39522,7 +38866,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -39633,6 +38976,7 @@ "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 18" }, @@ -39678,6 +39022,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -40041,6 +39386,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -40281,7 +39627,6 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -40362,6 +39707,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", @@ -40511,6 +39857,7 @@ "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.1.0", "@vitest/mocker": "4.1.0", @@ -40592,8 +39939,7 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/walker": { "version": "1.0.8", @@ -40601,7 +39947,6 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -40634,7 +39979,6 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -40660,6 +40004,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -41176,8 +40521,7 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -41194,8 +40538,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.1.tgz", "integrity": "sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/which": { "version": "4.0.0", @@ -41459,6 +40802,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -41520,7 +40864,6 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -41535,7 +40878,6 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -41570,7 +40912,6 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -41585,7 +40926,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" } @@ -41596,7 +40936,6 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -41631,6 +40970,7 @@ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "devOptional": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -42052,7 +41392,6 @@ "integrity": "sha512-rp1mBnA5msGDPTfFuqVl+9RsJOtuA0cXsWSJpHdvsIxcSVg0oJyF/rgvrwsFrNQCLXzkMXm+o3CsY9iL1D/CDA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/code-signing-certificates": "^0.0.6", "@expo/config": "~55.0.8", @@ -42135,7 +41474,6 @@ "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -42158,7 +41496,6 @@ "integrity": "sha512-bY4/rfcZ0f43DvOtMn8/kmPlmo01tex5hRoc5hKbwBwQjqWQuQt0ACwu7akR9IHI4j0WNG48eL6cZB6dZUFrzg==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*", @@ -42171,7 +41508,6 @@ "integrity": "sha512-m7V1k2vlMp4NOj3fopjOg4zl/ANXyTRF3HMTMep2GZAKsPiDzgOQ41nm8CaU50/HlDIGXlCObss07gOn20UpHQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/dom-webview": "^55.0.3", "anser": "^1.4.9", @@ -42190,7 +41526,6 @@ "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -42227,7 +41562,6 @@ "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~55.0.8", "@expo/config-plugins": "~55.0.6", @@ -42250,7 +41584,6 @@ "integrity": "sha512-NZQzHwkaedufNPayVfPxsZGEMngOD3gDvYx9lld4sitRexrKDx5sHmmNHi6IByGbmCb4jwLXub5sIyWh6z1xPQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -42286,7 +41619,6 @@ "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -42314,7 +41646,6 @@ "integrity": "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -42337,7 +41668,6 @@ "integrity": "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -42356,25 +41686,12 @@ } } }, - "packages/replicache/node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, "packages/replicache/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -42385,7 +41702,6 @@ "integrity": "sha512-ti8t4xufD6gUQQh+qY+b+VT/1zyA0n1PBnwOzCkPUyEDiIVBpaOixR+BzVH68hqu9mH2wDfzoFuGgv+2LfRdqw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/generator": "^7.20.5", "@babel/helper-module-imports": "^7.25.9", @@ -42435,7 +41751,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -42453,7 +41768,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -42470,7 +41784,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -42480,8 +41793,7 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/expo": { "version": "55.0.6", @@ -42545,7 +41857,6 @@ "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.12", "expo-constants": "~55.0.7" @@ -42578,7 +41889,6 @@ "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -42606,7 +41916,6 @@ "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -42618,7 +41927,6 @@ "integrity": "sha512-MAGz1SYSVgQbwVeUysWgPtLh8ozbBwORatXoA4w0NZqZBZzEyBgUQNhuwaroaIi9W8Ir3wy1McmZcDYDJNGmVw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -42654,7 +41962,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -42682,7 +41989,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -42698,7 +42004,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -42724,8 +42029,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native": { "version": "0.84.1", @@ -42792,8 +42096,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.1.tgz", "integrity": "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/react-native/node_modules/ws": { "version": "7.5.10", @@ -42801,7 +42104,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -42824,7 +42126,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -42834,8 +42135,7 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/replicache/node_modules/string-width": { "version": "4.2.3", @@ -42843,7 +42143,6 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -42859,7 +42158,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -42873,7 +42171,6 @@ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -42892,7 +42189,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -42909,7 +42205,6 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -42977,7 +42272,7 @@ }, "packages/zero": { "name": "@rocicorp/zero", - "version": "0.26.2", + "version": "1.0.0", "license": "Apache-2.0", "dependencies": { "@badrap/valita": "0.3.11", @@ -43255,132 +42550,6 @@ "zql": "0.0.0" } }, - "packages/zero-server/node_modules/drizzle-orm": { - "version": "0.45.1", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", - "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=4", - "@electric-sql/pglite": ">=0.2.0", - "@libsql/client": ">=0.10.0", - "@libsql/client-wasm": ">=0.10.0", - "@neondatabase/serverless": ">=0.10.0", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1.13", - "@prisma/client": "*", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/sql.js": "*", - "@upstash/redis": ">=1.34.7", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=14.0.0", - "gel": ">=2", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "sql.js": ">=1", - "sqlite3": ">=5" - }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@libsql/client-wasm": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "gel": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "prisma": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, "packages/zero-solid": { "version": "0.0.0", "devDependencies": { @@ -43408,7 +42577,6 @@ "integrity": "sha512-rp1mBnA5msGDPTfFuqVl+9RsJOtuA0cXsWSJpHdvsIxcSVg0oJyF/rgvrwsFrNQCLXzkMXm+o3CsY9iL1D/CDA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/code-signing-certificates": "^0.0.6", "@expo/config": "~55.0.8", @@ -43491,7 +42659,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -43508,7 +42675,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -43526,7 +42692,6 @@ "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -43549,7 +42714,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -43566,7 +42730,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -43584,7 +42747,6 @@ "integrity": "sha512-bY4/rfcZ0f43DvOtMn8/kmPlmo01tex5hRoc5hKbwBwQjqWQuQt0ACwu7akR9IHI4j0WNG48eL6cZB6dZUFrzg==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*", @@ -43597,7 +42759,6 @@ "integrity": "sha512-m7V1k2vlMp4NOj3fopjOg4zl/ANXyTRF3HMTMep2GZAKsPiDzgOQ41nm8CaU50/HlDIGXlCObss07gOn20UpHQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/dom-webview": "^55.0.3", "anser": "^1.4.9", @@ -43616,7 +42777,6 @@ "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -43653,7 +42813,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -43670,7 +42829,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -43694,7 +42852,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -43722,7 +42879,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -43738,7 +42894,6 @@ "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~55.0.8", "@expo/config-plugins": "~55.0.6", @@ -43761,7 +42916,6 @@ "integrity": "sha512-NZQzHwkaedufNPayVfPxsZGEMngOD3gDvYx9lld4sitRexrKDx5sHmmNHi6IByGbmCb4jwLXub5sIyWh6z1xPQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -43797,7 +42951,6 @@ "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -43825,7 +42978,6 @@ "integrity": "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -43848,7 +43000,6 @@ "integrity": "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -43867,25 +43018,12 @@ } } }, - "packages/zero/node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, "packages/zero/node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -43896,7 +43034,6 @@ "integrity": "sha512-ti8t4xufD6gUQQh+qY+b+VT/1zyA0n1PBnwOzCkPUyEDiIVBpaOixR+BzVH68hqu9mH2wDfzoFuGgv+2LfRdqw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/generator": "^7.20.5", "@babel/helper-module-imports": "^7.25.9", @@ -43946,7 +43083,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -43956,8 +43092,7 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/expo": { "version": "55.0.6", @@ -44021,7 +43156,6 @@ "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@expo/image-utils": "^0.8.12", "expo-constants": "~55.0.7" @@ -44054,7 +43188,6 @@ "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -44082,7 +43215,6 @@ "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -44094,7 +43226,6 @@ "integrity": "sha512-MAGz1SYSVgQbwVeUysWgPtLh8ozbBwORatXoA4w0NZqZBZzEyBgUQNhuwaroaIi9W8Ir3wy1McmZcDYDJNGmVw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -44124,7 +43255,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -44150,8 +43280,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native": { "version": "0.84.1", @@ -44218,8 +43347,7 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.1.tgz", "integrity": "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/react-native/node_modules/ws": { "version": "7.5.10", @@ -44227,7 +43355,6 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -44250,7 +43377,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -44260,8 +43386,7 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "packages/zero/node_modules/string-width": { "version": "4.2.3", @@ -44269,7 +43394,6 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -44285,7 +43409,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -44299,7 +43422,6 @@ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -44318,7 +43440,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -44335,7 +43456,6 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/packages/zero/package.json b/packages/zero/package.json index f404aad204..50ef58bef3 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero", - "version": "0.26.2", + "version": "1.0.0", "description": "Zero is a web framework for serverless web development.", "author": "Rocicorp, Inc.", "repository": { From 1c75c19b1265ca658048a3c5849d7ee23f5c2e9a Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Tue, 24 Mar 2026 00:09:37 -1000 Subject: [PATCH 167/495] Bump Zero version to 1.0.1 --- apps/zbugs/package.json | 2 +- package-lock.json | 5 ++--- packages/zero/package.json | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index c9231b65f0..5bead83938 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -44,7 +44,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "1.0.0", + "@rocicorp/zero": "1.0.1", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", diff --git a/package-lock.json b/package-lock.json index ffa0c71b11..83ad83cc39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "1.0.0", + "@rocicorp/zero": "1.0.1", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", @@ -38706,7 +38706,6 @@ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -42272,7 +42271,7 @@ }, "packages/zero": { "name": "@rocicorp/zero", - "version": "1.0.0", + "version": "1.0.1", "license": "Apache-2.0", "dependencies": { "@badrap/valita": "0.3.11", diff --git a/packages/zero/package.json b/packages/zero/package.json index 50ef58bef3..5264d20d8f 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero", - "version": "1.0.0", + "version": "1.0.1", "description": "Zero is a web framework for serverless web development.", "author": "Rocicorp, Inc.", "repository": { From 8c0d15f390e7a7454a43cec32f9f83612acc5eea Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Tue, 24 Mar 2026 11:44:18 +0100 Subject: [PATCH 168/495] chore: Reset Bencher thresholds (#5682) --- .github/workflows/bencher-benchmarks-pr.yml | 3 +- .github/workflows/bencher-benchmarks.yml | 3 +- .github/workflows/reusable-benchmark.yml | 7 +- package-lock.json | 528 ++++++++++++++++---- 4 files changed, 427 insertions(+), 114 deletions(-) diff --git a/.github/workflows/bencher-benchmarks-pr.yml b/.github/workflows/bencher-benchmarks-pr.yml index 7e86cf0106..5369fe31ba 100644 --- a/.github/workflows/bencher-benchmarks-pr.yml +++ b/.github/workflows/bencher-benchmarks-pr.yml @@ -136,4 +136,5 @@ jobs: --threshold-lower-boundary 0.99 \ --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ - --err + --err \ + --thresholds-reset diff --git a/.github/workflows/bencher-benchmarks.yml b/.github/workflows/bencher-benchmarks.yml index afb12c6366..32c847f523 100644 --- a/.github/workflows/bencher-benchmarks.yml +++ b/.github/workflows/bencher-benchmarks.yml @@ -104,4 +104,5 @@ jobs: --threshold-lower-boundary 0.99 \ --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ - --err + --err \ + --thresholds-reset diff --git a/.github/workflows/reusable-benchmark.yml b/.github/workflows/reusable-benchmark.yml index 82e9edf4cb..2291549ee2 100644 --- a/.github/workflows/reusable-benchmark.yml +++ b/.github/workflows/reusable-benchmark.yml @@ -83,7 +83,8 @@ jobs: --threshold-lower-boundary 0.99 \ --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ - --err + --err \ + --thresholds-reset - name: Upload PR benchmarks results to bencher.dev if: ${{ inputs.is_pr }} @@ -108,4 +109,6 @@ jobs: --threshold-lower-boundary 0.99 \ --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ - --err + --err \ + --thresholds-reset + diff --git a/package-lock.json b/package-lock.json index 83ad83cc39..73f521ef7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -321,7 +321,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.49.2", "@algolia/requester-browser-xhr": "5.49.2", @@ -1345,7 +1344,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -1779,6 +1777,7 @@ "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", @@ -1797,6 +1796,7 @@ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1825,6 +1825,7 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1838,6 +1839,7 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1851,6 +1853,7 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1864,6 +1867,7 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1880,6 +1884,7 @@ "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1908,6 +1913,7 @@ "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1924,6 +1930,7 @@ "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1970,6 +1977,7 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1983,6 +1991,7 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2011,6 +2020,7 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2024,6 +2034,7 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2037,6 +2048,7 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2050,6 +2062,7 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2063,6 +2076,7 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2076,6 +2090,7 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2089,6 +2104,7 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2105,6 +2121,7 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2423,6 +2440,7 @@ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" @@ -2853,6 +2871,7 @@ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2869,6 +2888,7 @@ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -3347,6 +3367,7 @@ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -3596,7 +3617,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -3619,7 +3639,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -6193,7 +6212,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6534,7 +6552,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7089,8 +7106,7 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz", "integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.20", @@ -8030,6 +8046,7 @@ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "node-forge": "^1.3.3" } @@ -8040,6 +8057,7 @@ "integrity": "sha512-D7RYYHfErCgEllGxNwdYdkgzLna7zkzUECBV3snbUpf7RvIpB5l1LpCgzuVoc5KVew5h7N1Tn4LnT/tBSUZsQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config-plugins": "~55.0.6", "@expo/config-types": "^55.0.5", @@ -8060,6 +8078,7 @@ "integrity": "sha512-cIox6FjZlFaaX40rbQ3DvP9e87S5X85H9uw+BAxJE5timkMhuByy3GAlOsj1h96EyzSiol7Q6YIGgY1Jiz4M+A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config-types": "^55.0.5", "@expo/json-file": "~10.0.12", @@ -8082,6 +8101,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8098,6 +8118,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8115,6 +8136,7 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8125,6 +8147,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8137,7 +8160,8 @@ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-55.0.5.tgz", "integrity": "sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/config/node_modules/resolve-from": { "version": "5.0.0", @@ -8145,6 +8169,7 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8155,6 +8180,7 @@ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" @@ -8166,6 +8192,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8176,6 +8203,7 @@ "integrity": "sha512-rVvHC4I6xlPcg+mAO09ydUi2Wjv1ZytpLmHOSzvXzBAz9mMrJggqCe4s4dubjJvi/Ino/xQCLhbaLCnTtLpikg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", @@ -8191,6 +8219,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8207,6 +8236,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8224,6 +8254,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8237,6 +8268,7 @@ "integrity": "sha512-nRITNbnu3RKSHPvKVehrSU4KG2VY9V8nvULOHBw98ukHCAU4bGrU5APvcblOkX3JAap+xEHsg/mZvqlvkLInmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/env": "^2.0.11", "@expo/spawn-async": "^1.7.2", @@ -8260,6 +8292,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8276,6 +8309,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8293,6 +8327,7 @@ "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "brace-expansion": "^5.0.2" }, @@ -8309,6 +8344,7 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8319,6 +8355,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8332,6 +8369,7 @@ "integrity": "sha512-3KguH7kyKqq7pNwLb9j6BBdD/bjmNwXZG/HPWT6GWIXbwrvAJt2JNyYTP5agWJ8jbbuys1yuCzmkX+TU6rmI7A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", @@ -8348,6 +8386,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8364,6 +8403,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8381,6 +8421,7 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8391,6 +8432,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8404,6 +8446,7 @@ "integrity": "sha512-inbDycp1rMAelAofg7h/mMzIe+Owx6F7pur3XdQ3EPTy00tme+4P6FWgHKUcjN8dBSrnbRNpSyh5/shzHyVCyQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "json5": "^2.2.3" @@ -8415,6 +8458,7 @@ "integrity": "sha512-4kfdv48sKzokijMqi07fINYA9/XprshmPgSLf8i69XgzIv2YdRyBbb70SzrufB7PDneFoltz8N83icW8gOOj1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~55.0.8", "chalk": "^4.1.2" @@ -8426,6 +8470,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8442,6 +8487,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8459,6 +8505,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8472,6 +8519,7 @@ "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", @@ -8495,6 +8543,7 @@ "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2" }, @@ -8508,6 +8557,7 @@ "integrity": "sha512-ZuXiK/9fCrIuLjPSe1VYmfp0Sa85kCMwd8QQpgyi5ufppYKRtLBg14QOgUqj8ZMbJTxE0xqzd0XR7kOs3vAK9A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/json-file": "^10.0.12", "@expo/spawn-async": "^1.7.2", @@ -8523,6 +8573,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8539,6 +8590,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8556,6 +8608,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8569,6 +8622,7 @@ "integrity": "sha512-o4xdVdBpe4aTl3sPMZ2u3fJH4iG1I768EIRk1xRZP+GaFI93MaR3JvoFibYqxeTmLQ1p1kNEVqylfUjezxx45g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -8581,6 +8635,7 @@ "integrity": "sha512-dV5oCShQ1umKBKagMMT4B/N+SREsQe3lU4Zgmko5AO0rxKV0tynZT6xXs+e2JxuqT4Rz997atg7pki0BnZb4uw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.25.2", @@ -8600,14 +8655,16 @@ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.2.tgz", "integrity": "sha512-QZ5WKbJOWkCrMq0/kfhV9ry8te/OaS34YgLVpG8u9y2gix96TlpRTbxM/YATjNcUR2s4fiQmPCOxkGtog4i37g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/spawn-async": { "version": "1.7.2", @@ -8615,6 +8672,7 @@ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.3" }, @@ -8627,14 +8685,16 @@ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@expo/xcpretty": { "version": "4.4.1", @@ -8642,6 +8702,7 @@ "integrity": "sha512-KZNxZvnGCtiM2aYYZ6Wz0Ix5r47dAvpNLApFtZWnSoERzAdOMzVBOPysBoM0JlF6FKWZ8GPqgn6qt3dV/8Zlpg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "chalk": "^4.1.0", @@ -8657,6 +8718,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8673,6 +8735,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8690,6 +8753,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9370,6 +9434,7 @@ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -9380,6 +9445,7 @@ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -9397,6 +9463,7 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9407,6 +9474,7 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9421,6 +9489,7 @@ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9435,6 +9504,7 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9448,6 +9518,7 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9464,6 +9535,7 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9477,6 +9549,7 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -9487,6 +9560,7 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -9497,6 +9571,7 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -9507,6 +9582,7 @@ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -9520,6 +9596,7 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -9536,6 +9613,7 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -9566,6 +9644,7 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -9593,6 +9672,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -9609,6 +9689,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9626,6 +9707,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9639,6 +9721,7 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -10298,7 +10381,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -10429,7 +10511,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10626,7 +10707,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10723,7 +10803,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -13588,7 +13667,6 @@ "integrity": "sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.5.0" }, @@ -13960,6 +14038,7 @@ "integrity": "sha512-lAJ6PDZv95FdT9s9uhc9ivhikW1Zwh4j9XdXM7J2l4oUA3t37qfoBmTSDLuPyE3Bi+Xtwa11hJm0BUTT2sc/gg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -13970,6 +14049,7 @@ "integrity": "sha512-XbcN/BEa64pVlb0Hb/E/Ph2SepjVN/FcNKrJcQvtaKZA6mBSO8pW8Eircdlr61/KBH94LihHbQoQDzkQFpeaTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.83.2" @@ -13984,6 +14064,7 @@ "integrity": "sha512-X/RAXDfe6W+om/Fw1i6htTxQXFhBJ2jgNOWx3WpI3KbjeIWbq7ib6vrpTeIAW2NUMg+K3mML1NzgD4dpZeqdjA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -14044,6 +14125,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -14054,6 +14136,7 @@ "integrity": "sha512-9uK6X1miCXqtL4c759l74N/XbQeneWeQVjoV7SD2CGJuW7ZefxaoYenwGPs7rMoCdtS6wuIyR3hXQ+uWEBGYXA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -14075,7 +14158,8 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@react-native/codegen/node_modules/brace-expansion": { "version": "1.1.12", @@ -14083,6 +14167,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14095,6 +14180,7 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14116,6 +14202,7 @@ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14129,6 +14216,7 @@ "integrity": "sha512-f6a+mJEJ6Joxlt/050TqYUr7uRRbeKnz8lnpL7JajhpsgZLEbkJRjH8HY5QiLcRdUwWFtizml4V+vcO3P4RxoQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.84.1", "debug": "^4.4.0", @@ -14160,6 +14248,7 @@ "integrity": "sha512-rUU/Pyh3R5zT0WkVgB+yA6VwOp7HM5Hz4NYE97ajFS07OUIcv8JzBL3MXVdSSjLfldfqOuPEuKUaZcAOwPgabw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14170,6 +14259,7 @@ "integrity": "sha512-LIGhh4q4ette3yW5OzmukNMYwmINYrRGDZqKyTYc/VZyNpblZPw72coXVHXdfpPT6+YlxHqXzn3UjFZpNODGCQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "debug": "^4.4.0", @@ -14185,6 +14275,7 @@ "integrity": "sha512-Z83ra+Gk6ElAhH3XRrv3vwbwCPTb04sPPlNpotxcFZb5LtRQZwT91ZQEXw3GOJCVIFp9EQ/gj8AQbVvtHKOUlQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.84.1", @@ -14209,6 +14300,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -14226,6 +14318,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -14248,6 +14341,7 @@ "integrity": "sha512-t4fYfa7xopbUF5S4+ihNEwgaq4wLZLKLY0Ms8z72lkMteVd3bOX2Foxa8E2wTfRvdhPOkSpOsTeNDmD8ON4DoQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14258,6 +14352,7 @@ "integrity": "sha512-z9go6NJMsLSDJT5MW6VGugRsZHjYvUTwxtsVc3uLt4U9W6T3J6FWI2wHpXIzd2dUkXRfAiRQ3Zi8ZQQ8fRFg9A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -14272,6 +14367,7 @@ "integrity": "sha512-Zi4EVaAm28+icD19NN07Gh8Pqg/84QQu+jn4patfWKNkcToRFP5vPEbbp0eLOGWS+BVB1d1Fn5lvMrJsBbFcOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.2", @@ -14296,6 +14392,7 @@ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -14313,6 +14410,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -14335,6 +14433,7 @@ "integrity": "sha512-7uVlPBE3uluRNRX4MW7PUJIO1LDBTpAqStKHU7LHH+GRrdZbHsWtOEAX8PiY4GFfBEvG8hEjiuTOqAxMjV+hDg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14345,6 +14444,7 @@ "integrity": "sha512-UsTe2AbUugsfyI7XIHMQq4E7xeC8a6GrYwuK+NohMMMJMxmyM3JkzIk+GB9e2il6ScEQNMJNaj+q+i5za8itxQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -14354,7 +14454,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.2.tgz", "integrity": "sha512-gkZAb9LoVVzNuYzzOviH7DiPTXQoZPHuiTH2+O2+VWNtOkiznjgvqpwYAhg58a5zfRq5GXlbBdf5mzRj5+3Y5Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@react-stately/flags": { "version": "3.1.2", @@ -14968,6 +15069,7 @@ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -14978,6 +15080,7 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -15913,7 +16016,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -16051,7 +16153,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", - "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.23" }, @@ -16069,7 +16170,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -16177,7 +16277,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -16608,6 +16707,7 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -16754,7 +16854,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -16831,7 +16930,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -16991,7 +17089,8 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/strip-ansi": { "version": "3.0.0", @@ -17358,7 +17457,6 @@ "integrity": "sha512-tG/iOrgbiHQks0ew7CdelUyNEHkv8NLrt+CqdTivIuoSnXvO7scWMn4Kqo78/UGY1NJ6Hv+vp8BvRnED/bjFdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.0", @@ -17382,7 +17480,6 @@ "integrity": "sha512-2RU7pZELY9/aVMLmABNy1HeZ4FX23FXGY1jRuHLHgWa2zaAE49aNW2GLzebW+BmbTZIKKyFF1QXvk7DEWViUCQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.1.0", "@vitest/mocker": "4.1.0", @@ -17697,6 +17794,7 @@ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" } @@ -17818,7 +17916,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -17904,7 +18001,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -17965,7 +18061,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.15.2", "@algolia/client-abtesting": "5.49.2", @@ -18007,7 +18102,8 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ansi-align": { "version": "3.0.1", @@ -18434,7 +18530,8 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/asn1": { "version": "0.2.6", @@ -18666,6 +18763,7 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -18688,6 +18786,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -18704,6 +18803,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18721,6 +18821,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -18760,6 +18861,7 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -18777,6 +18879,7 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -18881,7 +18984,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/babel-plugin-transform-flow-enums": { "version": "0.0.2", @@ -18889,6 +18993,7 @@ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -18899,6 +19004,7 @@ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -18926,6 +19032,7 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -18979,6 +19086,7 @@ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "18 || 20 || >=22" } @@ -19167,6 +19275,7 @@ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "open": "^8.0.4" }, @@ -19180,6 +19289,7 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">=0.6" } @@ -19375,6 +19485,7 @@ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -19385,6 +19496,7 @@ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -19398,6 +19510,7 @@ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^4.0.2" }, @@ -19446,7 +19559,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -19467,6 +19579,7 @@ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -19906,6 +20019,7 @@ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -19934,6 +20048,7 @@ "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -20034,6 +20149,7 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -20047,6 +20163,7 @@ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -20165,6 +20282,7 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8" } @@ -21482,7 +21600,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -21658,6 +21775,7 @@ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -21899,7 +22017,8 @@ "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.3.tgz", "integrity": "sha512-XENsHi3MBzWOCAXif3yZvU1Ah0l+nhJj1sjWL6TnOAYKvGiFhbTx32xHN7+wLMLUOCj7Nr0evADWG4R8JtqCDA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/docker-compose": { "version": "0.24.8", @@ -22483,6 +22602,7 @@ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -22561,7 +22681,6 @@ "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -23712,6 +23831,7 @@ "integrity": "sha512-OXIrxSYKlT/1Av1AMyUWeSTW1GChGofWV14sB73o5eFbfuz6ocv18fnKx+Ji67ZC7a0RztDctcZTuEQK84S4iw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/require-utils": "^55.0.2", "@expo/spawn-async": "^1.7.2", @@ -23728,6 +23848,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -23744,6 +23865,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -23761,6 +23883,7 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -23771,6 +23894,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -23794,7 +23918,8 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/express": { "version": "4.22.1", @@ -24215,6 +24340,7 @@ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "dev": true, "license": "(MIT OR Apache-2.0)", + "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -24228,6 +24354,7 @@ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "bser": "2.1.1" } @@ -24266,7 +24393,8 @@ "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.9.tgz", "integrity": "sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/figures": { "version": "3.2.0", @@ -24317,7 +24445,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24581,7 +24708,8 @@ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -24608,7 +24736,8 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/for-each": { "version": "0.3.5", @@ -24945,6 +25074,7 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -25026,6 +25156,7 @@ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -25066,6 +25197,7 @@ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", @@ -25118,6 +25250,7 @@ "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "brace-expansion": "^5.0.2" }, @@ -25256,7 +25389,6 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10.x" } @@ -25630,14 +25762,16 @@ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.9.tgz", "integrity": "sha512-hZ5O7PDz1vQ99TS7HD3FJ9zVynfU1y+VWId6U1Pldvd8hmAYrNec/XLPYJKD3dLOW6NXak6aAQAuMuSo3ji0tQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-parser": { "version": "0.32.0", @@ -25645,6 +25779,7 @@ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -25684,7 +25819,6 @@ "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -25695,6 +25829,7 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -25707,7 +25842,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/hpack.js": { "version": "2.1.6", @@ -26767,6 +26903,7 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -26784,6 +26921,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -26859,6 +26997,7 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -26877,6 +27016,7 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -26887,6 +27027,7 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -26913,6 +27054,7 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -26934,6 +27076,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -26951,6 +27094,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -26967,6 +27111,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -26981,7 +27126,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", @@ -26989,6 +27135,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -27002,6 +27149,7 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -27017,6 +27165,7 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -27099,6 +27248,7 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -27117,6 +27267,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -27134,6 +27285,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -27150,6 +27302,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -27164,7 +27317,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", @@ -27172,6 +27326,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -27199,14 +27354,14 @@ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -27287,7 +27442,8 @@ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/jsesc": { "version": "3.1.0", @@ -27433,6 +27589,7 @@ "integrity": "sha512-EZgbsXMrGS+oK+Ta12mCjzBFse+SIewGdwrSTr5g+MSymnjpox2x05ceI20PQejJOFvOgzcXrfDk/SdY7dSCtw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" } @@ -27560,6 +27717,7 @@ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -27571,6 +27729,7 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -27580,7 +27739,8 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lightningcss": { "version": "1.32.0", @@ -27934,7 +28094,8 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -27948,6 +28109,7 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.0.1" }, @@ -27961,6 +28123,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -27974,6 +28137,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -27989,6 +28153,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -27998,7 +28163,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -28006,6 +28172,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -28016,6 +28183,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -28026,6 +28194,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -28162,7 +28331,6 @@ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", @@ -28197,6 +28365,7 @@ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -28253,7 +28422,8 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -28722,7 +28892,8 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/merge-anything": { "version": "5.1.7", @@ -28779,6 +28950,7 @@ "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -28834,6 +29006,7 @@ "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -28850,6 +29023,7 @@ "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -28866,6 +29040,7 @@ "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -28879,6 +29054,7 @@ "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -28899,6 +29075,7 @@ "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -28914,6 +29091,7 @@ "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -28935,6 +29113,7 @@ "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -28949,6 +29128,7 @@ "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -28962,6 +29142,7 @@ "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -28976,6 +29157,7 @@ "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -28998,6 +29180,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -29008,6 +29191,7 @@ "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -29029,6 +29213,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -29039,6 +29224,7 @@ "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -29057,6 +29243,7 @@ "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -29082,6 +29269,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -29098,6 +29286,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -29114,7 +29303,8 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/metro/node_modules/image-size": { "version": "1.2.1", @@ -29122,6 +29312,7 @@ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -29138,6 +29329,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -29148,6 +29340,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -29161,6 +29354,7 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -29171,6 +29365,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -29184,6 +29379,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -31327,8 +31523,7 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", @@ -31372,7 +31567,8 @@ "resolved": "https://registry.npmjs.org/multitars/-/multitars-0.2.4.tgz", "integrity": "sha512-XgLbg1HHchFauMCQPRwMj6MSyDd5koPlTA1hM3rUFkeXzGpjU/I9fP3to7yrObE9jcN8ChIOQGrM0tV0kUZaKg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/mysql2": { "version": "3.15.3", @@ -31380,7 +31576,6 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -31587,6 +31782,7 @@ "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "dev": true, "license": "(BSD-3-Clause OR GPL-2.0)", + "peer": true, "engines": { "node": ">= 6.13.0" } @@ -31607,7 +31803,8 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/node-releases": { "version": "2.0.36", @@ -31657,6 +31854,7 @@ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -31735,7 +31933,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -31785,7 +31982,8 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/nypm": { "version": "0.6.5", @@ -31818,6 +32016,7 @@ "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -32010,6 +32209,7 @@ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -32028,6 +32228,7 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -32038,6 +32239,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -32051,6 +32253,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -32066,6 +32269,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -32075,7 +32279,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -32083,6 +32288,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -32093,6 +32299,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -32103,6 +32310,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -32116,6 +32324,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -32230,7 +32439,6 @@ "integrity": "sha512-TdrKhDZCgEYqONFo/j+KvGan7/k3tP5Ouz88wCqpOvJtI2QmcLfGsm1fcMvDnTik48Jj6z83IJBqlkmK9DnY1A==", "dev": true, "license": "MIT", - "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -32363,6 +32571,7 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -32550,6 +32759,7 @@ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pngjs": "^3.3.0" }, @@ -32563,6 +32773,7 @@ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0.0" } @@ -32698,6 +32909,7 @@ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -32715,6 +32927,7 @@ "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -32763,7 +32976,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", @@ -33081,6 +33293,7 @@ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -33142,7 +33355,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -34356,7 +34568,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -34617,7 +34828,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "7.5.0", "@prisma/dev": "0.20.0", @@ -34660,6 +34870,7 @@ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -34709,6 +34920,7 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.4.0" } @@ -34719,6 +34931,7 @@ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -34964,6 +35177,7 @@ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -35088,7 +35302,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -35102,6 +35315,7 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -35113,6 +35327,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -35134,7 +35349,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -35209,7 +35423,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -35286,7 +35499,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -35563,7 +35775,8 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/regexp-to-ast": { "version": "0.5.0", @@ -36073,7 +36286,8 @@ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz", "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/responselike": { "version": "3.0.0", @@ -36096,6 +36310,7 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -36110,6 +36325,7 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -36120,6 +36336,7 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -36580,6 +36797,7 @@ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -36599,7 +36817,6 @@ "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -37023,6 +37240,7 @@ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", @@ -37102,6 +37320,7 @@ "integrity": "sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -37187,7 +37406,6 @@ "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", @@ -37398,6 +37616,7 @@ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -37411,6 +37630,7 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -37427,7 +37647,8 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -37435,6 +37656,7 @@ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -37448,6 +37670,7 @@ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=8" } @@ -37480,6 +37703,7 @@ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, "license": "Unlicense", + "peer": true, "engines": { "node": ">= 0.10.0" } @@ -37716,7 +37940,8 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/style-to-js": { "version": "1.1.21", @@ -37806,6 +38031,7 @@ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -37820,6 +38046,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -37914,7 +38141,6 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -38110,6 +38336,7 @@ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -38198,6 +38425,7 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -38212,7 +38440,8 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.12", @@ -38220,6 +38449,7 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -38232,6 +38462,7 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -38253,6 +38484,7 @@ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -38421,7 +38653,8 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/thunky": { "version": "1.1.0", @@ -38523,7 +38756,8 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -38560,7 +38794,8 @@ "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz", "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/totalist": { "version": "3.0.1", @@ -38698,8 +38933,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", @@ -38865,6 +39099,7 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -38975,7 +39210,6 @@ "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 18" }, @@ -39021,7 +39255,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -39385,7 +39618,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -39626,6 +39858,7 @@ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -39706,7 +39939,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "license": "MIT", - "peer": true, "dependencies": { "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", @@ -39856,7 +40088,6 @@ "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.1.0", "@vitest/mocker": "4.1.0", @@ -39938,7 +40169,8 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/walker": { "version": "1.0.8", @@ -39946,6 +40178,7 @@ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -39978,6 +40211,7 @@ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -40003,7 +40237,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -40520,7 +40753,8 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -40537,7 +40771,8 @@ "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.1.tgz", "integrity": "sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/which": { "version": "4.0.0", @@ -40801,7 +41036,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -40863,6 +41097,7 @@ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" @@ -40877,6 +41112,7 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -40911,6 +41147,7 @@ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -40925,6 +41162,7 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4.0" } @@ -40935,6 +41173,7 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.0" } @@ -40969,7 +41208,6 @@ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "devOptional": true, "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -41391,6 +41629,7 @@ "integrity": "sha512-rp1mBnA5msGDPTfFuqVl+9RsJOtuA0cXsWSJpHdvsIxcSVg0oJyF/rgvrwsFrNQCLXzkMXm+o3CsY9iL1D/CDA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/code-signing-certificates": "^0.0.6", "@expo/config": "~55.0.8", @@ -41473,6 +41712,7 @@ "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -41495,6 +41735,7 @@ "integrity": "sha512-bY4/rfcZ0f43DvOtMn8/kmPlmo01tex5hRoc5hKbwBwQjqWQuQt0ACwu7akR9IHI4j0WNG48eL6cZB6dZUFrzg==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*", @@ -41507,6 +41748,7 @@ "integrity": "sha512-m7V1k2vlMp4NOj3fopjOg4zl/ANXyTRF3HMTMep2GZAKsPiDzgOQ41nm8CaU50/HlDIGXlCObss07gOn20UpHQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/dom-webview": "^55.0.3", "anser": "^1.4.9", @@ -41525,6 +41767,7 @@ "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -41561,6 +41804,7 @@ "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~55.0.8", "@expo/config-plugins": "~55.0.6", @@ -41583,6 +41827,7 @@ "integrity": "sha512-NZQzHwkaedufNPayVfPxsZGEMngOD3gDvYx9lld4sitRexrKDx5sHmmNHi6IByGbmCb4jwLXub5sIyWh6z1xPQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -41618,6 +41863,7 @@ "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -41645,6 +41891,7 @@ "integrity": "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -41667,6 +41914,7 @@ "integrity": "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -41691,6 +41939,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -41701,6 +41950,7 @@ "integrity": "sha512-ti8t4xufD6gUQQh+qY+b+VT/1zyA0n1PBnwOzCkPUyEDiIVBpaOixR+BzVH68hqu9mH2wDfzoFuGgv+2LfRdqw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/generator": "^7.20.5", "@babel/helper-module-imports": "^7.25.9", @@ -41750,6 +42000,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -41767,6 +42018,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -41783,6 +42035,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -41792,7 +42045,8 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/expo": { "version": "55.0.6", @@ -41856,6 +42110,7 @@ "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.12", "expo-constants": "~55.0.7" @@ -41888,6 +42143,7 @@ "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -41915,6 +42171,7 @@ "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -41926,6 +42183,7 @@ "integrity": "sha512-MAGz1SYSVgQbwVeUysWgPtLh8ozbBwORatXoA4w0NZqZBZzEyBgUQNhuwaroaIi9W8Ir3wy1McmZcDYDJNGmVw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -41961,6 +42219,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -41988,6 +42247,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -42003,6 +42263,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -42028,7 +42289,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native": { "version": "0.84.1", @@ -42095,7 +42357,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.1.tgz", "integrity": "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/react-native/node_modules/ws": { "version": "7.5.10", @@ -42103,6 +42366,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -42125,6 +42389,7 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -42134,7 +42399,8 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/replicache/node_modules/string-width": { "version": "4.2.3", @@ -42142,6 +42408,7 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -42157,6 +42424,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -42170,6 +42438,7 @@ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -42188,6 +42457,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -42204,6 +42474,7 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -42576,6 +42847,7 @@ "integrity": "sha512-rp1mBnA5msGDPTfFuqVl+9RsJOtuA0cXsWSJpHdvsIxcSVg0oJyF/rgvrwsFrNQCLXzkMXm+o3CsY9iL1D/CDA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/code-signing-certificates": "^0.0.6", "@expo/config": "~55.0.8", @@ -42658,6 +42930,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -42674,6 +42947,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -42691,6 +42965,7 @@ "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -42713,6 +42988,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -42729,6 +43005,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -42746,6 +43023,7 @@ "integrity": "sha512-bY4/rfcZ0f43DvOtMn8/kmPlmo01tex5hRoc5hKbwBwQjqWQuQt0ACwu7akR9IHI4j0WNG48eL6cZB6dZUFrzg==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*", @@ -42758,6 +43036,7 @@ "integrity": "sha512-m7V1k2vlMp4NOj3fopjOg4zl/ANXyTRF3HMTMep2GZAKsPiDzgOQ41nm8CaU50/HlDIGXlCObss07gOn20UpHQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/dom-webview": "^55.0.3", "anser": "^1.4.9", @@ -42776,6 +43055,7 @@ "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", @@ -42812,6 +43092,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -42828,6 +43109,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -42851,6 +43133,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -42878,6 +43161,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -42893,6 +43177,7 @@ "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~55.0.8", "@expo/config-plugins": "~55.0.6", @@ -42915,6 +43200,7 @@ "integrity": "sha512-NZQzHwkaedufNPayVfPxsZGEMngOD3gDvYx9lld4sitRexrKDx5sHmmNHi6IByGbmCb4jwLXub5sIyWh6z1xPQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -42950,6 +43236,7 @@ "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", @@ -42977,6 +43264,7 @@ "integrity": "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -42999,6 +43287,7 @@ "integrity": "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -43023,6 +43312,7 @@ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -43033,6 +43323,7 @@ "integrity": "sha512-ti8t4xufD6gUQQh+qY+b+VT/1zyA0n1PBnwOzCkPUyEDiIVBpaOixR+BzVH68hqu9mH2wDfzoFuGgv+2LfRdqw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/generator": "^7.20.5", "@babel/helper-module-imports": "^7.25.9", @@ -43082,6 +43373,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -43091,7 +43383,8 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/expo": { "version": "55.0.6", @@ -43155,6 +43448,7 @@ "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@expo/image-utils": "^0.8.12", "expo-constants": "~55.0.7" @@ -43187,6 +43481,7 @@ "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react-native": "*" @@ -43214,6 +43509,7 @@ "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "expo": "*", "react": "*" @@ -43225,6 +43521,7 @@ "integrity": "sha512-MAGz1SYSVgQbwVeUysWgPtLh8ozbBwORatXoA4w0NZqZBZzEyBgUQNhuwaroaIi9W8Ir3wy1McmZcDYDJNGmVw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -43254,6 +43551,7 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -43279,7 +43577,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native": { "version": "0.84.1", @@ -43346,7 +43645,8 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.1.tgz", "integrity": "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/react-native/node_modules/ws": { "version": "7.5.10", @@ -43354,6 +43654,7 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -43376,6 +43677,7 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -43385,7 +43687,8 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "packages/zero/node_modules/string-width": { "version": "4.2.3", @@ -43393,6 +43696,7 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -43408,6 +43712,7 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -43421,6 +43726,7 @@ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -43439,6 +43745,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -43455,6 +43762,7 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 4f96f0bfa0411ea473f5552effad222f78709e73 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Tue, 24 Mar 2026 14:41:57 +0100 Subject: [PATCH 169/495] fix: update testbed to self-hosted-metal in benchmark workflows (#5683) This is so that we reset the alerts/thresholds. --- .github/workflows/bencher-benchmarks-pr.yml | 5 ++--- .github/workflows/bencher-benchmarks.yml | 6 +++--- .github/workflows/reusable-benchmark.yml | 11 +++++------ 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/workflows/bencher-benchmarks-pr.yml b/.github/workflows/bencher-benchmarks-pr.yml index 5369fe31ba..0652160fa6 100644 --- a/.github/workflows/bencher-benchmarks-pr.yml +++ b/.github/workflows/bencher-benchmarks-pr.yml @@ -121,7 +121,7 @@ jobs: cat output.json | bencher run \ --project zero \ - --testbed self-hosted \ + --testbed self-hosted-metal \ --token '${{ secrets.BENCHER_API_TOKEN }}' \ --adapter json \ --github-actions '${{ secrets.GITHUB_TOKEN }}' \ @@ -136,5 +136,4 @@ jobs: --threshold-lower-boundary 0.99 \ --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ - --err \ - --thresholds-reset + --err diff --git a/.github/workflows/bencher-benchmarks.yml b/.github/workflows/bencher-benchmarks.yml index 32c847f523..4c5d74a48e 100644 --- a/.github/workflows/bencher-benchmarks.yml +++ b/.github/workflows/bencher-benchmarks.yml @@ -94,7 +94,8 @@ jobs: cat output.json | bencher run \ --project zero \ - --testbed self-hosted \ + --ci-number ${{ github.run_number }} \ + --testbed self-hosted-metal \ --token '${{ secrets.BENCHER_API_TOKEN }}' \ --adapter json \ --github-actions '${{ secrets.GITHUB_TOKEN }}' \ @@ -104,5 +105,4 @@ jobs: --threshold-lower-boundary 0.99 \ --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ - --err \ - --thresholds-reset + --err diff --git a/.github/workflows/reusable-benchmark.yml b/.github/workflows/reusable-benchmark.yml index 2291549ee2..5f2c1b0ac2 100644 --- a/.github/workflows/reusable-benchmark.yml +++ b/.github/workflows/reusable-benchmark.yml @@ -73,7 +73,8 @@ jobs: npx tsx ../shared/src/tool/vitest-perf-json-to-bmf.ts |\ bencher run \ --project zero \ - --testbed self-hosted \ + --ci-number ${{ github.run_number }} \ + --testbed self-hosted-metal \ --token '${{ secrets.BENCHER_API_TOKEN }}' \ --adapter json \ --github-actions '${{ github.token }}' \ @@ -83,8 +84,7 @@ jobs: --threshold-lower-boundary 0.99 \ --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ - --err \ - --thresholds-reset + --err - name: Upload PR benchmarks results to bencher.dev if: ${{ inputs.is_pr }} @@ -94,7 +94,7 @@ jobs: npx tsx ../shared/src/tool/vitest-perf-json-to-bmf.ts |\ bencher run \ --project zero \ - --testbed self-hosted \ + --testbed self-hosted-metal \ --token '${{ secrets.BENCHER_API_TOKEN }}' \ --adapter json \ --github-actions '${{ github.token }}' \ @@ -109,6 +109,5 @@ jobs: --threshold-lower-boundary 0.99 \ --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ - --err \ - --thresholds-reset + --err From 168f3d5ca07abec3ad3d241a25972698e23645c2 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 24 Mar 2026 15:34:00 -0700 Subject: [PATCH 170/495] chore(zero-cache): log pg warnings at log_level=warn (#5685) --- packages/zero-cache/src/types/pg.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/zero-cache/src/types/pg.ts b/packages/zero-cache/src/types/pg.ts index db23fac313..05c1c41c8c 100644 --- a/packages/zero-cache/src/types/pg.ts +++ b/packages/zero-cache/src/types/pg.ts @@ -313,6 +313,8 @@ export function pgClient( lc.debug?.(n); return; case 'WARNING': + lc.warn?.(n); + return; case 'EXCEPTION': lc.error?.(n); return; From b2a52b0499e44cd286a4b3bf925e80fc34ccd2c2 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 24 Mar 2026 18:44:50 -0700 Subject: [PATCH 171/495] chore(zero-cache): increase `max_wal_senders` in the unit test pgs (#5686) --- packages/zero-cache/test/pg-container-setup.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/zero-cache/test/pg-container-setup.ts b/packages/zero-cache/test/pg-container-setup.ts index ff29d07e1d..49d7ce7d0f 100644 --- a/packages/zero-cache/test/pg-container-setup.ts +++ b/packages/zero-cache/test/pg-container-setup.ts @@ -10,6 +10,8 @@ export function runPostgresContainer(image: string, timezone: string) { '-c', 'max_replication_slots=100', '-c', + 'max_wal_senders=100', + '-c', `timezone=${timezone}`, ]) .start(); From 33e127ef106e4f4e919b87c58f403f331fe10406 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 24 Mar 2026 19:15:46 -0700 Subject: [PATCH 172/495] chore(zero-cache): quiet debug logging output from otel (#5687) --- .../src/server/anonymous-otel-start.ts | 57 ++++++------------- 1 file changed, 18 insertions(+), 39 deletions(-) diff --git a/packages/zero-cache/src/server/anonymous-otel-start.ts b/packages/zero-cache/src/server/anonymous-otel-start.ts index 52e352aaef..441c43cf6d 100644 --- a/packages/zero-cache/src/server/anonymous-otel-start.ts +++ b/packages/zero-cache/src/server/anonymous-otel-start.ts @@ -114,18 +114,26 @@ class AnonymousTelemetryManager { // Add a random jitter to the export interval to avoid all view-syncers exporting at the same time const exportIntervalMillis = 60000 * this.#viewSyncerCount + Math.floor(Math.random() * 10000); - const metricReader = new PeriodicExportingMetricReader({ - exportIntervalMillis, - exporter: new OTLPMetricExporter({ - url: 'https://metrics.rocicorp.dev', - timeoutMillis: 30000, + const readers = [ + new PeriodicExportingMetricReader({ + exportIntervalMillis, + exporter: new OTLPMetricExporter({ + url: 'https://metrics.rocicorp.dev', + timeoutMillis: 30000, + }), }), - }); + ]; - this.#meterProvider = new MeterProvider({ - resource, - readers: [metricReader], - }); + // Uncomment this to debug metrics exports. + + // readers.push( + // new PeriodicExportingMetricReader({ + // exportIntervalMillis, + // exporter: new ConsoleMetricExporter(), + // }), + // ); + + this.#meterProvider = new MeterProvider({resource, readers}); this.#meter = this.#meterProvider.getMeter('zero-anonymous-telemetry'); this.#setupMetrics(); @@ -221,11 +229,6 @@ class AnonymousTelemetryManager { if (actives) { const value = actives[metric]; result.observe(value, attrs); - this.#lc?.debug?.(`telemetry: ${metric}=${value}`); - } else { - this.#lc?.debug?.( - `telemetry: no actives available, skipping observation of ${metric}`, - ); } }; this.#meter @@ -268,68 +271,44 @@ class AnonymousTelemetryManager { uptimeGauge.addCallback((result: ObservableResult) => { const uptimeSeconds = Math.floor(process.uptime()); result.observe(uptimeSeconds, attrs); - this.#lc?.debug?.(`telemetry: uptime=${uptimeSeconds}s`); }); uptimeCounter.addCallback((result: ObservableResult) => { const uptimeSeconds = Math.floor(process.uptime()); result.observe(uptimeSeconds, attrs); - this.#lc?.debug?.(`telemetry: uptime_counter=${uptimeSeconds}s`); }); crudMutationsCounter.addCallback((result: ObservableResult) => { result.observe(this.#totalCrudMutations, attrs); - this.#lc?.debug?.( - `telemetry: crud_mutations=${this.#totalCrudMutations}`, - ); }); customMutationsCounter.addCallback((result: ObservableResult) => { result.observe(this.#totalCustomMutations, attrs); - this.#lc?.debug?.( - `telemetry: custom_mutations=${this.#totalCustomMutations}`, - ); }); totalMutationsCounter.addCallback((result: ObservableResult) => { const totalMutations = this.#totalCrudMutations + this.#totalCustomMutations; result.observe(totalMutations, attrs); - this.#lc?.debug?.(`telemetry: total_mutations=${totalMutations}`); }); crudQueriesCounter.addCallback((result: ObservableResult) => { result.observe(this.#totalCrudQueries, attrs); - this.#lc?.debug?.(`telemetry: crud_queries=${this.#totalCrudQueries}`); }); customQueriesCounter.addCallback((result: ObservableResult) => { result.observe(this.#totalCustomQueries, attrs); - this.#lc?.debug?.( - `telemetry: custom_queries=${this.#totalCustomQueries}`, - ); }); totalQueriesCounter.addCallback((result: ObservableResult) => { const totalQueries = this.#totalCrudQueries + this.#totalCustomQueries; result.observe(totalQueries, attrs); - this.#lc?.debug?.(`telemetry: total_queries=${totalQueries}`); }); rowsSyncedCounter.addCallback((result: ObservableResult) => { result.observe(this.#totalRowsSynced, attrs); - this.#lc?.debug?.(`telemetry: rows_synced=${this.#totalRowsSynced}`); }); connectionsSuccessCounter.addCallback((result: ObservableResult) => { result.observe(this.#totalConnectionsSuccess, attrs); - this.#lc?.debug?.( - `telemetry: connections_success=${this.#totalConnectionsSuccess}`, - ); }); connectionsAttemptedCounter.addCallback((result: ObservableResult) => { result.observe(this.#totalConnectionsAttempted, attrs); - this.#lc?.debug?.( - `telemetry: connections_attempted=${this.#totalConnectionsAttempted}`, - ); }); activeClientGroupsGauge.addCallback((result: ObservableResult) => { const activeClientGroups = this.#activeClientGroupsGetter?.() ?? 0; result.observe(activeClientGroups, attrs); - this.#lc?.debug?.( - `telemetry: gauge_active_client_groups=${activeClientGroups}`, - ); }); } From ffcfeb31e07581db9276f50b5ab3f5447156ae7a Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Wed, 25 Mar 2026 11:11:32 -0400 Subject: [PATCH 173/495] chore(analyze-query): use shared runAst from zero-cache instead of local copy (#5669) fixes the analyze-query CLI so we can continue doing targeted analysis without swamping zero-cache by loading the related application. Sometimes loading an app kills zero-cache so you can't get much query analysis done without making a bunch of changes to the app (e.g., terabugs). --- Remove duplicated run-ast.ts from analyze-query and import the canonical implementation from zero-cache. Update call sites to match the new function signature (auth object, async callback). --- packages/analyze-query/src/bin-analyze.ts | 89 ++++++++----- packages/analyze-query/src/run-ast.test.ts | 22 ++- packages/analyze-query/src/run-ast.ts | 148 --------------------- 3 files changed, 79 insertions(+), 180 deletions(-) delete mode 100644 packages/analyze-query/src/run-ast.ts diff --git a/packages/analyze-query/src/bin-analyze.ts b/packages/analyze-query/src/bin-analyze.ts index f63b9f79df..0e1e5f33ee 100644 --- a/packages/analyze-query/src/bin-analyze.ts +++ b/packages/analyze-query/src/bin-analyze.ts @@ -43,7 +43,7 @@ import type {PullRow, Query} from '../../zql/src/query/query.ts'; import {Database} from '../../zqlite/src/db.ts'; import {TableSource} from '../../zqlite/src/table-source.ts'; import {explainQueries} from './explain-queries.ts'; -import {runAst} from './run-ast.ts'; +import {runAst} from '../../zero-cache/src/services/run-ast.ts'; const options = { schema: deployPermissionsOptions.schema, @@ -234,16 +234,25 @@ let result: AnalyzeQueryResult; if (config.ast) { // the user likely has a transformed AST since the wire and storage formats are the transformed AST - result = await runAst(lc, clientSchema, JSON.parse(config.ast), true, { - applyPermissions: config.applyPermissions, - authData: config.authData, - clientToServerMapper, - permissions, - syncedRows: config.outputSyncedRows, - db, - tableSpecs, - host, - }); + result = await runAst( + lc, + clientSchema, + JSON.parse(config.ast), + true, + { + applyPermissions: config.applyPermissions, + auth: config.authData + ? {type: 'jwt' as const, raw: '', decoded: JSON.parse(config.authData)} + : undefined, + clientToServerMapper, + permissions, + syncedRows: config.outputSyncedRows, + db, + tableSpecs, + host, + }, + async () => {}, + ); } else if (config.query) { result = await runQuery(config.query); } else if (config.hash) { @@ -267,16 +276,25 @@ function runQuery(queryString: string): Promise { const q: Query> = f(z); const ast = asQueryInternals(q).ast; - return runAst(lc, clientSchema, ast, false, { - applyPermissions: config.applyPermissions, - authData: config.authData, - clientToServerMapper, - permissions, - syncedRows: config.outputSyncedRows, - db, - tableSpecs, - host, - }); + return runAst( + lc, + clientSchema, + ast, + false, + { + applyPermissions: config.applyPermissions, + auth: config.authData + ? {type: 'jwt' as const, raw: '', decoded: JSON.parse(config.authData)} + : undefined, + clientToServerMapper, + permissions, + syncedRows: config.outputSyncedRows, + db, + tableSpecs, + host, + }, + async () => {}, + ); } async function runHash(hash: string) { @@ -294,16 +312,25 @@ async function runHash(hash: string) { const ast = rows[0].clientAST as AST; colorConsole.log(await formatOutput(ast.table + astToZQL(ast))); - return runAst(lc, clientSchema, ast, true, { - applyPermissions: config.applyPermissions, - authData: config.authData, - clientToServerMapper, - permissions, - syncedRows: config.outputSyncedRows, - db, - tableSpecs, - host, - }); + return runAst( + lc, + clientSchema, + ast, + true, + { + applyPermissions: config.applyPermissions, + auth: config.authData + ? {type: 'jwt' as const, raw: '', decoded: JSON.parse(config.authData)} + : undefined, + clientToServerMapper, + permissions, + syncedRows: config.outputSyncedRows, + db, + tableSpecs, + host, + }, + async () => {}, + ); } if (config.outputSyncedRows) { diff --git a/packages/analyze-query/src/run-ast.test.ts b/packages/analyze-query/src/run-ast.test.ts index 4b31790a37..af44263100 100644 --- a/packages/analyze-query/src/run-ast.test.ts +++ b/packages/analyze-query/src/run-ast.test.ts @@ -7,7 +7,10 @@ import type {ClientSchema} from '../../zero-protocol/src/client-schema.ts'; import type {BuilderDelegate} from '../../zql/src/builder/builder.ts'; import {Debug} from '../../zql/src/builder/debug-delegate.ts'; import {Database} from '../../zqlite/src/db.ts'; -import {runAst, type RunAstOptions} from './run-ast.ts'; +import { + runAst, + type RunAstOptions, +} from '../../zero-cache/src/services/run-ast.ts'; const minimalClientSchema: ClientSchema = {tables: {}}; @@ -90,10 +93,13 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as ast, isTransformed, options1, + async () => {}, ); expect(result1).toMatchInlineSnapshot(` { "afterPermissions": undefined, + "dbScansByQuery": {}, + "elapsed": 13, "end": 1017, "readRowCount": 2, "readRowCountsByQuery": { @@ -123,10 +129,13 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as ast, isTransformed, options2, + async () => {}, ); expect(result2).toMatchInlineSnapshot(` { "afterPermissions": undefined, + "dbScansByQuery": {}, + "elapsed": 13, "end": 1031, "readRowCount": 2, "readRowCountsByQuery": { @@ -169,10 +178,13 @@ test('runAst always returns vendedRowCounts regardless of vendedRows option', as ast, isTransformed, options3, + async () => {}, ); expect(result3).toMatchInlineSnapshot(` { "afterPermissions": undefined, + "dbScansByQuery": {}, + "elapsed": 13, "end": 1045, "readRowCount": 2, "readRowCountsByQuery": { @@ -212,11 +224,14 @@ test('runAst returns empty object for vendedRowCounts when no debug tracking', a ast, isTransformed, options, + async () => {}, ); expect(result).toMatchInlineSnapshot(` { "afterPermissions": undefined, + "dbScansByQuery": {}, + "elapsed": 13, "end": 1017, "readRowCount": 0, "readRowCountsByQuery": {}, @@ -252,11 +267,14 @@ test('runAst basic structure and functionality', async () => { ast, isTransformed, options, + async () => {}, ); expect(result).toMatchInlineSnapshot(` { "afterPermissions": undefined, + "dbScansByQuery": {}, + "elapsed": 13, "end": 1017, "readRowCount": 2, "readRowCountsByQuery": { @@ -353,6 +371,7 @@ test('runAst counts only unique synced rows, skips duplicates', async () => { ast, isTransformed, options, + async () => {}, ); // Should count only 4 unique rows: 3 from users table, 1 from posts table @@ -423,6 +442,7 @@ test('runAst handles case where all synced rows are duplicates', async () => { ast, isTransformed, options, + async () => {}, ); // Should count only 1 unique row despite 3 identical rows being yielded diff --git a/packages/analyze-query/src/run-ast.ts b/packages/analyze-query/src/run-ast.ts deleted file mode 100644 index ecf7641b99..0000000000 --- a/packages/analyze-query/src/run-ast.ts +++ /dev/null @@ -1,148 +0,0 @@ -import type {LogContext} from '@rocicorp/logger'; -import {astToZQL} from '../../ast-to-zql/src/ast-to-zql.ts'; -import {formatOutput} from '../../ast-to-zql/src/format.ts'; -import {assert} from '../../shared/src/asserts.ts'; -import {must} from '../../shared/src/must.ts'; -import type {JWTAuth} from '../../zero-cache/src/auth/auth.ts'; -import {transformAndHashQuery} from '../../zero-cache/src/auth/read-authorizer.ts'; -import {computeZqlSpecs} from '../../zero-cache/src/db/lite-tables.ts'; -import type {LiteAndZqlSpec} from '../../zero-cache/src/db/specs.ts'; -import {hydrate} from '../../zero-cache/src/services/view-syncer/pipeline-driver.ts'; -import type {AnalyzeQueryResult} from '../../zero-protocol/src/analyze-query-result.ts'; -import type {AST} from '../../zero-protocol/src/ast.ts'; -import {mapAST} from '../../zero-protocol/src/ast.ts'; -import type {ClientSchema} from '../../zero-protocol/src/client-schema.ts'; -import type {Row} from '../../zero-protocol/src/data.ts'; -import {hashOfAST} from '../../zero-protocol/src/query-hash.ts'; -import type {PermissionsConfig} from '../../zero-schema/src/compiled-permissions.ts'; -import type {NameMapper} from '../../zero-schema/src/name-mapper.ts'; -import { - buildPipeline, - type BuilderDelegate, -} from '../../zql/src/builder/builder.ts'; -import type {Database} from '../../zqlite/src/db.ts'; - -export type RunAstOptions = { - applyPermissions?: boolean | undefined; - authData?: string | undefined; - clientToServerMapper?: NameMapper | undefined; - db: Database; - host: BuilderDelegate; - permissions?: PermissionsConfig | undefined; - syncedRows?: boolean | undefined; - tableSpecs: Map; - vendedRows?: boolean | undefined; -}; - -export async function runAst( - lc: LogContext, - clientSchema: ClientSchema, - ast: AST, - isTransformed: boolean, - options: RunAstOptions, -): Promise { - const {clientToServerMapper, permissions, host, db} = options; - const result: AnalyzeQueryResult = { - warnings: [], - syncedRows: undefined, - syncedRowCount: 0, - start: 0, - end: 0, - afterPermissions: undefined, - readRows: undefined, - readRowCountsByQuery: {}, - readRowCount: undefined, - }; - - if (!isTransformed) { - // map the AST to server names if not already transformed - ast = mapAST(ast, must(clientToServerMapper)); - } - if (options.applyPermissions) { - result.warnings.push( - 'Permissions are deprecated and will be removed in an upcoming release. See: https://zero.rocicorp.dev/docs/auth.', - ); - - const authData = options.authData ? JSON.parse(options.authData) : {}; - if (!options.authData) { - result.warnings.push( - 'No auth data provided. Permission rules will compare to `NULL` wherever an auth data field is referenced.', - ); - } - const auth: JWTAuth = {type: 'jwt', raw: '', decoded: authData}; - ast = transformAndHashQuery( - lc, - 'clientGroupIDForAnalyze', - ast, - must( - permissions, - 'Permissions are required when applyPermissions is true', - ), - auth, - false, - ).transformedAst; - result.afterPermissions = await formatOutput(ast.table + astToZQL(ast)); - } - const pipeline = buildPipeline(ast, host, 'query-id'); - - const start = performance.now(); - - let syncedRowCount = 0; - const rowsByTable: Record = {}; - const seenByTable: Set = new Set(); - const tableSpecs = computeZqlSpecs(lc, db, { - includeBackfillingColumns: false, - }); - for (const rowChange of hydrate( - pipeline, - hashOfAST(ast), - clientSchema, - tableSpecs, - )) { - if (rowChange === 'yield') { - continue; - } - assert( - rowChange.type === 'add', - () => `Expected rowChange type 'add', got '${rowChange.type}'`, - ); - - let rows: Row[] = rowsByTable[rowChange.table]; - const s = rowChange.table + '.' + JSON.stringify(rowChange.row); - if (seenByTable.has(s)) { - continue; // skip duplicates - } - syncedRowCount++; - seenByTable.add(s); - if (options.syncedRows) { - if (!rows) { - rows = []; - rowsByTable[rowChange.table] = rows; - } - rows.push(rowChange.row); - } - } - - const end = performance.now(); - if (options.syncedRows) { - result.syncedRows = rowsByTable; - } - result.start = start; - result.end = end; - - // Always include the count of synced and vended rows. - result.syncedRowCount = syncedRowCount; - result.readRowCountsByQuery = host.debug?.getVendedRowCounts() ?? {}; - let readRowCount = 0; - for (const c of Object.values(result.readRowCountsByQuery)) { - for (const v of Object.values(c)) { - readRowCount += v; - } - } - result.readRowCount = readRowCount; - - if (options.vendedRows) { - result.readRows = host.debug?.getVendedRows(); - } - return result; -} From 2fa8864f225c36c3877cbc132aef369b920920fa Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 25 Mar 2026 17:53:39 -0700 Subject: [PATCH 174/495] feat(zero-cache): measure replication lag, report otel metric `zero.replication.total_lag` (#5689) ### Feature * Measures replication lag and reports it as an otel gauge named `zero.replication.total_lag` * Enabled by setting `ZERO_REPLICATION_LAG_REPORT_INTERVAL_MS` (e.g. to 15000) * For debugging, the total lag is also partitioned into sub-measurements * `zero.replication.upstream_lag` (latency between issuing a report and receiving it in the replication stream) * `zero.replication.replica_lag` (latency between receiving a report and its reaching the replica) ### Implementation Replication lag is measured by initiating periodic reports via a `pg_logical_emit_message()`, with the minimum period defined by the `ZERO_REPLICATION_LAG_REPORT_INTERVAL_MS` option. * A new report is only issued after receiving the previous one, so the interval may be longer in the case of a backlog in the replication stream. This is to avoid adding insult to injury. Once received (back) from the replication stream, the report is annotated with timestamps along the way, until it reaches the replica (e.g. view-syncer), at which point the report is recorded and the value of the otel gauge is updated. * To account for potentially non-regular intervals of reports in the case of WAL backlog, the otel metric reports the previous timings until either (1) new timings are received or (2) the time elapsed since the start of the next expected report is longer than the lag of the previous report, in which case the longer (growing) interval is reported. ### Notes * For PG 16-, lag reports timings look longer than actual commited-write replication lag (e.g. 50ms ~ 100ms), as the `pg_logical_emit_message()` function did not have an immediate `flush` option in those versions. * For PG 17+, lag reports are flushed immeidately and thus accurately reflect the lag of a committed write (generally single-digit milliseconds) * Although lag reports utilize the upstream WAL, they are not persisted anywhere else (i.e. neither in the change db nor in the replica) in order to minimize churn in the steady state. --- .../zero-cache/src/config/zero-config.test.ts | 10 + packages/zero-cache/src/config/zero-config.ts | 15 + .../zero-cache/src/server/change-streamer.ts | 3 +- .../services/change-source/change-source.ts | 6 + .../common/change-stream-multiplexer.ts | 7 +- .../change-source/custom/change-source.ts | 4 + .../change-source/pg/change-source.pg.test.ts | 70 ++++- .../change-source/pg/change-source.ts | 297 +++++++++++++----- .../change-source/protocol/current/status.ts | 10 +- .../change-source/protocol/version.test.ts | 4 +- .../change-streamer-service.pg.test.ts | 51 ++- .../change-streamer-service.ts | 22 +- .../change-streamer/change-streamer.ts | 21 +- .../src/services/change-streamer/forwarder.ts | 7 + .../change-streamer/subscriber.test.ts | 28 ++ .../services/change-streamer/subscriber.ts | 29 +- .../services/change-streamer/test-utils.ts | 8 +- .../replicator/incremental-sync.test.ts | 13 +- .../services/replicator/incremental-sync.ts | 33 +- .../src/services/replicator/replicator.ts | 3 +- .../replicator/reporter/recorder.test.ts | 66 ++++ .../services/replicator/reporter/recorder.ts | 88 ++++++ .../replicator/reporter/report-schema.ts | 27 ++ prod/sst/sst.config.ts | 1 + 24 files changed, 707 insertions(+), 116 deletions(-) create mode 100644 packages/zero-cache/src/services/replicator/reporter/recorder.test.ts create mode 100644 packages/zero-cache/src/services/replicator/reporter/recorder.ts create mode 100644 packages/zero-cache/src/services/replicator/reporter/report-schema.ts diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index bbba44057b..3893a3ee16 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -414,6 +414,16 @@ test('zero-cache --help', () => { clients. This is a heavy-weight operation and can result in user-visible slowness or downtime if compute resources are scarce. + --replication-lag-report-interval-ms number optional + ZERO_REPLICATION_LAG_REPORT_INTERVAL_MS env + The minimum interval at which replication lag reports are written upstream and + reported via the zero.replication.total_lag opentelemetry metric. Because + replication lag reports are only issued after the previous one was received, the + actual interval between reports may be longer when there is a backlog in the + replication stream. + + This monitoring feature is only support on the postgres upstream type. + --admin-password string optional ZERO_ADMIN_PASSWORD env A password used to administer zero-cache server, for example to access the diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index 104bc06c80..ea0ac2086c 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -636,6 +636,21 @@ export const zeroOptions = { ], }, + replicationLag: { + reportIntervalMs: { + type: v.number().optional(), + desc: [ + `The minimum interval at which replication lag reports are written upstream and`, + `reported via the {bold zero.replication.total_lag} opentelemetry metric. Because`, + `replication lag reports are only issued after the previous one was received, the`, + `actual interval between reports may be longer when there is a backlog in the`, + `replication stream.`, + ``, + `This monitoring feature is only support on the postgres upstream type.`, + ], + }, + }, + adminPassword: { type: v.string().optional(), desc: [ diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index 22e910118c..d494a36295 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -74,7 +74,7 @@ export default async function runWorker( ); void warmupConnections(lc, changeDB, 'change'); - const {autoReset} = config; + const {autoReset, replicationLag} = config; const shard = getShardConfig(config); let changeStreamer: ChangeStreamerService | undefined; @@ -93,6 +93,7 @@ export default async function runWorker( replica.file, initialSync, context, + replicationLag.reportIntervalMs, ) : await initializeCustomChangeSource( lc, diff --git a/packages/zero-cache/src/services/change-source/change-source.ts b/packages/zero-cache/src/services/change-source/change-source.ts index 1f8a0c5282..22176bba49 100644 --- a/packages/zero-cache/src/services/change-source/change-source.ts +++ b/packages/zero-cache/src/services/change-source/change-source.ts @@ -17,6 +17,12 @@ export type ChangeStream = { }; /** Encapsulates an upstream-specific implementation of a stream of Changes. */ export interface ChangeSource { + /** + * Starts a replication lag reporter, returning the send time of the next + * expected report, or `null` if lag reporting is not supported / enabled. + */ + startLagReporter(): Promise<{nextSendTimeMs: number}> | null; + /** * Starts a stream of changes starting after the specific watermark, * with a corresponding sink for upstream acknowledgements. diff --git a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts index 4ad5cefff3..a425ba8ce7 100644 --- a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts +++ b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.ts @@ -128,9 +128,10 @@ export class ChangeStreamMultiplexer { pushStatus(message: DownstreamStatusMessage) { // Let listeners know about all status messages. this.#listeners.forEach(l => l.onChange(message)); - // The ChangeStreamer only cares about status messages requiring an ack. - // To reduce churn, avoid sending other status messages. - if (message[1].ack) { + // The ChangeStreamer only cares about status messages requiring an ack + // or containing a lagReport. To reduce churn, avoid sending other status + // messages. + if (message[1].ack || message[1].lagReport) { this.#sub.push(message); } } diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.ts b/packages/zero-cache/src/services/change-source/custom/change-source.ts index 2a44470dfb..8aefd0221c 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.ts @@ -100,6 +100,10 @@ class CustomChangeSource implements ChangeSource { return this.#startStream(); } + startLagReporter() { + return null; // Not supported for custom sources + } + startStream( clientWatermark: string, backfillRequests: BackfillRequest[] = [], diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index 01e5f4a261..3b81235f08 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -3,7 +3,9 @@ import {LogContext} from '@rocicorp/logger'; import {PostgresError} from 'postgres'; import {beforeEach, describe, expect, vi} from 'vitest'; import {AbortError} from '../../../../../shared/src/abort-error.ts'; +import {assert} from '../../../../../shared/src/asserts.ts'; import {TestLogSink} from '../../../../../shared/src/logging-test-utils.ts'; +import {must} from '../../../../../shared/src/must.ts'; import {Queue} from '../../../../../shared/src/queue.ts'; import {sleep} from '../../../../../shared/src/sleep.ts'; import {Default, Index} from '../../../db/postgres-replica-identity-enum.ts'; @@ -106,7 +108,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { void (async () => { try { for await (const msg of sub) { - if (msg[0] === 'status' && !msg[1].ack) { + if (msg[0] === 'status' && !msg[1].ack && !msg[1].lagReport) { continue; // filter out keepalives } queue.enqueue(msg); @@ -118,7 +120,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { return queue; } - const WATERMARK_REGEX = /[0-9a-z]{2,}/; + const WATERMARK_REGEX = /[0-9a-z]{3,}/; async function setReplicaIdentityFull() { await upstream.unsafe( @@ -144,7 +146,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { return toBigInt(lsn); } - async function startReplication() { + async function startReplication(lagReportIntervalMs?: number) { ({changeSource: source} = await initializePostgresChangeSource( lc, upstreamURI, @@ -156,6 +158,7 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { replicaDbFile.path, {tableCopyWorkers: 5}, {test: 'context'}, + lagReportIntervalMs, )); const [{slot, initialSyncContext, subscriberContext}] = await upstream` @@ -870,6 +873,67 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { }, ); + test('replication lag reports', async () => { + await startReplication(10); + + const initialSend = await source.startLagReporter(); + expect(initialSend).toMatchObject({ + nextSendTimeMs: expect.any(Number), + }); + + const {changes} = await startStream('00'); + try { + const downstream = drainToQueue(changes); + + const EXPECTED_LAG_REPORT = [ + 'status', + { + ack: false, + lagReport: { + lastTimings: { + sendTimeMs: expect.any(Number), + commitTimeMs: expect.any(Number), + receiveTimeMs: expect.any(Number), + }, + nextSendTimeMs: expect.any(Number), + }, + }, + { + watermark: WATERMARK_REGEX, + }, + ]; + + const lag1 = await downstream.dequeue(); + expect(lag1).toMatchObject(EXPECTED_LAG_REPORT); + const lag2 = await downstream.dequeue(); + expect(lag2).toMatchObject(EXPECTED_LAG_REPORT); + + assert(lag1[0] === 'status', () => lag1[0]); + assert(lag2[0] === 'status', () => lag1[0]); + + expect(lag1[1].lagReport?.lastTimings.sendTimeMs).toBe( + initialSend?.nextSendTimeMs, + ); + expect( + must(lag2[1].lagReport).lastTimings.sendTimeMs, + ).toBeGreaterThanOrEqual(must(lag1[1].lagReport).nextSendTimeMs); + + for (const status of [lag1[1], lag2[1]]) { + const report1 = must(status.lagReport); + expect(report1.nextSendTimeMs).toBe( + Math.max( + report1.lastTimings.receiveTimeMs, + report1.lastTimings.sendTimeMs + 10, + ), + ); + } + + expect(lag2[2].watermark > lag1[2].watermark).toBe(true); + } finally { + changes.cancel(); + } + }); + test('missing replication slot', async () => { await startReplication(); // Purposely drop the replication slot to test the error case. diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 965478894b..a9d0494859 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -3,13 +3,14 @@ import { PG_OBJECT_IN_USE, } from '@drdgvhbh/postgres-error-codes'; import type {LogContext} from '@rocicorp/logger'; +import {nanoid} from 'nanoid'; import postgres from 'postgres'; import {AbortError} from '../../../../../shared/src/abort-error.ts'; +import {assert} from '../../../../../shared/src/asserts.ts'; import {stringify} from '../../../../../shared/src/bigint-json.ts'; import {deepEqual} from '../../../../../shared/src/json.ts'; import {must} from '../../../../../shared/src/must.ts'; import {mapValues} from '../../../../../shared/src/objects.ts'; -import {promiseVoid} from '../../../../../shared/src/resolved-promises.ts'; import { equals, intersection, @@ -54,7 +55,11 @@ import { type Listener, } from '../common/change-stream-multiplexer.ts'; import {initReplica} from '../common/replica-schema.ts'; -import type {BackfillRequest, JSONObject} from '../protocol/current.ts'; +import type { + BackfillRequest, + DownstreamStatusMessage, + JSONObject, +} from '../protocol/current.ts'; import type { ColumnAdd, Identifier, @@ -79,7 +84,7 @@ import type { MessageMessage, MessageRelation as PostgresRelation, } from './logical-replication/pgoutput.types.ts'; -import {subscribe} from './logical-replication/stream.ts'; +import {subscribe, type StreamMessage} from './logical-replication/stream.ts'; import {fromBigInt, toStateVersionString, type LSN} from './lsn.ts'; import { replicationEventSchema, @@ -117,6 +122,7 @@ export async function initializePostgresChangeSource( replicaDbFile: string, syncOptions: InitialSyncOptions, context: ServerContext, + lagReportIntervalMs?: number, ): Promise<{subscriptionState: SubscriptionState; changeSource: ChangeSource}> { await initReplica( lc, @@ -148,6 +154,7 @@ export async function initializePostgresChangeSource( shard, upstreamReplica, context, + lagReportIntervalMs ?? null, ); return {subscriptionState, changeSource}; @@ -248,10 +255,12 @@ type ReservationState = { */ class PostgresChangeSource implements ChangeSource { readonly #lc: LogContext; + readonly #db: PostgresDB; readonly #upstreamUri: string; readonly #shard: ShardID; readonly #replica: Replica; readonly #context: ServerContext; + readonly #lagReporter: LagReporter | null; constructor( lc: LogContext, @@ -259,43 +268,45 @@ class PostgresChangeSource implements ChangeSource { shard: ShardID, replica: Replica, context: ServerContext, + lagReportIntervalMs: number | null, ) { this.#lc = lc.withContext('component', 'change-source'); + this.#db = pgClient(lc, upstreamUri, { + // used occasionally for schema changes, periodically for lag reporting + ['idle_timeout']: 60, + connection: {['application_name']: 'zero-replication-monitor'}, + }); this.#upstreamUri = upstreamUri; this.#shard = shard; this.#replica = replica; this.#context = context; + this.#lagReporter = lagReportIntervalMs + ? new LagReporter( + lc.withContext('component', 'lag-reporter'), + shard, + this.#db, + lagReportIntervalMs, + ) + : null; + } + + startLagReporter(): Promise<{nextSendTimeMs: number}> | null { + return this.#lagReporter ? this.#lagReporter.initiateLagReport() : null; } async startStream( clientWatermark: string, backfillRequests: BackfillRequest[] = [], ): Promise { - const db = pgClient(this.#lc, this.#upstreamUri); const {slot} = this.#replica; - let cleanup = promiseVoid; - try { - ({cleanup} = await this.#stopExistingReplicationSlotSubscribers( - db, - slot, - )); - const config = await getInternalShardConfig(db, this.#shard); - this.#lc.info?.(`starting replication stream@${slot}`); - return await this.#startStream( - db, - slot, - clientWatermark, - config, - backfillRequests, - ); - } finally { - void cleanup.then(() => db.end()); - } + await this.#stopExistingReplicationSlotSubscribers(slot); + const config = await getInternalShardConfig(this.#db, this.#shard); + this.#lc.info?.(`starting replication stream@${slot}`); + return this.#startStream(slot, clientWatermark, config, backfillRequests); } async #startStream( - db: PostgresDB, slot: string, clientWatermark: string, shardConfig: InternalShardConfig, @@ -304,7 +315,7 @@ class PostgresChangeSource implements ChangeSource { const clientStart = majorVersionFromString(clientWatermark) + 1n; const {messages, acks} = await subscribe( this.#lc, - db, + this.#db, slot, [...shardConfig.publications], clientStart, @@ -327,27 +338,46 @@ class PostgresChangeSource implements ChangeSource { this.#lc, this.#shard, shardConfig, + this.#db, this.#replica.initialSchema, - this.#upstreamUri, ); + /** + * Determines if the incoming message is transactional, otherwise handling + * non-transactional messages with a downstream status message. + */ + const isTransactionalMessage = ( + lsn: bigint, + msg: StreamMessage[1], + ): msg is Message => { + if (msg.tag === 'keepalive') { + changes.pushStatus([ + 'status', + {ack: msg.shouldRespond}, + {watermark: majorVersionToString(lsn)}, + ]); + return false; + } + if ( + msg.tag === 'message' && + msg.prefix === this.#lagReporter?.messagePrefix + ) { + changes.pushStatus(this.#lagReporter.processLagReport(msg)); + return false; + } + return true; + }; + void (async () => { try { let reservation: ReservationState | null = null; let inTransaction = false; for await (const [lsn, msg] of messages) { - // Note: no reservation is needed for pushStatus(). - if (msg.tag === 'keepalive') { - changes.pushStatus([ - 'status', - {ack: msg.shouldRespond}, - {watermark: majorVersionToString(lsn)}, - ]); - + if (!isTransactionalMessage(lsn, msg)) { // If we're not in a transaction but the last reservation was kept - // because of pending keepalives in the queue, release the - // reservation. + // because of pending keepalives or lag reports in the queue, + // release the reservation. if (!inTransaction && reservation?.lastWatermark) { changes.release(reservation.lastWatermark); reservation = null; @@ -415,11 +445,10 @@ class PostgresChangeSource implements ChangeSource { } async #logCurrentReplicaInfo() { - const db = pgClient(this.#lc, this.#upstreamUri); try { const replica = await getReplicaAtVersion( this.#lc, - db, + this.#db, this.#shard, this.#replica.version, ); @@ -430,8 +459,6 @@ class PostgresChangeSource implements ChangeSource { } } catch (e) { this.#lc.warn?.(`error logging replica info`, e); - } finally { - await db.end(); } } @@ -444,14 +471,11 @@ class PostgresChangeSource implements ChangeSource { * the timestamp suffix) are preserved, as those are newly syncing replicas * that will soon take over the slot. */ - async #stopExistingReplicationSlotSubscribers( - db: PostgresDB, - slotToKeep: string, - ): Promise<{cleanup: Promise}> { + async #stopExistingReplicationSlotSubscribers(slotToKeep: string) { const slotExpression = replicationSlotExpression(this.#shard); const legacySlotName = legacyReplicationSlot(this.#shard); - const result = await runTx(db, async sql => { + const result = await runTx(this.#db, async sql => { // Note: `slot_name <= slotToKeep` uses a string compare of the millisecond // timestamp, which works until it exceeds 13 digits (sometime in 2286). const result = await sql< @@ -514,15 +538,17 @@ class PostgresChangeSource implements ChangeSource { const otherSlots = result .filter(({slot}) => slot !== slotToKeep) .map(({slot}) => slot); - return { - cleanup: otherSlots.length - ? this.#dropReplicationSlots(db, otherSlots) - : promiseVoid, - }; + + if (otherSlots.length) { + void this.#dropReplicationSlots(otherSlots).catch(e => + this.#lc.warn?.(`error dropping replication slots`, e), + ); + } } - async #dropReplicationSlots(sql: PostgresDB, slots: string[]) { + async #dropReplicationSlots(slots: string[]) { this.#lc.info?.(`dropping other replication slot(s) ${slots}`); + const sql = this.#db; for (let i = 0; i < 5; i++) { try { await sql` @@ -614,6 +640,138 @@ export class Acker implements Listener { } } +const lagReportSchema = v.object({ + id: v.string(), + sendTimeMs: v.number(), + commitTimeMs: v.number(), +}); + +export type LagReport = v.Infer; + +class LagReporter { + static readonly MESSAGE_SUFFIX = '/lag-report/v1'; + + readonly #lc: LogContext; + readonly messagePrefix: string; + + // Weird issue with oxlint, which thinks: + // × eslint(no-unused-private-class-members): 'db' is defined but never used. + // oxlint-disable-next-line eslint(no-unused-private-class-members) + readonly #db: PostgresDB; + readonly #lagIntervalMs: number; + + #pgVersion: number | undefined; + #lastReportID: string = ''; + #timer: NodeJS.Timeout | undefined; + + constructor( + lc: LogContext, + shard: ShardID, + db: PostgresDB, + lagIntervalMs: number, + ) { + this.#lc = lc; + this.messagePrefix = `${shard.appID}/${shard.shardNum}${LagReporter.MESSAGE_SUFFIX}`; + this.#db = db; + this.#lagIntervalMs = lagIntervalMs; + } + + async #getPgVersion() { + if (this.#pgVersion === undefined) { + const [{pgVersion}] = await this.#db<{pgVersion: number}[]> /*sql*/ ` + SELECT current_setting('server_version_num')::int as "pgVersion"`; + this.#pgVersion = pgVersion; + } + return this.#pgVersion; + } + + async initiateLagReport(now = Date.now()) { + const pgVersion = this.#pgVersion ?? (await this.#getPgVersion()); + this.#lastReportID = nanoid(); + + if (pgVersion >= 170000) { + await this.#db /*sql*/ ` + SELECT pg_logical_emit_message( + false, + ${this.messagePrefix}, + json_build_object( + 'id', ${this.#lastReportID}::text, + 'sendTimeMs', ${now}::int8, + 'commitTimeMs', extract(epoch from now()) * 1000 + )::text, + true + ); + `; + } else { + // Versions before PG 17 do not support the final `flush` option of + // pg_logical_emit_message(). This results in an extra 50~100ms latency + // for replication reports when the db is idle, which is still + // acceptable for the purpose for alerting on pathological lag, for + // which the threshold is much higher (e.g. many seconds). + await this.#db /*sql*/ ` + SELECT pg_logical_emit_message( + false, + ${this.messagePrefix}, + json_build_object( + 'id', ${this.#lastReportID}::text, + 'sendTimeMs', ${now}::int8, + 'commitTimeMs', extract(epoch from now()) * 1000 + )::text + ); + `; + } + return {nextSendTimeMs: now}; + } + + #scheduleNextReport(delayMs: number) { + clearTimeout(this.#timer); + this.#timer = setTimeout(async () => { + try { + await this.initiateLagReport(); + } catch (e) { + this.#lc.warn?.(`error initiating lag report`, e); + this.#scheduleNextReport(this.#lagIntervalMs); + } + }, delayMs); + } + + processLagReport(msg: MessageMessage): DownstreamStatusMessage { + assert( + msg.prefix === this.messagePrefix, + `unexpected message prefix: ${msg.prefix}`, + ); + const report = parseLogicalMessageContent(msg, lagReportSchema); + const now = Date.now(); + const nextSendTimeMs = Math.max( + now, + report.sendTimeMs + this.#lagIntervalMs, + ); + if (report.id === this.#lastReportID) { + // Only schedule the next report when receiving the previous report. + // For historic reports in the WAL, or reports generated by other + // replication-managers, status messages are still sent downstream, + // but the next report is not actually scheduled. + this.#scheduleNextReport(nextSendTimeMs - now); + } + const {sendTimeMs, commitTimeMs} = report; + return [ + 'status', + { + ack: false, + lagReport: { + lastTimings: { + sendTimeMs, + commitTimeMs, + receiveTimeMs: now, + }, + nextSendTimeMs, + }, + }, + {watermark: toStateVersionString(msg.messageLsn ?? '0/0')}, + ]; + } +} + type ReplicationError = { lsn: bigint; msg: Message; @@ -628,7 +786,7 @@ class ChangeMaker { readonly #shardPrefix: string; readonly #shardConfig: InternalShardConfig; readonly #initialSchema: PublishedSchema; - readonly #upstreamDB: PostgresDB; + readonly #db: PostgresDB; #replicaIdentityTimer: NodeJS.Timeout | undefined; #error: ReplicationError | undefined; @@ -637,18 +795,15 @@ class ChangeMaker { lc: LogContext, {appID, shardNum}: ShardID, shardConfig: InternalShardConfig, + db: PostgresDB, initialSchema: PublishedSchema, - upstreamURI: string, ) { this.#lc = lc; // Note: This matches the prefix used in pg_logical_emit_message() in pg/schema/ddl.ts. this.#shardPrefix = `${appID}/${shardNum}`; this.#shardConfig = shardConfig; this.#initialSchema = initialSchema; - this.#upstreamDB = pgClient(lc, upstreamURI, { - ['idle_timeout']: 10, // only used occasionally - connection: {['application_name']: 'zero-schema-change-detector'}, - }); + this.#db = db; } async makeChanges(lsn: bigint, msg: Message): Promise { @@ -792,7 +947,7 @@ class ChangeMaker { #lastSnapshotInTx: PublishedSchema | undefined; #handleDdlMessage(msg: MessageMessage) { - const event = this.#parseReplicationEvent(msg.content); + const event = parseLogicalMessageContent(msg, replicationEventSchema); // Cancel manual schema adjustment timeouts when an upstream schema change // is about to happen, so as to avoid interfering / redundant work. clearTimeout(this.#replicaIdentityTimer); @@ -843,7 +998,7 @@ class ChangeMaker { if (replicaIdentities) { this.#replicaIdentityTimer = setTimeout(async () => { try { - await replicaIdentities.apply(this.#lc, this.#upstreamDB); + await replicaIdentities.apply(this.#lc, this.#db); } catch (err) { this.#lc.warn?.(`error setting replica identities`, err); } @@ -1077,15 +1232,6 @@ class ChangeMaker { return changes; } - #parseReplicationEvent(content: Uint8Array) { - const str = - content instanceof Buffer - ? content.toString('utf-8') - : new TextDecoder().decode(content); - const json = JSON.parse(str); - return v.parse(json, replicationEventSchema, 'passthrough'); - } - /** * If `ddlDetection === true`, relation messages are irrelevant, * as schema changes are detected by event triggers that @@ -1109,10 +1255,7 @@ class ChangeMaker { if (ddlDetection) { return []; } - const currentSchema = await getPublicationInfo( - this.#upstreamDB, - publications, - ); + const currentSchema = await getPublicationInfo(this.#db, publications); const difference = getSchemaDifference(this.#initialSchema, currentSchema); if (difference !== null) { throw new MissingEventTriggerSupport(difference); @@ -1403,3 +1546,15 @@ class ShutdownSignal extends AbortError { ); } } + +function parseLogicalMessageContent( + {content}: MessageMessage, + schema: v.Type, +) { + const str = + content instanceof Buffer + ? content.toString('utf-8') + : new TextDecoder().decode(content); + const json = JSON.parse(str); + return v.parse(json, schema, 'passthrough'); +} diff --git a/packages/zero-cache/src/services/change-source/protocol/current/status.ts b/packages/zero-cache/src/services/change-source/protocol/current/status.ts index a19c9fa880..2f99750265 100644 --- a/packages/zero-cache/src/services/change-source/protocol/current/status.ts +++ b/packages/zero-cache/src/services/change-source/protocol/current/status.ts @@ -1,12 +1,20 @@ import * as v from '../../../../../../shared/src/valita.ts'; +import {changeSourceReportSchema} from '../../../replicator/reporter/report-schema.ts'; import {commitSchema} from './data.ts'; /** - * The downstream status message indicates whether it should be echoed + * The downstream status messages contain metadata about the status + * of the change-source. indicates whether it should be echoed * back in an upstream status message. */ export const downstreamStatusSchema = v.object({ + // Indicates whether the status message should be echoed back + // in an upstream status message once the consumer has successfully + // processed/persisted all preceding changes. ack: v.boolean().optional(() => true), + + // Contains a lag report for recording end to end latency metrics. + lagReport: changeSourceReportSchema.optional(), }); export type DownstreamStatus = v.Infer; diff --git a/packages/zero-cache/src/services/change-source/protocol/version.test.ts b/packages/zero-cache/src/services/change-source/protocol/version.test.ts index b4c76bad40..9b8b0c19b1 100644 --- a/packages/zero-cache/src/services/change-source/protocol/version.test.ts +++ b/packages/zero-cache/src/services/change-source/protocol/version.test.ts @@ -37,9 +37,9 @@ test('protocol versions', () => { // Then update the version number of the `CHANGE_SOURCE_PATH` // in current and export it appropriately as the new version // in `mod.ts`. - t(current, '3195mx7sjomf1', '/changes/v0/stream'); + t(current, 'eodyqg15jkoa', '/changes/v0/stream'); // During initial development, we use v0 as a non-stable // version (i.e. breaking change are allowed). Once the // protocol graduates to v1, versions must be stable. - t(v0, '3195mx7sjomf1', '/changes/v0/stream'); + t(v0, 'eodyqg15jkoa', '/changes/v0/stream'); }); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index a02d988d15..5f3029b0df 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -76,6 +76,7 @@ describe('change-streamer/service', () => { changes, acks: {push: status => acks.enqueue(status)}, }), + startLagReporter: () => Promise.resolve({nextSendTimeMs: 123}), }, ReplicationStatusPublisher.forTesting(), replicaConfig, @@ -152,10 +153,10 @@ describe('change-streamer/service', () => { {watermark: '09'}, ]); - changes.push(['status', {ack: false}, {watermark: '0a'}]); - changes.push(['status', {ack: true}, {watermark: '0b'}]); - - expect(await nextChange(downstream)).toMatchObject({tag: 'status'}); + expect(await nextChange(downstream)).toMatchObject({ + tag: 'status', + lagReport: {nextSendTimeMs: 123}, + }); expect(await nextChange(downstream)).toMatchObject({tag: 'begin'}); expect(await nextChange(downstream)).toMatchObject({ tag: 'insert', @@ -170,8 +171,40 @@ describe('change-streamer/service', () => { extra: 'fields', }); - // Await the ACK for the single commit, then the status message. - await expectAcks('09', '0b'); + changes.push(['status', {ack: false}, {watermark: '0a'}]); + + changes.push([ + 'status', + { + ack: false, + lagReport: { + lastTimings: { + sendTimeMs: 150, + commitTimeMs: 151, + receiveTimeMs: 152, + }, + nextSendTimeMs: 234, + }, + }, + {watermark: '0b'}, + ]); + + changes.push(['status', {ack: true}, {watermark: '0c'}]); + + expect(await nextChange(downstream)).toMatchObject({ + tag: 'status', + lagReport: { + lastTimings: { + sendTimeMs: 150, + commitTimeMs: 151, + receiveTimeMs: 152, + }, + nextSendTimeMs: 234, + }, + }); + + // Await the ACK for the single commit, then the status message with an ack. + await expectAcks('09', '0c'); expect( await sql`SELECT watermark, change->'tag' FROM "zoro_3/cdc"."changeLog"`.values(), @@ -901,6 +934,7 @@ describe('change-streamer/service', () => { retried(true); return resolver().promise; }), + startLagReporter: () => null, }; const streamer = await initializeStreamer( lc, @@ -928,6 +962,7 @@ describe('change-streamer/service', () => { requests.enqueue(req); return resolver().promise; }), + startLagReporter: () => null, }; let streamer = await initializeStreamer( lc, @@ -989,6 +1024,7 @@ describe('change-streamer/service', () => { retried(true); return resolver().promise; }), + startLagReporter: () => null, }; const streamer = await initializeStreamer( lc, @@ -1028,6 +1064,7 @@ describe('change-streamer/service', () => { retried(true); return resolver().promise; }), + startLagReporter: () => null, }; const streamer = await initializeStreamer( lc, @@ -1084,6 +1121,7 @@ describe('change-streamer/service', () => { retried(true); return resolver().promise; }), + startLagReporter: () => null, }; const streamer = await initializeStreamer( lc, @@ -1157,6 +1195,7 @@ describe('change-streamer/service', () => { acks: () => {}, }), ), + startLagReporter: () => null, }; const streamer = await initializeStreamer( lc, diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 18ac6ee0be..3a2611a5dc 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -36,6 +36,7 @@ import { import { type ChangeStreamerService, type Downstream, + type Status, type SubscriberContext, } from './change-streamer.ts'; import * as ErrorType from './error-type-enum.ts'; @@ -277,6 +278,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { 'Count of replicated transactions', ); + #latestStatus: Status; #stream: ChangeStream | undefined; constructor( @@ -318,6 +320,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { this.#replicationStatusPublisher = replicationStatusPublisher; this.#autoReset = autoReset; this.#state = new RunningState(this.id, undefined, setTimeoutFn); + this.#latestStatus = {tag: 'status'}; } async run() { @@ -325,6 +328,11 @@ class ChangeStreamerImpl implements ChangeStreamerService { this.#forwarder.startProgressMonitor(); + const lagReport = await this.#source.startLagReporter(); + if (lagReport) { + this.#latestStatus.lagReport = lagReport; + } + // Once this change-streamer acquires "ownership" of the change DB, // it is safe to start the storer. await this.#storer.assumeOwnership(); @@ -362,6 +370,14 @@ class ChangeStreamerImpl implements ChangeStreamerService { if (msg.ack) { this.#storer.status(change); // storer acks once it gets through its queue } + if (msg.lagReport) { + // Lag reports are not stored in the cdc change log, but rather + // only forwarded on "live" connections. When a new subscriber + // is catching up, it is initialized with the #latestStatus + // from which it can measure lag while catching up. + this.#latestStatus.lagReport = msg.lagReport; + this.#forwarder.sendStatus(this.#latestStatus); + } continue; case 'control': await this.#handleControlMessage(msg); @@ -424,10 +440,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { if (watermark) { this.#lc.warn?.(`aborting interrupted transaction ${watermark}`); this.#storer.abort(); - await this.#forwarder.forward([ - watermark, - ['rollback', {tag: 'rollback'}], - ]); + this.#forwarder.forward([watermark, ['rollback', {tag: 'rollback'}]]); } // Backoff and drain any pending entries in the storer before reconnecting. @@ -483,6 +496,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { id, watermark, downstream, + () => this.#latestStatus, ); if (replicaVersion !== this.#replicaVersion) { this.#lc.warn?.( diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer.ts b/packages/zero-cache/src/services/change-streamer/change-streamer.ts index 75728ff80f..02e662f1f0 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer.ts @@ -3,6 +3,7 @@ import type {Source} from '../../types/streams.ts'; import {type Change} from '../change-source/protocol/current/data.ts'; import {changeStreamDataSchema} from '../change-source/protocol/current/downstream.ts'; import type {ReplicatorMode} from '../replicator/replicator.ts'; +import {changeSourceTimingsSchema} from '../replicator/reporter/report-schema.ts'; import type {Service} from '../service.ts'; /** @@ -48,13 +49,16 @@ export interface ChangeStreamer { subscribe(ctx: SubscriberContext): Promise>; } -// v1: Client-side support for JSON_FORMAT. Introduced in 0.18. +// v1: v0.18 +// - Client-side support for JSON_FORMAT. Introduced in 0.18. // v2: v0.19 // - Adds the "status" message which is initially used to signal that the // subscription is valid (i.e. starting at the requested watermark). -// v3: Adds the "taskID" to the subscription context, and support for +// v3: v0.20 +// - Adds the "taskID" to the subscription context, and support for // the BackupMonitor-mediated "/snapshot" request. -// v4: Adds the "replicaVersion" and "minWatermark" fields to the "/snapshot" +// v4: v0.25 +// - Adds the "replicaVersion" and "minWatermark" fields to the "/snapshot" // status request so that a subscriber can verify whether its replica, // whether it be restored or existing in a permanent volume, is compatible // with the change-streamer. @@ -66,6 +70,8 @@ export interface ChangeStreamer { // - Adds `table-update-metadata` message // v6: v0.26 // - Adds support for `backfill` messages +// v6: v1.0.1 (backwards compatible, no version change) +// - Adds lag reporting to status messages export const PROTOCOL_VERSION = 6; @@ -132,8 +138,17 @@ export type ChangeEntry = { */ export const statusSchema = v.object({ tag: v.literal('status'), + + lagReport: v + .object({ + lastTimings: changeSourceTimingsSchema.optional(), + nextSendTimeMs: v.number(), + }) + .optional(), }); +export type Status = v.Infer; + export const statusMessageSchema = v.tuple([v.literal('status'), statusSchema]); /** diff --git a/packages/zero-cache/src/services/change-streamer/forwarder.ts b/packages/zero-cache/src/services/change-streamer/forwarder.ts index cb5f4f9887..68111d7359 100644 --- a/packages/zero-cache/src/services/change-streamer/forwarder.ts +++ b/packages/zero-cache/src/services/change-streamer/forwarder.ts @@ -3,6 +3,7 @@ import {joinIterables, wrapIterable} from '../../../../shared/src/iterables.ts'; import type {ChangeStreamData} from '../change-source/protocol/current.ts'; import {Broadcast} from './broadcast.ts'; import type {WatermarkedChange} from './change-streamer-service.ts'; +import type {Status} from './change-streamer.ts'; import type {Subscriber} from './subscriber.ts'; export type ProgressMonitorOptions = { @@ -86,6 +87,12 @@ export class Forwarder { this.#updateActiveSubscribers(entry[1]); } + sendStatus(status: Status) { + for (const sub of this.#active.values()) { + sub.sendStatus(status); + } + } + /** * The flow-control-aware equivalent of {@link forward()}, returning a * Promise that resolves when replication should continue. diff --git a/packages/zero-cache/src/services/change-streamer/subscriber.test.ts b/packages/zero-cache/src/services/change-streamer/subscriber.test.ts index d56c1511e3..17130974a7 100644 --- a/packages/zero-cache/src/services/change-streamer/subscriber.test.ts +++ b/packages/zero-cache/src/services/change-streamer/subscriber.test.ts @@ -12,11 +12,19 @@ describe('change-streamer/subscriber', () => { void sub.send(['11', ['begin', messages.begin(), {commitWatermark: '12'}]]); void sub.send(['12', ['commit', messages.commit(), {watermark: '12'}]]); + // Status messages before initialization should be ignored. + sub.sendStatus({tag: 'status', lagReport: {nextSendTimeMs: 123}}); + // Send catchup messages. void sub.catchup([ '01', ['begin', messages.begin(), {commitWatermark: '02'}], ]); + + // Status messages after initialization are sent. These can happen + // within a transaction. + sub.sendStatus({tag: 'status', lagReport: {nextSendTimeMs: 234}}); + void sub.catchup(['02', ['commit', messages.commit(), {watermark: '02'}]]); sub.setCaughtUp(); @@ -25,6 +33,8 @@ describe('change-streamer/subscriber', () => { void sub.send(['21', ['begin', messages.begin(), {commitWatermark: '22'}]]); void sub.send(['22', ['commit', messages.commit(), {watermark: '22'}]]); + sub.sendStatus({tag: 'status', lagReport: {nextSendTimeMs: 456}}); + sub.close(); expect(stream).toMatchInlineSnapshot(` @@ -44,6 +54,15 @@ describe('change-streamer/subscriber', () => { "commitWatermark": "02", }, ], + [ + "status", + { + "lagReport": { + "nextSendTimeMs": 234, + }, + "tag": "status", + }, + ], [ "commit", { @@ -89,6 +108,15 @@ describe('change-streamer/subscriber', () => { "watermark": "22", }, ], + [ + "status", + { + "lagReport": { + "nextSendTimeMs": 456, + }, + "tag": "status", + }, + ], ] `); }); diff --git a/packages/zero-cache/src/services/change-streamer/subscriber.ts b/packages/zero-cache/src/services/change-streamer/subscriber.ts index 85ddfa3aca..7689ff499d 100644 --- a/packages/zero-cache/src/services/change-streamer/subscriber.ts +++ b/packages/zero-cache/src/services/change-streamer/subscriber.ts @@ -5,7 +5,7 @@ import {max} from '../../types/lexi-version.ts'; import type {Subscription} from '../../types/subscription.ts'; import type {ChangeStreamData} from '../change-source/protocol/current.ts'; import type {WatermarkedChange} from './change-streamer-service.ts'; -import {type Downstream} from './change-streamer.ts'; +import {type Downstream, type Status} from './change-streamer.ts'; import * as ErrorType from './error-type-enum.ts'; type ErrorType = Enum; @@ -21,6 +21,7 @@ export class Subscriber { readonly #protocolVersion: number; readonly id: string; readonly #downstream: Subscription; + readonly #latestStatus: () => Status; #watermark: string; #acked: string; #backlog: WatermarkedChange[] | null; @@ -30,10 +31,12 @@ export class Subscriber { id: string, watermark: string, downstream: Subscription, + latestStatus: () => Status, ) { this.#protocolVersion = protocolVersion; this.id = id; this.#downstream = downstream; + this.#latestStatus = latestStatus; this.#watermark = watermark; this.#acked = watermark; this.#backlog = []; @@ -58,18 +61,28 @@ export class Subscriber { } } - #initialStatusSent = false; + #initialized = false; - #ensureInitialStatusSent() { - if (this.#protocolVersion >= 2 && !this.#initialStatusSent) { - void this.#sendDownstream(['status', {tag: 'status'}]); - this.#initialStatusSent = true; + /** + * Called once the subscriber's watermark has been validated in the initial + * catchup process. + */ + #initialize() { + if (!this.#initialized) { + this.#initialized = true; + this.sendStatus(this.#latestStatus()); + } + } + + sendStatus(status: Status) { + if (this.#protocolVersion >= 2 && this.#initialized) { + void this.#sendDownstream(['status', status]); } } /** catchup() is called on ChangeEntries loaded from the store. */ async catchup(change: WatermarkedChange) { - this.#ensureInitialStatusSent(); + this.#initialize(); await this.#sendChange(change); } @@ -78,7 +91,7 @@ export class Subscriber { * entries that were received during the catchup. */ setCaughtUp() { - this.#ensureInitialStatusSent(); + this.#initialize(); assert( this.#backlog, 'setCaughtUp() called but subscriber is not in catchup mode', diff --git a/packages/zero-cache/src/services/change-streamer/test-utils.ts b/packages/zero-cache/src/services/change-streamer/test-utils.ts index c5ef1467a5..12810b0bbe 100644 --- a/packages/zero-cache/src/services/change-streamer/test-utils.ts +++ b/packages/zero-cache/src/services/change-streamer/test-utils.ts @@ -13,7 +13,13 @@ export function createSubscriber( const sub = Subscription.create({ cleanup: unconsumed => received.push(...unconsumed), }); - const subscriber = new Subscriber(PROTOCOL_VERSION, id, watermark, sub); + const subscriber = new Subscriber( + PROTOCOL_VERSION, + id, + watermark, + sub, + () => ({tag: 'status'}), + ); if (caughtUp) { subscriber.setCaughtUp(); } diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index 774930186f..d2b7816fc8 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -71,6 +71,7 @@ describe('replicator/incremental-sync', () => { {level: 'error', format: 'text'}, ); syncer = new IncrementalSyncer( + lc, TASK_ID, REPLICA_ID, {subscribe: subscribeFn.mockResolvedValue(downstream)}, @@ -117,7 +118,7 @@ describe('replicator/incremental-sync', () => { `, ); - syncing = syncer.run(lc); + syncing = syncer.run(); const notifications = syncer.subscribe(); const versionReady = notifications[Symbol.asyncIterator](); await versionReady.next(); // Get the initial nextStateVersion. @@ -395,7 +396,7 @@ describe('replicator/incremental-sync', () => { `, ); - syncing = syncer.run(lc); + syncing = syncer.run(); const notifications = syncer.subscribe(); const versionReady = notifications[Symbol.asyncIterator](); await versionReady.next(); // Get the initial nextStateVersion. @@ -572,7 +573,7 @@ describe('replicator/incremental-sync', () => { `, ); - syncing = syncer.run(lc); + syncing = syncer.run(); const notifications = syncer.subscribe(); const versionReady = notifications[Symbol.asyncIterator](); await versionReady.next(); // Get the initial nextStateVersion. @@ -712,6 +713,7 @@ describe('replicator/incremental-sync', () => { const {promise: hasRetried, resolve: retried} = resolver(); const syncer = new IncrementalSyncer( + lc, TASK_ID, REPLICA_ID, { @@ -729,7 +731,7 @@ describe('replicator/incremental-sync', () => { true, ); - const localSyncing = syncer.run(lc); + const localSyncing = syncer.run(); expect(await hasRetried).toBe(true); @@ -742,6 +744,7 @@ describe('replicator/incremental-sync', () => { const {promise: hasRetried, resolve: retried} = resolver(); const syncer = new IncrementalSyncer( + lc, TASK_ID, REPLICA_ID, { @@ -759,7 +762,7 @@ describe('replicator/incremental-sync', () => { true, ); - const localSyncing = syncer.run(lc); + const localSyncing = syncer.run(); downstream.fail(new Error('doh')); diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.ts b/packages/zero-cache/src/services/replicator/incremental-sync.ts index e1f67b20f2..fbb80e614d 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.ts @@ -2,18 +2,20 @@ import type {LogContext} from '@rocicorp/logger'; import type {Database} from '../../../../zqlite/src/db.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import type {Source} from '../../types/streams.ts'; -import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import type {DownloadStatus} from '../change-source/protocol/current.ts'; +import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import { PROTOCOL_VERSION, type ChangeStreamer, type Downstream, } from '../change-streamer/change-streamer.ts'; -import type {CommitResult} from './change-processor.ts'; import {RunningState} from '../running-state.ts'; +import type {CommitResult} from './change-processor.ts'; import {Notifier} from './notifier.ts'; import {ReplicationStatusPublisher} from './replication-status.ts'; import type {ReplicaState, ReplicatorMode} from './replicator.ts'; +import {ReplicationReportRecorder} from './reporter/recorder.ts'; +import type {ReplicationReport} from './reporter/report-schema.ts'; import type {WriteWorkerClient} from './write-worker-client.ts'; /** @@ -24,6 +26,7 @@ import type {WriteWorkerClient} from './write-worker-client.ts'; * in a worker thread via the {@link WriteWorkerClient}. */ export class IncrementalSyncer { + readonly #lc: LogContext; readonly #taskID: string; readonly #id: string; readonly #changeStreamer: ChangeStreamer; @@ -32,6 +35,7 @@ export class IncrementalSyncer { readonly #mode: ReplicatorMode; readonly #publishReplicationStatus: boolean; readonly #notifier: Notifier; + readonly #reporter: ReplicationReportRecorder; readonly #state = new RunningState('IncrementalSyncer'); @@ -42,6 +46,7 @@ export class IncrementalSyncer { ); constructor( + lc: LogContext, taskID: string, id: string, changeStreamer: ChangeStreamer, @@ -50,6 +55,7 @@ export class IncrementalSyncer { mode: ReplicatorMode, publishReplicationStatus: boolean, ) { + this.#lc = lc; this.#taskID = taskID; this.#id = id; this.#changeStreamer = changeStreamer; @@ -58,9 +64,11 @@ export class IncrementalSyncer { this.#mode = mode; this.#publishReplicationStatus = publishReplicationStatus; this.#notifier = new Notifier(); + this.#reporter = new ReplicationReportRecorder(lc); } - async run(lc: LogContext) { + async run() { + const lc = this.#lc; this.#worker.onError(err => this.#state.stop(lc, err)); lc.info?.(`Starting IncrementalSyncer`); const {watermark: initialWatermark} = @@ -105,11 +113,22 @@ export class IncrementalSyncer { for await (const message of downstream) { this.#replicationEvents.add(1); switch (message[0]) { - case 'status': - // Used for checking if a replica can be caught up. Not - // relevant here. - lc.debug?.(`Received initial status`, message[1]); + case 'status': { + const {lagReport} = message[1]; + if (lagReport) { + const report: ReplicationReport = { + nextSendTimeMs: lagReport.nextSendTimeMs, + }; + if (lagReport.lastTimings) { + report.lastTimings = { + ...lagReport.lastTimings, + replicateTimeMs: Date.now(), + }; + } + this.#reporter.record(report); + } break; + } case 'error': // Unrecoverable error. Stop the service. this.stop(lc, message[1]); diff --git a/packages/zero-cache/src/services/replicator/replicator.ts b/packages/zero-cache/src/services/replicator/replicator.ts index 56ba8ff6f6..af21300bb1 100644 --- a/packages/zero-cache/src/services/replicator/replicator.ts +++ b/packages/zero-cache/src/services/replicator/replicator.ts @@ -76,6 +76,7 @@ export class ReplicatorService implements Replicator, Service { this.#worker = worker; this.#incrementalSyncer = new IncrementalSyncer( + this.#lc, taskID, `${taskID}/${id}`, changeStreamer, @@ -91,7 +92,7 @@ export class ReplicatorService implements Replicator, Service { } run() { - this.#runPromise = this.#incrementalSyncer.run(this.#lc); + this.#runPromise = this.#incrementalSyncer.run(); return this.#runPromise; } diff --git a/packages/zero-cache/src/services/replicator/reporter/recorder.test.ts b/packages/zero-cache/src/services/replicator/reporter/recorder.test.ts new file mode 100644 index 0000000000..7c7ff23eb7 --- /dev/null +++ b/packages/zero-cache/src/services/replicator/reporter/recorder.test.ts @@ -0,0 +1,66 @@ +import type {ObservableResult} from '@opentelemetry/api'; +import {expect, test} from 'vitest'; +import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; +import {ReplicationReportRecorder} from './recorder.ts'; + +test('replication report recorder', () => { + let now: number = 10_000; + + const recorder = new ReplicationReportRecorder( + createSilentLogContext(), + () => now, + ); + + recorder.record({ + lastTimings: { + sendTimeMs: 1000, + commitTimeMs: 1100, + receiveTimeMs: 1200, + replicateTimeMs: 1550, + }, + nextSendTimeMs: 11_000, + }); + + function expectObserved( + observer: (o: ObservableResult) => void, + expected: number, + ) { + let observed: number | undefined; + observer({observe: v => (observed = v)}); + expect(observed).toBe(expected); + } + + expectObserved(recorder.reportUpstreamLag, 200); + expectObserved(recorder.reportReplicaLag, 350); + expectObserved(recorder.reportTotalLag, 550); + + now = 11_550; + + expectObserved(recorder.reportUpstreamLag, 200); + expectObserved(recorder.reportReplicaLag, 350); + expectObserved(recorder.reportTotalLag, 550); + + now = 12_123; + expectObserved(recorder.reportUpstreamLag, 200); + expectObserved(recorder.reportReplicaLag, 350); + expectObserved(recorder.reportTotalLag, 1123); + + now = 12_246; + expectObserved(recorder.reportUpstreamLag, 200); + expectObserved(recorder.reportReplicaLag, 350); + expectObserved(recorder.reportTotalLag, 1246); + + recorder.record({ + lastTimings: { + sendTimeMs: 11_000, + commitTimeMs: 11_123, + receiveTimeMs: 11_250, + replicateTimeMs: 11_650, + }, + nextSendTimeMs: 21_000, + }); + + expectObserved(recorder.reportUpstreamLag, 250); + expectObserved(recorder.reportReplicaLag, 400); + expectObserved(recorder.reportTotalLag, 650); +}); diff --git a/packages/zero-cache/src/services/replicator/reporter/recorder.ts b/packages/zero-cache/src/services/replicator/reporter/recorder.ts new file mode 100644 index 0000000000..81ffdd4a31 --- /dev/null +++ b/packages/zero-cache/src/services/replicator/reporter/recorder.ts @@ -0,0 +1,88 @@ +import type {ObservableResult} from '@opentelemetry/api'; +import type {LogContext} from '@rocicorp/logger'; +import {getOrCreateGauge} from '../../../observability/metrics.ts'; +import type {ReplicationReport} from './report-schema.ts'; + +// Hook for sanity checking lag reports in development. +const LOG_ALL_REPLICATION_REPORTS_AT_DEBUG = + process.env.ZERO_LOG_ALL_REPLICATION_REPORTS_AT_DEBUG === '1'; + +export class ReplicationReportRecorder { + readonly #lc: LogContext; + readonly #now: () => number; + #last: ReplicationReport | null = null; + + constructor(lc: LogContext, now = Date.now) { + this.#lc = lc; + this.#now = now; + } + + record(report: ReplicationReport) { + const first = this.#last === null; + this.#last = report; + + const {lastTimings} = report; + if (lastTimings) { + const total = lastTimings.replicateTimeMs - lastTimings.sendTimeMs; + if (total > 10_000) { + this.#lc.warn?.(`high replication lag: ${total} ms`, report); + } else if (total > 1_000) { + this.#lc.info?.(`replication lag: ${total} ms`, report); + } + if (LOG_ALL_REPLICATION_REPORTS_AT_DEBUG) { + this.#lc.debug?.(`replication lag ${total} ms`, report); + } + } + + if (first) { + getOrCreateGauge('replication', 'upstream_lag', { + description: + 'Latency from sending an upstream replication report ' + + 'to receiving it in the replication stream', + unit: 'millisecond', + }).addCallback(this.reportUpstreamLag); + + getOrCreateGauge('replication', 'replica_lag', { + description: + 'Latency from receiving an upstream replication report ' + + 'to its reaching the replica', + unit: 'millisecond', + }).addCallback(this.reportReplicaLag); + + getOrCreateGauge('replication', 'total_lag', { + description: + 'Latency from sending an upstream replication report to its ' + + 'reaching the replica. This will be a (growing) estimate if the ' + + 'next expected report has yet to be received and the elapsed ' + + `time has exceeded the previous report's total lag.`, + unit: 'millisecond', + }).addCallback(this.reportTotalLag); + } + } + + readonly reportUpstreamLag = (o: ObservableResult) => { + const last = this.#last?.lastTimings; + if (last) { + o.observe(last.receiveTimeMs - last.sendTimeMs); + } + }; + + readonly reportReplicaLag = (o: ObservableResult) => { + const last = this.#last?.lastTimings; + if (last) { + o.observe(last.replicateTimeMs - last.receiveTimeMs); + } + }; + + readonly reportTotalLag = (o: ObservableResult) => { + const last = this.#last; + if (last) { + const nextLagEstimate = this.#now() - last.nextSendTimeMs; + const timings = last.lastTimings; + const lastLag = timings + ? timings.replicateTimeMs - timings.sendTimeMs + : 0; + o.observe(Math.max(lastLag, nextLagEstimate)); + } + }; +} diff --git a/packages/zero-cache/src/services/replicator/reporter/report-schema.ts b/packages/zero-cache/src/services/replicator/reporter/report-schema.ts new file mode 100644 index 0000000000..06e0d5ee63 --- /dev/null +++ b/packages/zero-cache/src/services/replicator/reporter/report-schema.ts @@ -0,0 +1,27 @@ +import * as v from '../../../../../shared/src/valita.ts'; + +export const changeSourceTimingsSchema = v.object({ + sendTimeMs: v.number(), + commitTimeMs: v.number(), + receiveTimeMs: v.number(), +}); + +export const changeSourceReportSchema = v.object({ + lastTimings: changeSourceTimingsSchema, + nextSendTimeMs: v.number(), +}); + +export const replicationTimingsSchema = changeSourceTimingsSchema.extend({ + replicateTimeMs: v.number(), +}); + +export const replicationReportSchema = v.object({ + lastTimings: replicationTimingsSchema.optional(), + nextSendTimeMs: v.number(), +}); + +export type ChangeSourceTimings = v.Infer; +export type ChangeSourceReport = v.Infer; + +export type ReplicationTimings = v.Infer; +export type ReplicationReport = v.Infer; diff --git a/prod/sst/sst.config.ts b/prod/sst/sst.config.ts index 23feff575d..32b0b9f752 100644 --- a/prod/sst/sst.config.ts +++ b/prod/sst/sst.config.ts @@ -186,6 +186,7 @@ export default $config({ ZERO_INITIAL_SYNC_PROFILE_COPY: 'true', ZERO_CHANGE_MAX_CONNS: '3', ZERO_NUM_SYNC_WORKERS: '0', + ZERO_REPLICATION_LAG_REPORT_INTERVAL_MS: '15000', }, loadBalancer: { public: false, From ac1a2faa0f6447df1123d025889d01db2add12b6 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 26 Mar 2026 14:33:29 +0100 Subject: [PATCH 175/495] refactor: replace vitest bench with mitata for benchmarking (#5688) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation Vitest's built-in `bench` (powered by tinybench) has poor statistical reporting and limited flexibility. This PR replaces `vitest bench` with [mitata](https://github.com/evanwashere/mitata), a more capable benchmarking library with better statistical analysis (p75/p99, histograms) and flexible output formats. See also: https://github.com/vitest-dev/vitest/discussions/7850 ## Changes ### New benchmarking infrastructure (`packages/shared`) - **`bench.ts`** — A thin wrapper around mitata's `measure` and `do_not_optimize` that integrates with vitest's test runner. Benchmarks are now regular vitest tests that call mitata internally, so they run with `vitest run` instead of `vitest bench`. Supports both human-readable (with histograms) and JSON output via `BENCH_OUTPUT_FORMAT=json`. - **`bench-format.ts`** — Formatting utilities (adapted from mitata's internals) for pretty-printing benchmark results with histograms, color support, and time/byte formatting. - **`vitest.config.bench.ts`** — Shared vitest config for benchmark files (`*.bench.ts`), with console passthrough and appropriate timeouts. - **`mitata-json-to-bmf.ts`** — Simplified converter from the new JSON output to Bencher Metric Format (BMF) for CI tracking. ### Package-level changes - **`packages/shared`**, **`packages/zero-client`**, **`packages/zero-cache`**, **`packages/zql-benchmarks`** — Updated bench scripts: `bench`, `bench:bmf`, and `bench:bmf:silent`. Each package now uses `vitest run --config vitest.config.bench.ts` instead of `vitest bench`. - All benchmark files updated to import `bench`/`describe` from the new `shared/src/bench.ts` wrapper instead of from `vitest`. - Removed the `vitest-perf-json-to-bmf.ts` converter (no longer needed). ### CI changes - Unified all benchmark jobs (including ZQL benchmarks) into the shared reusable workflow — removed the separate `zql_benchmarks` job and the `run-zql-benchmarks` composite action. - The reusable workflow now runs `bench:bmf:silent` and pipes output directly to bencher (no intermediate conversion step). - Added `shared` and `zero-cache` to the benchmark matrix. --- .github/actions/playwright-install/action.yml | 15 + .github/actions/run-zql-benchmarks/action.yml | 24 -- .github/workflows/bencher-benchmarks-pr.yml | 70 ++-- .github/workflows/bencher-benchmarks.yml | 56 +--- .github/workflows/bundle-sizes.js.yml | 2 +- .github/workflows/js.yml | 14 +- .github/workflows/perf-smoke.yml | 2 +- .github/workflows/perf-v2.js.yml | 12 +- .github/workflows/reusable-benchmark.yml | 10 +- .github/workflows/sst-gigabugs-deploy.yml | 2 +- .github/workflows/sst-prod-deploy.yml | 2 +- .github/workflows/sst-sandbox-deploy.yml | 2 +- package.json | 5 +- .../workflows/upload-release-assets.yml | 2 +- packages/shared/package.json | 3 + packages/shared/src/bench-format.ts | 303 ++++++++++++++++++ packages/shared/src/bench.ts | 151 +++++++++ packages/shared/src/size-of-value.bench.ts | 2 +- packages/shared/src/tdigest.bench.ts | 2 +- .../shared/src/tool/mitata-json-to-bmf.ts | 148 ++++----- packages/shared/src/tool/vitest-config.ts | 77 +++-- packages/shared/vitest.config.bench.node.ts | 11 + packages/shared/vitest.config.bench.ts | 10 + packages/shared/vitest.config.bench.web.ts | 8 + packages/shared/vitest.config.node.ts | 1 - packages/shared/vitest.config.ts | 13 +- packages/zero-cache/package.json | 4 +- packages/zero-cache/src/db/pg-copy.bench.ts | 2 +- packages/zero-cache/vitest.config.bench.ts | 11 + packages/zero-cache/vitest.config.ts | 7 +- packages/zero-client/package.json | 5 +- .../zero-client/src/client/custom.bench.ts | 2 +- packages/zero-client/src/client/zero.bench.ts | 99 +++--- packages/zero-client/vitest.config.bench.ts | 11 + packages/zql-benchmarks/package.json | 2 +- .../src/chinook-hydration.bench.ts | 7 +- .../src/chinook-manual-cases.bench.ts | 16 +- .../zql-benchmarks/src/chinook-push.bench.ts | 5 - .../zql-benchmarks/src/planner-cost.bench.ts | 26 +- .../src/planner-hydration.bench.ts | 26 +- packages/zql-benchmarks/src/zbugs.bench.ts | 48 +-- .../zql-benchmarks/vitest.config.bench.ts | 13 + packages/zql-benchmarks/vitest.config.ts | 6 +- packages/zql-integration-tests/package.json | 1 - .../src/helpers/runner.ts | 23 +- turbo.json | 9 + vitest.config.ts | 2 + 47 files changed, 823 insertions(+), 449 deletions(-) create mode 100644 .github/actions/playwright-install/action.yml delete mode 100644 .github/actions/run-zql-benchmarks/action.yml create mode 100644 packages/shared/src/bench-format.ts create mode 100644 packages/shared/src/bench.ts create mode 100644 packages/shared/vitest.config.bench.node.ts create mode 100644 packages/shared/vitest.config.bench.ts create mode 100644 packages/shared/vitest.config.bench.web.ts create mode 100644 packages/zero-cache/vitest.config.bench.ts create mode 100644 packages/zero-client/vitest.config.bench.ts create mode 100644 packages/zql-benchmarks/vitest.config.bench.ts diff --git a/.github/actions/playwright-install/action.yml b/.github/actions/playwright-install/action.yml new file mode 100644 index 0000000000..5e3af10ecb --- /dev/null +++ b/.github/actions/playwright-install/action.yml @@ -0,0 +1,15 @@ +name: 'Install Playwright' +description: 'Install Playwright browsers and system dependencies' + +runs: + using: 'composite' + steps: + - uses: actions/setup-node@v6 + with: + node-version: 24.x + cache: 'npm' + - run: npm ci + shell: bash + - name: Install Playwright + run: npx playwright install --with-deps + shell: bash diff --git a/.github/actions/run-zql-benchmarks/action.yml b/.github/actions/run-zql-benchmarks/action.yml deleted file mode 100644 index 1f2e552ccc..0000000000 --- a/.github/actions/run-zql-benchmarks/action.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: 'Run ZQL Benchmarks' -description: 'Run ZQL benchmarks and convert output to BMF format' -outputs: - benchmark-output: - description: 'The BMF formatted benchmark output' - value: ${{ steps.run-benchmarks.outputs.result }} -runs: - using: 'composite' - steps: - - name: Run ZQL benchmarks - id: run-benchmarks - working-directory: packages/zql-benchmarks - shell: bash - run: | - # Enable debug logging to diagnose the issue - export DEBUG_MITATA_CONVERTER=1 - # First, run benchmarks and save raw output - BENCH_OUTPUT_FORMAT=json npm run bench 2>&1 > bench_output.txt || true - echo "Raw benchmark output (first 1000 chars):" - head -c 1000 bench_output.txt - echo "" - echo "---" - # Now try to convert it - cat bench_output.txt | npx tsx ../shared/src/tool/mitata-json-to-bmf.ts > output.json || (echo "Converter failed" && exit 1) diff --git a/.github/workflows/bencher-benchmarks-pr.yml b/.github/workflows/bencher-benchmarks-pr.yml index 0652160fa6..57990fed53 100644 --- a/.github/workflows/bencher-benchmarks-pr.yml +++ b/.github/workflows/bencher-benchmarks-pr.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - uses: bencherdev/bencher@main @@ -65,21 +65,35 @@ jobs: --file-size out/zero.js.br \ --file-size out/zero.js + playwright-install: + name: Install Playwright + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository + runs-on: self-hosted + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/playwright-install + perf: name: Perf PR # DO NOT REMOVE: For handling Fork PRs see Pull Requests from Forks if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository + needs: playwright-install uses: ./.github/workflows/reusable-benchmark.yml strategy: matrix: package: + - name: 'shared' + directory: 'packages/shared' + ci_id: 'shared-perf' - name: 'zero-client' directory: 'packages/zero-client' ci_id: 'perf' - # Replicache has no vitest benchs - # - name: 'replicache' - # directory: 'packages/replicache' - # ci_id: 'replicache-perf' + - name: 'zero-cache' + directory: 'packages/zero-cache' + ci_id: 'zero-cache-perf' + - name: 'zql-benchmarks' + directory: 'packages/zql-benchmarks' + ci_id: 'zql' with: package_name: ${{ matrix.package.name }} working_directory: ${{ matrix.package.directory }} @@ -91,49 +105,3 @@ jobs: secrets: BENCHER_API_TOKEN: ${{ secrets.BENCHER_API_TOKEN }} TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - zql_benchmarks: - name: ZQL Benchmarks PR - # DO NOT REMOVE: For handling Fork PRs see Pull Requests from Forks - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository - - permissions: - pull-requests: write - runs-on: self-hosted - env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: rocicorp - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-node@v6 - with: - node-version: 22.x - cache: 'npm' - - uses: bencherdev/bencher@main - - - run: npm ci - - - name: Run ZQL benchmarks - uses: ./.github/actions/run-zql-benchmarks - - - name: Upload PR benchmarks results to bencher.dev - working-directory: packages/zql-benchmarks - run: | - cat output.json | - bencher run \ - --project zero \ - --testbed self-hosted-metal \ - --token '${{ secrets.BENCHER_API_TOKEN }}' \ - --adapter json \ - --github-actions '${{ secrets.GITHUB_TOKEN }}' \ - --ci-id zql \ - --branch "$GITHUB_HEAD_REF" \ - --start-point "$GITHUB_BASE_REF" \ - --start-point-hash '${{ github.event.pull_request.base.sha }}' \ - --start-point-clone-thresholds \ - --start-point-reset \ - --threshold-measure throughput \ - --threshold-test t_test \ - --threshold-lower-boundary 0.99 \ - --threshold-min-sample-size 20 \ - --threshold-max-sample-size 60 \ - --err diff --git a/.github/workflows/bencher-benchmarks.yml b/.github/workflows/bencher-benchmarks.yml index 4c5d74a48e..2afbedef78 100644 --- a/.github/workflows/bencher-benchmarks.yml +++ b/.github/workflows/bencher-benchmarks.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - uses: bencherdev/bencher@main @@ -53,56 +53,30 @@ jobs: --file-size out/zero.js.br \ --file-size out/zero.js + playwright-install: + name: Install Playwright + runs-on: self-hosted + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/playwright-install + perf: name: Perf + needs: playwright-install uses: ./.github/workflows/reusable-benchmark.yml strategy: matrix: package: + - name: 'shared' + directory: 'packages/shared' - name: 'zero-client' directory: 'packages/zero-client' - # Replicache has no vitest benchs - # - name: 'replicache' - # directory: 'packages/replicache' + - name: 'zero-cache' + directory: 'packages/zero-cache' + - name: 'zql-benchmarks' + directory: 'packages/zql-benchmarks' with: package_name: ${{ matrix.package.name }} working_directory: ${{ matrix.package.directory }} secrets: BENCHER_API_TOKEN: ${{ secrets.BENCHER_API_TOKEN }} - - zql_benchmarks: - name: ZQL Benchmarks - permissions: - checks: write - runs-on: self-hosted - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-node@v6 - with: - node-version: 22.x - cache: 'npm' - - uses: bencherdev/bencher@main - - - run: npm ci - - - name: Run ZQL benchmarks - uses: ./.github/actions/run-zql-benchmarks - - - name: Upload benchmarks results to bencher.dev - working-directory: packages/zql-benchmarks - run: | - cat output.json | - bencher run \ - --project zero \ - --ci-number ${{ github.run_number }} \ - --testbed self-hosted-metal \ - --token '${{ secrets.BENCHER_API_TOKEN }}' \ - --adapter json \ - --github-actions '${{ secrets.GITHUB_TOKEN }}' \ - --start-point main \ - --threshold-measure throughput \ - --threshold-test t_test \ - --threshold-lower-boundary 0.99 \ - --threshold-min-sample-size 20 \ - --threshold-max-sample-size 60 \ - --err diff --git a/.github/workflows/bundle-sizes.js.yml b/.github/workflows/bundle-sizes.js.yml index feba8a1fca..53de5b29ff 100644 --- a/.github/workflows/bundle-sizes.js.yml +++ b/.github/workflows/bundle-sizes.js.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - run: npm ci - run: npm run --workspace=replicache build-bundle-sizes diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index ff54eca7b3..40bf59e9fa 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - run: npx syncpack@13 list-mismatches @@ -31,7 +31,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - run: npm install --prefix tools/verify-package-deps - run: npm run verify-deps @@ -47,7 +47,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - uses: oven-sh/setup-bun@v2 with: @@ -66,7 +66,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - uses: oven-sh/setup-bun@v2 with: @@ -85,7 +85,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - run: npm ci - run: npm run check-types @@ -106,7 +106,7 @@ jobs: fetch-depth: 100 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - run: npm ci - name: Install Playwright @@ -130,7 +130,7 @@ jobs: fetch-depth: 100 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - run: npm ci - name: Run tests diff --git a/.github/workflows/perf-smoke.yml b/.github/workflows/perf-smoke.yml index 446a16bee4..2b34d3f824 100644 --- a/.github/workflows/perf-smoke.yml +++ b/.github/workflows/perf-smoke.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - run: npm ci - name: Install Playwright diff --git a/.github/workflows/perf-v2.js.yml b/.github/workflows/perf-v2.js.yml index cdb319b917..df1f80e327 100644 --- a/.github/workflows/perf-v2.js.yml +++ b/.github/workflows/perf-v2.js.yml @@ -8,20 +8,26 @@ on: - 'packages/replicache-perf/**' jobs: + playwright-install: + name: Install Playwright + runs-on: self-hosted + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/playwright-install + benchmark: name: Performance regression check + needs: playwright-install runs-on: self-hosted steps: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' # Clear out potential user data dirs left over from previous failures. - run: rm -rf /tmp/replicache-playwright-* - run: npm ci - - name: Install Playwright - run: npx playwright install --with-deps - run: npm run build working-directory: packages/replicache-perf diff --git a/.github/workflows/reusable-benchmark.yml b/.github/workflows/reusable-benchmark.yml index 5f2c1b0ac2..da86ae052b 100644 --- a/.github/workflows/reusable-benchmark.yml +++ b/.github/workflows/reusable-benchmark.yml @@ -52,25 +52,21 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - uses: bencherdev/bencher@main - run: npm ci - - name: Install Playwright - run: npx playwright install --with-deps - - name: Run benchmarks working-directory: ${{ inputs.working_directory }} - run: npm run bench -- --browser.name=chromium --outputJson output.json + run: npm run --silent bench:bmf:silent > output.json - name: Upload benchmarks results to bencher.dev (main) if: ${{ !inputs.is_pr }} working-directory: ${{ inputs.working_directory }} run: | cat output.json |\ - npx tsx ../shared/src/tool/vitest-perf-json-to-bmf.ts |\ bencher run \ --project zero \ --ci-number ${{ github.run_number }} \ @@ -91,7 +87,6 @@ jobs: working-directory: ${{ inputs.working_directory }} run: | cat output.json |\ - npx tsx ../shared/src/tool/vitest-perf-json-to-bmf.ts |\ bencher run \ --project zero \ --testbed self-hosted-metal \ @@ -110,4 +105,3 @@ jobs: --threshold-min-sample-size 20 \ --threshold-max-sample-size 60 \ --err - diff --git a/.github/workflows/sst-gigabugs-deploy.yml b/.github/workflows/sst-gigabugs-deploy.yml index 0d3222de09..822027e1f5 100644 --- a/.github/workflows/sst-gigabugs-deploy.yml +++ b/.github/workflows/sst-gigabugs-deploy.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - name: Configure AWS credentials diff --git a/.github/workflows/sst-prod-deploy.yml b/.github/workflows/sst-prod-deploy.yml index f0221250d1..0f818fce39 100644 --- a/.github/workflows/sst-prod-deploy.yml +++ b/.github/workflows/sst-prod-deploy.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - name: Configure AWS credentials diff --git a/.github/workflows/sst-sandbox-deploy.yml b/.github/workflows/sst-sandbox-deploy.yml index 8fb716a201..3e0c38dcee 100644 --- a/.github/workflows/sst-sandbox-deploy.yml +++ b/.github/workflows/sst-sandbox-deploy.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - name: Configure AWS credentials diff --git a/package.json b/package.json index 2cef9c3755..744ec38c67 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,10 @@ "build-ci": "npm install && npx turbo run build", "start-zero-cache": "cd packages/zero-cache && npm run start", "verify-deps": "cd tools/verify-package-deps && npm run verify", - "verify-deps:fix": "cd tools/verify-package-deps && npm run verify:fix" + "verify-deps:fix": "cd tools/verify-package-deps && npm run verify:fix", + "bench": "npx turbo run bench --concurrency=1", + "bench:bmf": "npx turbo run bench:bmf --concurrency=1", + "bench:bmf:silent": "npx turbo run bench:bmf:silent --concurrency=1" }, "devDependencies": { "@vitest/browser-playwright": "^4.1.0", diff --git a/packages/replicache/.github/workflows/upload-release-assets.yml b/packages/replicache/.github/workflows/upload-release-assets.yml index a1552d97ef..47ea7c45b1 100644 --- a/packages/replicache/.github/workflows/upload-release-assets.yml +++ b/packages/replicache/.github/workflows/upload-release-assets.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x cache: 'npm' - run: npm ci diff --git a/packages/shared/package.json b/packages/shared/package.json index 833afe27c7..12fdc0b832 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -12,6 +12,9 @@ "test:firefox:watch": "VITEST_BROWSER=firefox vitest --config vitest.config.web.ts", "test:webkit": "VITEST_BROWSER=webkit vitest run --config vitest.config.web.ts", "test:webkit:watch": "VITEST_BROWSER=webkit vitest --config vitest.config.web.ts", + "bench": "vitest run --config vitest.config.bench.ts", + "bench:bmf": "BENCH_OUTPUT_FORMAT=json npm run bench 2>&1 | npx tsx ./src/tool/mitata-json-to-bmf.ts", + "bench:bmf:silent": "npm run bench:bmf --silent", "check-types": "tsc", "check-types:watch": "tsc --watch", "format": "prettier --write .", diff --git a/packages/shared/src/bench-format.ts b/packages/shared/src/bench-format.ts new file mode 100644 index 0000000000..1c3da9d94f --- /dev/null +++ b/packages/shared/src/bench-format.ts @@ -0,0 +1,303 @@ +// oxlint-disable no-console + +// Formatting utilities adapted from mitata's internal `$` object and +// the `mitata` format handler in main.mjs. +// https://github.com/evanwashere/mitata/blob/main/src/main.mjs +// +// Copyright 2022 evanwashere +// +// 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. + +function clamp(m: number, v: number, x: number) { + return v < m ? m : v > x ? x : v; +} + +function arrMax(arr: number[]) { + return arr.reduce((x, v) => Math.max(x, v), -Infinity); +} + +function fmtStr(s: string, len: number) { + if (len >= s.length) return s; + return `${s.slice(0, len - 2)}..`; +} + +function fmtTime(ns: number) { + if (ns < 1) return `${(ns * 1e3).toFixed(2)} ps`; + if (ns < 1e3) return `${ns.toFixed(2)} ns`; + ns /= 1000; + if (ns < 1e3) return `${ns.toFixed(2)} µs`; + ns /= 1000; + if (ns < 1e3) return `${ns.toFixed(2)} ms`; + ns /= 1000; + if (ns < 1e3) return `${ns.toFixed(2)} s`; + ns /= 60; + if (ns < 1e3) return `${ns.toFixed(2)} m`; + ns /= 60; + return `${ns.toFixed(2)} h`; +} + +function fmtBytes(b: number) { + if (Number.isNaN(b)) return 'NaN'; + if (b < 1e3) return `${b.toFixed(2)} b`; + b /= 1024; + if (b < 1e3) return `${b.toFixed(2)} kb`; + b /= 1024; + if (b < 1e3) return `${b.toFixed(2)} mb`; + b /= 1024; + if (b < 1e3) return `${b.toFixed(2)} gb`; + b /= 1024; + return `${b.toFixed(2)} tb`; +} + +const ansi = { + bold: '\x1b[1m', + reset: '\x1b[0m', + cyan: '\x1b[36m', + gray: '\x1b[90m', + yellow: '\x1b[33m', + magenta: '\x1b[35m', +}; + +const histogramSymbols = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'] as const; + +export interface Stats { + min: number; + max: number; + avg: number; + p75: number; + p99: number; + samples: number[]; + heap?: {avg: number; min: number; max: number} | undefined; +} + +interface Bins { + min: number; + max: number; + step: number; + bins: number[]; + peak: number; + avg: number; +} + +function histogramBins(stats: Stats, size: number, percentile: number): Bins { + const offset = (percentile * (stats.samples.length - 1)) | 0; + let min = stats.min; + const max = stats.samples[offset] || stats.max || 1; + const bins = Array.from({length: size}).fill(0); + const step = (max - min) / (size - 1); + + if (0 === step) { + min = 0; + bins[clamp(0, Math.round((stats.avg - min) / step), size - 1)] = 1; + } else { + for (let o = 0; o <= offset; o++) + bins[Math.round((stats.samples[o] - min) / step)]++; + } + + return { + min, + max, + step, + bins, + peak: arrMax(bins), + avg: clamp(0, Math.round((stats.avg - min) / step), size - 1), + }; +} + +function histogramAscii( + _bins: Bins, + height: number, + colors: boolean, +): string[] { + const symbols = histogramSymbols; + const canvas = Array.from({length: height}); + const {avg, peak, bins} = _bins; + const scale = (height * symbols.length - 1) / peak; + + for (let y = 0; y < height; y++) { + let l = ''; + + if (0 !== avg) { + if (colors) l += ansi.cyan; + for (let o = 0; o < avg; o++) { + const b = bins[o]; + if (y === 0) + l += symbols[clamp(0, Math.round(b * scale), symbols.length - 1)]; + else { + const lo = y * symbols.length; + const hi = (y + 1) * symbols.length; + const offset = Math.round(b * scale) | 0; + if (lo >= offset) l += ' '; + else if (hi <= offset) l += symbols[symbols.length - 1]; + else l += symbols[clamp(lo, offset, hi) % symbols.length]; + } + } + if (colors) l += ansi.reset; + } + + { + if (colors) l += ansi.yellow; + const b = bins[avg]; + if (y === 0) + l += symbols[clamp(0, Math.round(b * scale), symbols.length - 1)]; + else { + const lo = y * symbols.length; + const hi = (y + 1) * symbols.length; + const offset = Math.round(b * scale) | 0; + if (lo >= offset) l += ' '; + else if (hi <= offset) l += symbols[symbols.length - 1]; + else l += symbols[clamp(lo, offset, hi) % symbols.length]; + } + if (colors) l += ansi.reset; + } + + if (avg !== bins.length - 1) { + if (colors) l += ansi.magenta; + for (let o = 1 + avg; o < bins.length; o++) { + const b = bins[o]; + if (y === 0) + l += symbols[clamp(0, Math.round(b * scale), symbols.length - 1)]; + else { + const lo = y * symbols.length; + const hi = (y + 1) * symbols.length; + const offset = Math.round(b * scale) | 0; + if (lo >= offset) l += ' '; + else if (hi <= offset) l += symbols[symbols.length - 1]; + else l += symbols[clamp(lo, offset, hi) % symbols.length]; + } + } + if (colors) l += ansi.reset; + } + + canvas[y] = l; + } + + return canvas.reverse(); +} + +export function printBenchHeader(nameWidth: number, colors: boolean) { + const print = console.log; + const nameCol = 'benchmark'.padEnd(nameWidth); + const header = nameCol + ' avg (min … max) p75 / p99 (min … top 1%)'; + const sep = '-'.repeat(nameWidth + 13) + ' ' + '-'.repeat(31); + if (colors) { + print(ansi.bold + header + ansi.reset); + print(ansi.gray + sep + ansi.reset); + } else { + print(header); + print(sep); + } +} + +export function printBenchResult( + name: string, + stats: Stats, + nameWidth: number, + colors: boolean, +) { + const print = console.log; + const avg = fmtTime(stats.avg).padStart(9); + const paddedName = fmtStr(name, nameWidth).padEnd(nameWidth); + + let l = paddedName + ' '; + const p75 = fmtTime(stats.p75).padStart(9); + const histBins = histogramBins(stats, 21, 0.99); + const histHeight = stats.heap ? 3 : 2; + const histogram = histogramAscii(histBins, histHeight, colors); + + if (!colors) l += avg + '/iter' + ' ' + p75 + ' ' + histogram[0]; + else + l += + ansi.bold + + ansi.yellow + + avg + + ansi.reset + + ansi.bold + + '/iter' + + ansi.reset + + ' ' + + ansi.gray + + p75 + + ansi.reset + + ' ' + + histogram[0]; + print(l); + + l = ''; + const min = fmtTime(stats.min); + const max = fmtTime(stats.max); + const p99 = fmtTime(stats.p99).padStart(9); + const diff = 2 * 9 - (min.length + max.length); + + l += ' '.repeat(diff + nameWidth - 8); + if (!colors) l += '(' + min + ' … ' + max + ')'; + else + l += + ansi.gray + + '(' + + ansi.reset + + ansi.cyan + + min + + ansi.reset + + ansi.gray + + ' … ' + + ansi.reset + + ansi.magenta + + max + + ansi.reset + + ansi.gray + + ')' + + ansi.reset; + l += ' '; + if (!colors) l += p99 + ' ' + histogram[1]; + else l += ansi.gray + p99 + ansi.reset + ' ' + histogram[1]; + print(l); + + if (stats.heap) { + l = ' '.repeat(nameWidth - 8); + const hm = fmtBytes(stats.heap.min).padStart(9); + const hx = fmtBytes(stats.heap.max).padStart(9); + const ha = fmtBytes(stats.heap.avg).padStart(9); + + if (!colors) l += '(' + hm + ' … ' + hx + ') ' + ha + ' ' + histogram[2]; + else + l += + ansi.gray + + '(' + + ansi.reset + + ansi.yellow + + hm + + ansi.reset + + ansi.gray + + ' … ' + + ansi.reset + + ansi.yellow + + hx + + ansi.reset + + ansi.gray + + ') ' + + ansi.reset + + ansi.yellow + + ha + + ansi.reset + + ' ' + + histogram[2]; + print(l); + } +} diff --git a/packages/shared/src/bench.ts b/packages/shared/src/bench.ts new file mode 100644 index 0000000000..b2dbf8908e --- /dev/null +++ b/packages/shared/src/bench.ts @@ -0,0 +1,151 @@ +// oxlint-disable typescript/no-explicit-any +// oxlint-disable no-console + +import {measure} from 'mitata'; +import type {TestAPI} from 'vitest'; +import * as vitest from 'vitest'; +import { + printBenchHeader, + printBenchResult, + type Stats, +} from './bench-format.ts'; + +export {do_not_optimize as use} from 'mitata'; + +// These are replaced at build time by Vite's `define` block in benchConfig. +declare const process: {env: Record}; + +const benchOutputFormat = process.env.BENCH_OUTPUT_FORMAT; +const colors = !process.env.NO_COLOR && !process.env.NODE_DISABLE_COLORS; + +type MeasureFn = Parameters[0]; + +type BenchResult = {name: string; stats: Stats}; +const resultsStack: (BenchResult[] | undefined)[] = []; +let currentResults: BenchResult[] | undefined; + +function benchResultToJson(name: string, stats: Stats) { + return { + name, + stats: { + min: stats.min, + max: stats.max, + avg: stats.avg, + p75: stats.p75, + p99: stats.p99, + }, + }; +} + +function printResults(results: BenchResult[]) { + const nameWidth = Math.max(20, ...results.map(r => r.name.length)); + console.log(); + printBenchHeader(nameWidth, colors); + for (let i = 0; i < results.length; i++) { + if (i > 0) console.log(); + const {name, stats} = results[i]; + printBenchResult(name, stats, nameWidth, colors); + } + console.log(); +} + +function printJsonResults(results: BenchResult[]) { + console.log( + JSON.stringify({ + benchmarks: results.map(({name, stats}) => + benchResultToJson(name, stats), + ), + }), + ); +} + +// Copy vitest modifiers (skip, only, etc.) onto a wrapped function. +function copyModifiers any>( + wrapped: T, + original: any, + wrapFn: (fn: any) => any, + extraKeys?: readonly string[], +): T { + for (const key of [ + 'skip', + 'only', + 'todo', + 'shuffle', + 'concurrent', + 'sequential', + ...(extraKeys ?? []), + ]) { + Object.defineProperty(wrapped, key, { + get: () => wrapFn((original as any)[key]), + }); + } + + (wrapped as any).skipIf = (condition: any) => + wrapFn((original as any).skipIf(condition)); + (wrapped as any).runIf = (condition: any) => + wrapFn((original as any).runIf(condition)); + (wrapped as any).each = (original as any).each; + (wrapped as any).for = (original as any).for; + + return wrapped; +} + +function wrapTest(testFn: (...args: any[]) => any): TestAPI { + const wrapped = ((name: string, fn: MeasureFn) => + testFn(name, async ({task}: {task: {fullName: string}}) => { + const {fullName} = task; + const stats = await measure(fn); + + if (currentResults) { + currentResults.push({name: fullName, stats}); + } else if (benchOutputFormat === 'json') { + console.log(JSON.stringify(benchResultToJson(fullName, stats))); + } else { + printBenchResult(fullName, stats, fullName.length, colors); + } + })) as typeof vitest.test; + + copyModifiers(wrapped, testFn, wrapTest, ['fails']); + (wrapped as any).extend = (testFn as any).extend; + + return wrapped; +} + +export const bench = wrapTest(vitest.test); + +function wrapSuite(suiteFn: (...args: any[]) => any): typeof vitest.describe { + const wrapped = ((...args: any[]) => { + const [name, second, third] = args; + const origFn = typeof second === 'function' ? second : third; + const options = typeof second === 'function' ? third : second; + const fn = () => { + const results: BenchResult[] = []; + + vitest.beforeAll(() => { + resultsStack.push(currentResults); + currentResults = results; + }); + + vitest.afterAll(() => { + currentResults = resultsStack.pop(); + if (results.length === 0) return; + if (benchOutputFormat === 'json') { + printJsonResults(results); + } else { + printResults(results); + } + }); + + origFn(); + }; + return typeof second === 'function' + ? suiteFn(name, fn, options) + : suiteFn(name, options, fn); + }) as typeof vitest.describe; + + copyModifiers(wrapped, suiteFn, wrapSuite); + + return wrapped; +} + +export const describe = wrapSuite(vitest.describe); diff --git a/packages/shared/src/size-of-value.bench.ts b/packages/shared/src/size-of-value.bench.ts index 46da484521..148bba3eb9 100644 --- a/packages/shared/src/size-of-value.bench.ts +++ b/packages/shared/src/size-of-value.bench.ts @@ -1,9 +1,9 @@ -import {bench, describe} from 'vitest'; import { jsonArrayTestData, jsonObjectTestData, randomString, } from '../../shared/src/test-data.ts'; +import {bench, describe} from './bench.ts'; import {getSizeOfValue} from './size-of-value.ts'; describe('getSizeOfValue performance', () => { diff --git a/packages/shared/src/tdigest.bench.ts b/packages/shared/src/tdigest.bench.ts index ab806d3eb6..845b49aff4 100644 --- a/packages/shared/src/tdigest.bench.ts +++ b/packages/shared/src/tdigest.bench.ts @@ -2,7 +2,7 @@ // https://github.com/influxdata/tdigest import {generateMersenne53Randomizer} from '@faker-js/faker'; -import {bench, describe} from 'vitest'; +import {bench, describe} from './bench.ts'; import {Centroid} from './centroid.js'; import {TDigest} from './tdigest.js'; diff --git a/packages/shared/src/tool/mitata-json-to-bmf.ts b/packages/shared/src/tool/mitata-json-to-bmf.ts index 9cd76f51a7..82422b6cd9 100644 --- a/packages/shared/src/tool/mitata-json-to-bmf.ts +++ b/packages/shared/src/tool/mitata-json-to-bmf.ts @@ -1,131 +1,91 @@ /* oxlint-disable no-console */ -// Convert mitata JSON output (without samples) to Bencher Metric Format (BMF) +// Convert bench JSON output to Bencher Metric Format (BMF) +// +// The bench wrapper outputs two JSON shapes: +// 1. Suite (from describe afterAll): {"benchmarks":[{name, stats}]} +// 2. Standalone (individual bench): {name, stats} +// +// Stats: {min, max, avg, p75, p99} in nanoseconds. -// BMF - Bencher Metric Format type BMFMetric = { [key: string]: { throughput: { value: number; - lower_value?: number; - upper_value?: number; + lower_value?: number | undefined; + upper_value?: number | undefined; }; }; }; -// Mitata JSON output format (with samples: false, debug: false) -interface MitataBenchmark { - name?: string; - alias?: string; - stats?: { +interface Benchmark { + name: string; + stats: { min: number; max: number; avg: number; - p50?: number; - p75?: number; - p99?: number; + p75: number; + p99: number; }; - runs?: Array<{ - stats: { - min: number; - max: number; - avg: number; - p50?: number; - p75?: number; - p99?: number; - }; - }>; -} - -interface MitataJsonOutput { - benchmarks: MitataBenchmark[]; } -function convertMitataJsonToBMF(mitataOutput: MitataJsonOutput): BMFMetric { - const bmf: BMFMetric = {}; - - for (const benchmark of mitataOutput.benchmarks) { - // Get the benchmark name - const name = benchmark.alias || benchmark.name; - if (!name) continue; - - // Get stats either from top level or from first run - let {stats} = benchmark; - if (!stats && benchmark.runs && benchmark.runs[0]) { - stats = benchmark.runs[0].stats; - } - - if (stats) { - // Convert from nanoseconds to operations per second - // throughput = 1e9 / latency_in_nanoseconds - // Note: min latency → max throughput, max latency → min throughput - bmf[name] = { - throughput: { - value: 1e9 / stats.avg, - lower_value: 1e9 / stats.max, // max latency = min throughput - upper_value: 1e9 / stats.min, // min latency = max throughput - }, - }; - } - } - - return bmf; +function benchmarkToBMF(bmf: BMFMetric, {name, stats}: Benchmark) { + // Convert from nanoseconds to operations per second + // Note: min latency → max throughput, max latency → min throughput + bmf[name] = { + throughput: { + value: 1e9 / stats.avg, + lower_value: 1e9 / stats.max, + upper_value: 1e9 / stats.min, + }, + }; } async function main() { try { - // Read all stdin data const chunks: Buffer[] = []; for await (const chunk of process.stdin) { chunks.push(chunk); } const content = Buffer.concat(chunks).toString('utf-8'); - // Debug: Log the raw input received - if (process.env.DEBUG_MITATA_CONVERTER) { - console.error(`[DEBUG] Raw input (${content.length} bytes):`); - console.error(content.substring(0, 500)); - if (content.length > 500) { - console.error('... (truncated)'); + const bmf: BMFMetric = {}; + for (const line of content.split('\n')) { + const trimmed = line.trim(); + if (!trimmed.startsWith('{')) continue; + let parsed: unknown; + try { + parsed = JSON.parse(trimmed); + } catch { + continue; } - } - - // Split content by lines and find JSON objects - // Mitata outputs complete JSON objects, so we can split by lines and look for objects - const lines = content.split('\n'); - const allBenchmarks: MitataBenchmark[] = []; - - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim(); - if (line.startsWith('{') && line.includes('"benchmarks"')) { - try { - const parsed = JSON.parse(line) as MitataJsonOutput; - if (parsed.benchmarks) { - allBenchmarks.push(...parsed.benchmarks); - } - } catch (e) { - // Log parse errors when debugging - if (process.env.DEBUG_MITATA_CONVERTER) { - console.error(`[DEBUG] Failed to parse line ${i}: ${e}`); - } + if ( + typeof parsed === 'object' && + parsed !== null && + 'benchmarks' in parsed && + Array.isArray((parsed as {benchmarks: unknown}).benchmarks) + ) { + // Suite output: {"benchmarks": [...]} + for (const b of (parsed as {benchmarks: Benchmark[]}).benchmarks) { + benchmarkToBMF(bmf, b); } + } else if ( + typeof parsed === 'object' && + parsed !== null && + 'name' in parsed && + 'stats' in parsed + ) { + // Standalone output: {name, stats} + benchmarkToBMF(bmf, parsed as Benchmark); } } - if (process.env.DEBUG_MITATA_CONVERTER) { - console.error(`[DEBUG] Found ${allBenchmarks.length} benchmarks`); - } - - if (allBenchmarks.length === 0) { - throw new Error('No valid mitata benchmark data found in input'); + if (Object.keys(bmf).length === 0) { + throw new Error('No valid benchmark data found in input'); } - const mitataOutput: MitataJsonOutput = {benchmarks: allBenchmarks}; - - const bmfOutput = convertMitataJsonToBMF(mitataOutput); - process.stdout.write(JSON.stringify(bmfOutput, null, 2)); + process.stdout.write(JSON.stringify(bmf, null, 2)); } catch (error) { - // oxlint-disable-next-line no-console - console.error('Error converting mitata JSON to BMF:', error); + console.error('Error converting bench JSON to BMF:', error); process.exit(1); } } diff --git a/packages/shared/src/tool/vitest-config.ts b/packages/shared/src/tool/vitest-config.ts index fb2710d6ff..9811ee6e56 100644 --- a/packages/shared/src/tool/vitest-config.ts +++ b/packages/shared/src/tool/vitest-config.ts @@ -1,5 +1,6 @@ import {playwright} from '@vitest/browser-playwright'; import {defineConfig} from 'vitest/config'; +import type {BrowserConfigOptions} from 'vitest/node'; import {makeDefine} from '../build.ts'; export const CI = process.env['CI'] === 'true' || process.env['CI'] === '1'; @@ -36,11 +37,20 @@ const logSilenceMessages = [ 'Zero starting up with no server URL', ]; +const browser: BrowserConfigOptions = { + enabled: true, + provider: playwright(), + headless: true, + screenshotFailures: false, + instances: VITEST_BROWSER + ? ([{browser: VITEST_BROWSER}] as const) + : [ + {browser: 'chromium'}, + ...(CI ? ([{browser: 'firefox'}, {browser: 'webkit'}] as const) : []), + ], +}; + export default defineConfig({ - // https://github.com/vitest-dev/vitest/issues/5332#issuecomment-1977785593 - optimizeDeps: { - include: ['vitest > @vitest/expect > chai'], - }, define, test: { @@ -54,20 +64,7 @@ export default defineConfig({ }, include: ['src/**/*.{test,spec}{,.node}.?(c|m)[jt]s?(x)'], silent: 'passed-only', - browser: { - enabled: true, - provider: playwright(), - headless: true, - screenshotFailures: false, - instances: VITEST_BROWSER - ? ([{browser: VITEST_BROWSER}] as const) - : [ - {browser: 'chromium'}, - ...(CI - ? ([{browser: 'firefox'}, {browser: 'webkit'}] as const) - : []), - ], - }, + browser, coverage: { provider: 'v8', include: ['src/**'], @@ -78,3 +75,47 @@ export default defineConfig({ testTimeout: 10_000, }, }); + +const externalizedWarningRegExp = + /has been externalized for browser compatibility/; + +export const benchConfig = defineConfig({ + define: { + ...define, + 'process.env.NO_COLOR': JSON.stringify(process.env.NO_COLOR ?? ''), + 'process.env.NODE_DISABLE_COLORS': JSON.stringify( + process.env.NODE_DISABLE_COLORS ?? '', + ), + 'process.env.BENCH_OUTPUT_FORMAT': JSON.stringify( + process.env.BENCH_OUTPUT_FORMAT ?? '', + ), + }, + + test: { + include: ['src/**/*.bench{,.node}.?(c|m)[jt]s?(x)'], + disableConsoleIntercept: true, + silent: false, + onConsoleLog(str, type, _entity) { + if (externalizedWarningRegExp.test(str)) { + return false; + } + if (type === 'stderr') { + console.error(str); + } else { + console.log(str); + } + return false; + }, + browser, + slowTestThreshold: 15_000, + testTimeout: 60_000, + hookTimeout: 60_000, + }, + + server: { + headers: { + 'Cross-Origin-Opener-Policy': 'same-origin', + 'Cross-Origin-Embedder-Policy': 'require-corp', + }, + }, +}); diff --git a/packages/shared/vitest.config.bench.node.ts b/packages/shared/vitest.config.bench.node.ts new file mode 100644 index 0000000000..a6369a8dfe --- /dev/null +++ b/packages/shared/vitest.config.bench.node.ts @@ -0,0 +1,11 @@ +import {mergeConfig} from 'vitest/config'; +import {benchConfig} from './src/tool/vitest-config.ts'; + +export default mergeConfig(benchConfig, { + test: { + name: 'shared/bench/node', + browser: { + enabled: false, + }, + }, +}); diff --git a/packages/shared/vitest.config.bench.ts b/packages/shared/vitest.config.bench.ts new file mode 100644 index 0000000000..9f8961c587 --- /dev/null +++ b/packages/shared/vitest.config.bench.ts @@ -0,0 +1,10 @@ +import {mergeConfig} from 'vitest/config'; +import {benchConfig} from './src/tool/vitest-config.ts'; + +export default mergeConfig(benchConfig, { + test: { + projects: ['./vitest.config.bench.*.ts'], + silent: false, + disableConsoleIntercept: false, + }, +}); diff --git a/packages/shared/vitest.config.bench.web.ts b/packages/shared/vitest.config.bench.web.ts new file mode 100644 index 0000000000..a2bf01fcf2 --- /dev/null +++ b/packages/shared/vitest.config.bench.web.ts @@ -0,0 +1,8 @@ +import {mergeConfig} from 'vitest/config'; +import {benchConfig} from './src/tool/vitest-config.ts'; + +export default mergeConfig(benchConfig, { + test: { + name: 'shared/bench/browser', + }, +}); diff --git a/packages/shared/vitest.config.node.ts b/packages/shared/vitest.config.node.ts index b39d71b827..e214eddd6f 100644 --- a/packages/shared/vitest.config.node.ts +++ b/packages/shared/vitest.config.node.ts @@ -6,7 +6,6 @@ export default mergeConfig(config, { name: 'shared/node', browser: { enabled: false, - name: '', // not used but required by the type system }, }, }); diff --git a/packages/shared/vitest.config.ts b/packages/shared/vitest.config.ts index dabb92657c..f070ffb988 100644 --- a/packages/shared/vitest.config.ts +++ b/packages/shared/vitest.config.ts @@ -1,7 +1,14 @@ -import {defineConfig} from 'vitest/config'; +import {mergeConfig} from 'vitest/config'; +import {benchConfig} from './src/tool/vitest-config.ts'; -export default defineConfig({ +export default mergeConfig(benchConfig, { test: { - projects: ['./vitest.config.*.ts'], + projects: [ + './vitest.config.*.ts', + '!./vitest.config.bench.ts', + '!./vitest.config.bench.*.ts', + ], + silent: false, + disableConsoleIntercept: false, }, }); diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index b98bb3bd9a..19d65ced03 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -19,7 +19,9 @@ "format": "prettier --write .", "check-format": "prettier --check .", "lint": "oxlint --quiet --type-aware src/", - "bench": "vitest bench --run --project zero-cache/no-pg", + "bench": "vitest run --config vitest.config.bench.ts", + "bench:bmf": "BENCH_OUTPUT_FORMAT=json npm run bench 2>&1 | npx tsx ../shared/src/tool/mitata-json-to-bmf.ts", + "bench:bmf:silent": "npm run bench:bmf --silent", "local": "tsx tool/local.ts", "start": "tsx ./src/server/runner/main.ts", "benchdb": "tsx ./bench/bench.ts", diff --git a/packages/zero-cache/src/db/pg-copy.bench.ts b/packages/zero-cache/src/db/pg-copy.bench.ts index 3826738bc9..cc647cc8b5 100644 --- a/packages/zero-cache/src/db/pg-copy.bench.ts +++ b/packages/zero-cache/src/db/pg-copy.bench.ts @@ -1,5 +1,5 @@ import {pipeline, Readable} from 'node:stream'; -import {bench, describe} from 'vitest'; +import {bench, describe} from '../../../shared/src/bench.ts'; import {TextTransform} from './pg-copy.ts'; describe('pg-copy benchmark', () => { diff --git a/packages/zero-cache/vitest.config.bench.ts b/packages/zero-cache/vitest.config.bench.ts new file mode 100644 index 0000000000..e2ba655d99 --- /dev/null +++ b/packages/zero-cache/vitest.config.bench.ts @@ -0,0 +1,11 @@ +import {mergeConfig} from 'vitest/config'; +import {benchConfig} from '../shared/src/tool/vitest-config.ts'; + +export default mergeConfig(benchConfig, { + test: { + name: 'zero-cache/bench', + browser: { + enabled: false, + }, + }, +}); diff --git a/packages/zero-cache/vitest.config.ts b/packages/zero-cache/vitest.config.ts index c428125d04..198bf51d0c 100644 --- a/packages/zero-cache/vitest.config.ts +++ b/packages/zero-cache/vitest.config.ts @@ -77,6 +77,11 @@ export function configForCustomPg(url: string) { export default defineConfig({ test: { - projects: ['vitest.config.*.ts', ...configForCustomPg(import.meta.url)], + projects: [ + 'vitest.config.*.ts', + '!vitest.config.bench.ts', + '!vitest.config.bench.*.ts', + ...configForCustomPg(import.meta.url), + ], }, }); diff --git a/packages/zero-client/package.json b/packages/zero-client/package.json index 6c10408b1d..6e03143607 100644 --- a/packages/zero-client/package.json +++ b/packages/zero-client/package.json @@ -16,8 +16,9 @@ "test:webkit": "VITEST_BROWSER=webkit vitest run", "test:webkit:watch": "VITEST_BROWSER=webkit vitest", "test:update": "vitest run -u", - "bench": "vitest bench --run", - "bench:watch": "vitest bench --watch", + "bench": "vitest run --config vitest.config.bench.ts", + "bench:bmf": "BENCH_OUTPUT_FORMAT=json npm run bench 2>&1 | npx tsx ../shared/src/tool/mitata-json-to-bmf.ts", + "bench:bmf:silent": "npm run bench:bmf --silent", "check-types": "tsc", "check-types:watch": "tsc --watch" }, diff --git a/packages/zero-client/src/client/custom.bench.ts b/packages/zero-client/src/client/custom.bench.ts index 34b8864a2b..85489609e1 100644 --- a/packages/zero-client/src/client/custom.bench.ts +++ b/packages/zero-client/src/client/custom.bench.ts @@ -1,6 +1,6 @@ import {en, Faker, generateMersenne53Randomizer} from '@faker-js/faker'; -import {bench} from 'vitest'; import {zeroData} from '../../../replicache/src/transactions.ts'; +import {bench} from '../../../shared/src/bench.ts'; import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; import {generateSchema} from '../../../zql/src/query/test/schema-gen.ts'; import {TransactionImpl} from './custom.ts'; diff --git a/packages/zero-client/src/client/zero.bench.ts b/packages/zero-client/src/client/zero.bench.ts index 9c5dc900cb..90175fdd0d 100644 --- a/packages/zero-client/src/client/zero.bench.ts +++ b/packages/zero-client/src/client/zero.bench.ts @@ -1,5 +1,6 @@ import {resolver} from '@rocicorp/resolver'; -import {bench, describe, expect} from 'vitest'; +import {expect} from 'vitest'; +import {bench, describe} from '../../../shared/src/bench.ts'; import {createBuilder} from '../../../zql/src/query/create-builder.ts'; import type {Row} from '../../../zql/src/query/query.ts'; import {getInternalReplicacheImplForTesting, Zero} from './zero.ts'; @@ -62,67 +63,49 @@ await z.mutateBatch(async m => { await getInternalReplicacheImplForTesting(z).persist(); describe('basics', () => { - bench( - `All ${N} rows x 10 columns (numbers)`, - async () => { - const {promise, resolve} = resolver(); - const m = z.materialize(zql.user); - m.addListener(data => { - if (data.length === N) { - resolve(data as readonly UserRow[]); - } - }); - const rows = await promise; - expect(rows.reduce((sum, row) => sum + row.a, 0)).toBe(((N - 1) / 2) * N); - m.destroy(); - }, - { - throws: true, - }, - ); + bench(`All ${N} rows x 10 columns (numbers)`, async () => { + const {promise, resolve} = resolver(); + const m = z.materialize(zql.user); + m.addListener(data => { + if (data.length === N) { + resolve(data as readonly UserRow[]); + } + }); + const rows = await promise; + expect(rows.reduce((sum, row) => sum + row.a, 0)).toBe(((N - 1) / 2) * N); + m.destroy(); + }); }); describe('pk compare', () => { - bench( - `pk = N`, - async () => { - const {promise, resolve} = resolver(); - const value = N - 1; - const m = z.materialize(zql.user.where('a', value)); - m.addListener(data => { - if (data.length === 1) { - resolve(data as readonly UserRow[]); - } - }); - const rows = await promise; - expect(rows[0].a).toBe(value); - m.destroy(); - }, - { - throws: true, - }, - ); + bench(`pk = N`, async () => { + const {promise, resolve} = resolver(); + const value = N - 1; + const m = z.materialize(zql.user.where('a', value)); + m.addListener(data => { + if (data.length === 1) { + resolve(data as readonly UserRow[]); + } + }); + const rows = await promise; + expect(rows[0].a).toBe(value); + m.destroy(); + }); }); describe('with filter', () => { - bench( - `Lower rows ${N / 2} x 10 columns (numbers)`, - async () => { - const {promise, resolve} = resolver(); - const m = z.materialize(zql.user.where('a', '<', N / 2)); - m.addListener(data => { - if (data.length === N / 2) { - resolve(data as readonly UserRow[]); - } - }); - const rows = await promise; - expect(rows.reduce((sum, row) => sum + row.a, 0)).toBe( - (((N / 2 - 1) / 2) * N) / 2, - ); - m.destroy(); - }, - { - throws: true, - }, - ); + bench(`Lower rows ${N / 2} x 10 columns (numbers)`, async () => { + const {promise, resolve} = resolver(); + const m = z.materialize(zql.user.where('a', '<', N / 2)); + m.addListener(data => { + if (data.length === N / 2) { + resolve(data as readonly UserRow[]); + } + }); + const rows = await promise; + expect(rows.reduce((sum, row) => sum + row.a, 0)).toBe( + (((N / 2 - 1) / 2) * N) / 2, + ); + m.destroy(); + }); }); diff --git a/packages/zero-client/vitest.config.bench.ts b/packages/zero-client/vitest.config.bench.ts new file mode 100644 index 0000000000..6cb3fcb325 --- /dev/null +++ b/packages/zero-client/vitest.config.bench.ts @@ -0,0 +1,11 @@ +import {mergeConfig} from 'vitest/config'; +import {benchConfig} from '../shared/src/tool/vitest-config.ts'; + +export default mergeConfig(benchConfig, { + test: { + name: 'zero-client/bench', + browser: { + enabled: false, + }, + }, +}); diff --git a/packages/zql-benchmarks/package.json b/packages/zql-benchmarks/package.json index be4c51b9fc..46f4190bad 100644 --- a/packages/zql-benchmarks/package.json +++ b/packages/zql-benchmarks/package.json @@ -13,7 +13,7 @@ "lint": "oxlint --type-aware src/", "test": "vitest run --silent=false --disable-console-intercept", "test:watch": "vitest watch", - "bench": "vitest bench --disable-console-intercept --run", + "bench": "vitest run --config vitest.config.bench.ts", "bench:bmf": "BENCH_OUTPUT_FORMAT=json npm run bench 2>&1 | npx tsx ../shared/src/tool/mitata-json-to-bmf.ts", "bench:bmf:silent": "npm run bench:bmf --silent", "test-types": "vitest run --typecheck.only --no-browser.enabled", diff --git a/packages/zql-benchmarks/src/chinook-hydration.bench.ts b/packages/zql-benchmarks/src/chinook-hydration.bench.ts index f98df335c0..a0b6bade62 100644 --- a/packages/zql-benchmarks/src/chinook-hydration.bench.ts +++ b/packages/zql-benchmarks/src/chinook-hydration.bench.ts @@ -1,7 +1,6 @@ -import {runBenchmarks} from '../../zql-integration-tests/src/helpers/runner.ts'; import {getChinook} from '../../zql-integration-tests/src/chinook/get-deps.ts'; import {schema} from '../../zql-integration-tests/src/chinook/schema.ts'; -import {expect, test} from 'vitest'; +import {runBenchmarks} from '../../zql-integration-tests/src/helpers/runner.ts'; const pgContent = await getChinook(); @@ -63,7 +62,3 @@ await runBenchmarks( }, ], ); - -test('no-op', () => { - expect(true).toBe(true); -}); diff --git a/packages/zql-benchmarks/src/chinook-manual-cases.bench.ts b/packages/zql-benchmarks/src/chinook-manual-cases.bench.ts index 843ff129fc..d5ca177c2f 100644 --- a/packages/zql-benchmarks/src/chinook-manual-cases.bench.ts +++ b/packages/zql-benchmarks/src/chinook-manual-cases.bench.ts @@ -1,5 +1,4 @@ -import {bench, run, summary} from 'mitata'; -import {expect, test} from 'vitest'; +import {bench, describe} from '../../shared/src/bench.ts'; import {getChinook} from '../../zql-integration-tests/src/chinook/get-deps.ts'; import {schema} from '../../zql-integration-tests/src/chinook/schema.ts'; import {bootstrap} from '../../zql-integration-tests/src/helpers/runner.ts'; @@ -13,8 +12,8 @@ const {queries, delegates} = await bootstrap({ }); // Demonstration of how to compare two different query styles -summary(() => { - bench('tracks with artist name : flipped', async () => { +describe('tracks with artist name', () => { + bench('flipped', async () => { await delegates.sqlite.run( queries.artist .where('name', 'AC/DC') @@ -22,7 +21,7 @@ summary(() => { ); }); - bench('tracks with artist name : not flipped', async () => { + bench('not flipped', async () => { await delegates.sqlite.run( queries.track.whereExists('album', a => a.whereExists('artist', ar => ar.where('name', 'AC/DC')), @@ -30,10 +29,3 @@ summary(() => { ); }); }); - -await run(); - -// here so we can run with a vitest and get all the pg setup goodness -test('noop', () => { - expect(true).toBe(true); -}); diff --git a/packages/zql-benchmarks/src/chinook-push.bench.ts b/packages/zql-benchmarks/src/chinook-push.bench.ts index 67f59af8d4..5a2324e9da 100644 --- a/packages/zql-benchmarks/src/chinook-push.bench.ts +++ b/packages/zql-benchmarks/src/chinook-push.bench.ts @@ -1,4 +1,3 @@ -import {expect, test} from 'vitest'; import type {JSONValue} from '../../shared/src/json.ts'; import {must} from '../../shared/src/must.ts'; import type {Row} from '../../zero-protocol/src/data.ts'; @@ -143,7 +142,3 @@ function makeEdit() { } as const; }; } - -test('no-op', () => { - expect(true).toBe(true); -}); diff --git a/packages/zql-benchmarks/src/planner-cost.bench.ts b/packages/zql-benchmarks/src/planner-cost.bench.ts index bc52dc008a..220ca02ee2 100644 --- a/packages/zql-benchmarks/src/planner-cost.bench.ts +++ b/packages/zql-benchmarks/src/planner-cost.bench.ts @@ -1,5 +1,4 @@ -import {bench, run, summary} from 'mitata'; -import {expect, test} from 'vitest'; +import {bench, describe} from '../../shared/src/bench.ts'; import {createSilentLogContext} from '../../shared/src/logging-test-utils.ts'; import {must} from '../../shared/src/must.ts'; import {computeZqlSpecs} from '../../zero-cache/src/db/lite-tables.ts'; @@ -61,7 +60,7 @@ function benchmarkPlanning( }); } -summary(() => { +describe('planner cost', () => { benchmarkPlanning( '1 exists: track.exists(album)', queries.track.whereExists('album'), @@ -228,24 +227,3 @@ summary(() => { ), ); }); - -// Check if JSON output is requested via environment variable -const format = process.env.BENCH_OUTPUT_FORMAT; - -if (format === 'json') { - // Output JSON without samples for smaller, cleaner output - await run({ - format: { - json: { - samples: false, - debug: false, - }, - }, - }); -} else { - await run(); -} - -test('no-op', () => { - expect(true).toBe(true); -}); diff --git a/packages/zql-benchmarks/src/planner-hydration.bench.ts b/packages/zql-benchmarks/src/planner-hydration.bench.ts index 7a704670ab..18b203778c 100644 --- a/packages/zql-benchmarks/src/planner-hydration.bench.ts +++ b/packages/zql-benchmarks/src/planner-hydration.bench.ts @@ -1,5 +1,4 @@ -import {bench, run, summary} from 'mitata'; -import {expect, test} from 'vitest'; +import {bench, describe} from '../../shared/src/bench.ts'; import {createSilentLogContext} from '../../shared/src/logging-test-utils.ts'; import {must} from '../../shared/src/must.ts'; import {computeZqlSpecs} from '../../zero-cache/src/db/lite-tables.ts'; @@ -80,7 +79,7 @@ function benchmarkQuery(name: string, query: AnyQuery) { const unplannedQuery = createQuery(tableName, unplannedAST); const plannedQuery = createQuery(tableName, plannedClientAST); - summary(() => { + describe(name, () => { bench(`unplanned: ${name}`, async () => { await delegate.run(unplannedQuery); }); @@ -128,24 +127,3 @@ benchmarkQuery( ), ), ); - -// Check if JSON output is requested via environment variable -const format = process.env.BENCH_OUTPUT_FORMAT; - -if (format === 'json') { - // Output JSON without samples for smaller, cleaner output - await run({ - format: { - json: { - samples: false, - debug: false, - }, - }, - }); -} else { - await run(); -} - -test('no-op', () => { - expect(true).toBe(true); -}); diff --git a/packages/zql-benchmarks/src/zbugs.bench.ts b/packages/zql-benchmarks/src/zbugs.bench.ts index dcdcc5e4f2..e8c4427b85 100644 --- a/packages/zql-benchmarks/src/zbugs.bench.ts +++ b/packages/zql-benchmarks/src/zbugs.bench.ts @@ -1,7 +1,5 @@ -// oxlint-disable no-console -import {summary} from 'mitata'; -import {expect, test} from 'vitest'; import {testLogConfig} from '../../otel/src/test-log-config.ts'; +import {bench, describe} from '../../shared/src/bench.ts'; import {createSilentLogContext} from '../../shared/src/logging-test-utils.ts'; import {computeZqlSpecs} from '../../zero-cache/src/db/lite-tables.ts'; import type {LiteAndZqlSpec} from '../../zero-cache/src/db/specs.ts'; @@ -17,9 +15,14 @@ import {builder, schema} from './schema.ts'; const dbPath = process.env.ZBUGS_REPLICA_PATH; if (!dbPath) { + // oxlint-disable-next-line no-console console.error( 'Cannot run zbugs.bench.ts without a path to the zbugs replica. Set env var: `ZBUGS_REPLICA_PATH`', ); + bench.skip('skipped - no ZBUGS_REPLICA_PATH', () => { + // This callback is intentionally non-empty to satisfy static analysis tools. + // It will never be executed because the benchmark is marked as skipped. + }); } else { // Open the zbugs SQLite database const db = new Database(createSilentLogContext(), dbPath); @@ -92,9 +95,9 @@ if (!dbPath) { } // Helper to benchmark planned vs unplanned - async function benchmarkQuery< + function registerBenchmark< TTable extends keyof typeof schema.tables & string, - >(_name: string, query: AnyQuery) { + >(name: string, query: AnyQuery) { const unplannedAST = asQueryInternals(query).ast; const format = asQueryInternals(query).format; @@ -108,34 +111,15 @@ if (!dbPath) { const tableName = unplannedAST.table as TTable; const unplannedQuery = createQuery(tableName, unplannedAST, format); - db.exec('BEGIN'); - const start = performance.now(); - await delegate.run(unplannedQuery as AnyQuery); - const end = performance.now(); - console.log('duration ', end - start); - db.exec('ROLLBACK'); - - summary(() => { - // bench(`unplanned: ${name}`, async () => { - // await delegate.run(unplannedQuery as AnyQuery); - // }); - // bench(`planned: ${name}`, async () => { - // await delegate.run(plannedQuery as AnyQuery); - // }); + bench(name, async () => { + await delegate.run(unplannedQuery as AnyQuery); }); } - await benchmarkQuery( - 'full issue scan + join', - builder.issue.related('creator').related('assignee'), - ); - - // run all reads in an explicit tx - // db.exec('BEGIN'); - // await run(); - // db.exec('ROLLBACK'); + describe('zbugs', () => { + registerBenchmark( + 'full issue scan + join', + builder.issue.related('creator').related('assignee'), + ); + }); } - -test('no-op', () => { - expect(true).toBe(true); -}); diff --git a/packages/zql-benchmarks/vitest.config.bench.ts b/packages/zql-benchmarks/vitest.config.bench.ts new file mode 100644 index 0000000000..9aa7951dea --- /dev/null +++ b/packages/zql-benchmarks/vitest.config.bench.ts @@ -0,0 +1,13 @@ +import {mergeConfig} from 'vitest/config'; +import {benchConfig} from '../shared/src/tool/vitest-config.ts'; + +export default mergeConfig(benchConfig, { + test: { + name: 'zql-benchmarks/bench', + globalSetup: ['../zero-cache/test/pg-17.ts'], + browser: { + enabled: false, + }, + passWithNoTests: true, + }, +}); diff --git a/packages/zql-benchmarks/vitest.config.ts b/packages/zql-benchmarks/vitest.config.ts index 17ab59d687..f1c5a342cd 100644 --- a/packages/zql-benchmarks/vitest.config.ts +++ b/packages/zql-benchmarks/vitest.config.ts @@ -2,6 +2,10 @@ import {defineConfig} from 'vitest/config'; export default defineConfig({ test: { - projects: ['vitest.config.*.ts'], + projects: [ + 'vitest.config.*.ts', + '!vitest.config.bench.ts', + '!vitest.config.bench.*.ts', + ], }, }); diff --git a/packages/zql-integration-tests/package.json b/packages/zql-integration-tests/package.json index cf3ce9b71d..1e57c38c6c 100644 --- a/packages/zql-integration-tests/package.json +++ b/packages/zql-integration-tests/package.json @@ -15,7 +15,6 @@ "test:pg17": "vitest run --project='*17*'", "test:watch": "vitest watch", "test:pg17:watch": "vitest watch --project='*17*'", - "bench": "vitest bench", "test-types": "vitest run --typecheck.only --no-browser.enabled", "test-types:watch": "vitest watch --typecheck.only --no-browser.enabled" }, diff --git a/packages/zql-integration-tests/src/helpers/runner.ts b/packages/zql-integration-tests/src/helpers/runner.ts index 0e54753255..c597a564f8 100644 --- a/packages/zql-integration-tests/src/helpers/runner.ts +++ b/packages/zql-integration-tests/src/helpers/runner.ts @@ -1,10 +1,10 @@ -import {bench, run, summary} from 'mitata'; import fs from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; import {afterAll, expect} from 'vitest'; import {testLogConfig} from '../../../otel/src/test-log-config.ts'; import {unreachable} from '../../../shared/src/asserts.ts'; +import {bench, describe} from '../../../shared/src/bench.ts'; import {wrapIterable} from '../../../shared/src/iterables.ts'; import type {JSONValue, ReadonlyJSONValue} from '../../../shared/src/json.ts'; import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; @@ -334,8 +334,8 @@ export async function runBenchmarks( benchSpecs .flat() .filter(t => (only ? only.includes(t.name) : true)) - .map(({name, createQuery, generatePush}) => - summary(() => { + .forEach(({name, createQuery, generatePush}) => + describe(name, () => { makeBenchmark({ name, zqlSchema, @@ -348,23 +348,6 @@ export async function runBenchmarks( }); }), ); - - // Check if JSON output is requested via environment variable - const format = process.env.BENCH_OUTPUT_FORMAT; - - if (format === 'json') { - // Output JSON without samples for smaller, cleaner output - await run({ - format: { - json: { - samples: false, - debug: false, - }, - }, - }); - } else { - await run(); - } } export async function bootstrap({ diff --git a/turbo.json b/turbo.json index 5ee4aa7156..2c17832054 100644 --- a/turbo.json +++ b/turbo.json @@ -25,6 +25,15 @@ "check-types": { "dependsOn": ["^check-types", "build"], "outputs": [] + }, + "bench": { + "cache": false + }, + "bench:bmf": { + "cache": false + }, + "bench:bmf:silent": { + "cache": false } } } diff --git a/vitest.config.ts b/vitest.config.ts index f470ece8d5..8512e50cd2 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -28,6 +28,8 @@ function* getProjects(): Iterable { if (basePath === '' && name === 'vitest.config.ts') continue; // If any suffixed config exists in this dir, exclude the base config if (name === 'vitest.config.ts' && hasSuffixed) continue; + // Skip bench configs — those are run separately via `npm run bench` + if (name.includes('.bench')) continue; yield `${basePath}${name}`; } From bace8573feb69d91122c0328205b1e6806032f77 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 26 Mar 2026 16:08:44 +0100 Subject: [PATCH 176/495] feat: Make sure we test pg18 (#5690) --- .github/workflows/js.yml | 2 +- packages/z2s/vitest.config.pg-18.ts | 3 +++ packages/zero-cache/src/test/db.ts | 5 +++++ packages/zero-cache/test/pg-15.ts | 2 +- packages/zero-cache/test/pg-16.ts | 2 +- packages/zero-cache/test/pg-17.ts | 2 +- packages/zero-cache/test/pg-18.ts | 2 +- packages/zero-cache/vitest.config.ts | 3 ++- packages/zero-pg/vitest.config.pg-18.ts | 3 +++ packages/zero-server/vitest.config.pg-18.ts | 3 +++ packages/zql-benchmarks/vitest.config.pg-18.ts | 3 +++ packages/zql-integration-tests/vitest.config.pg-18.ts | 3 +++ 12 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 packages/z2s/vitest.config.pg-18.ts create mode 100644 packages/zero-pg/vitest.config.pg-18.ts create mode 100644 packages/zero-server/vitest.config.pg-18.ts create mode 100644 packages/zql-benchmarks/vitest.config.pg-18.ts create mode 100644 packages/zql-integration-tests/vitest.config.pg-18.ts diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index 40bf59e9fa..db7b7235df 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -120,7 +120,7 @@ jobs: needs: [format, lint, check-types] strategy: matrix: - pg-version: [17, 16, 15] + pg-version: [18, 17, 16, 15] env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: rocicorp diff --git a/packages/z2s/vitest.config.pg-18.ts b/packages/z2s/vitest.config.pg-18.ts new file mode 100644 index 0000000000..bbec73330d --- /dev/null +++ b/packages/z2s/vitest.config.pg-18.ts @@ -0,0 +1,3 @@ +import {configForVersion} from '../zero-cache/vitest.config.ts'; + +export default configForVersion(18, import.meta.url); diff --git a/packages/zero-cache/src/test/db.ts b/packages/zero-cache/src/test/db.ts index b1cb07fc0d..4a472a9d09 100644 --- a/packages/zero-cache/src/test/db.ts +++ b/packages/zero-cache/src/test/db.ts @@ -81,6 +81,11 @@ export class TestDBs { onNotice?.(n); defaultOnNotice(n); }, + // Ensure deterministic behavior for timestamp/date tests regardless + // of the server's timezone setting. This is sent as a startup parameter + // to every connection in the pool (unlike SET TIME ZONE which only + // affects a single connection). + connection: {TimeZone: 'UTC'}, ...(typeOpts ? postgresTypeConfig(typeOpts) : {}), }); this.#dbs[database] = db; diff --git a/packages/zero-cache/test/pg-15.ts b/packages/zero-cache/test/pg-15.ts index b615154145..24065c0c9c 100644 --- a/packages/zero-cache/test/pg-15.ts +++ b/packages/zero-cache/test/pg-15.ts @@ -1,3 +1,3 @@ import {runPostgresContainer} from './pg-container-setup.ts'; -export default runPostgresContainer('postgres:15.8-alpine3.20', 'UTC'); +export default runPostgresContainer('postgres:15-alpine', 'UTC'); diff --git a/packages/zero-cache/test/pg-16.ts b/packages/zero-cache/test/pg-16.ts index b0281e0520..fd7789b7e5 100644 --- a/packages/zero-cache/test/pg-16.ts +++ b/packages/zero-cache/test/pg-16.ts @@ -1,3 +1,3 @@ import {runPostgresContainer} from './pg-container-setup.ts'; -export default runPostgresContainer('postgres:16.4-alpine3.20', 'UTC'); +export default runPostgresContainer('postgres:16-alpine', 'UTC'); diff --git a/packages/zero-cache/test/pg-17.ts b/packages/zero-cache/test/pg-17.ts index 7353b7a878..7ebcc91661 100644 --- a/packages/zero-cache/test/pg-17.ts +++ b/packages/zero-cache/test/pg-17.ts @@ -1,3 +1,3 @@ import {runPostgresContainer} from './pg-container-setup.ts'; -export default runPostgresContainer('postgres:17.0-alpine3.20', 'UTC+1'); +export default runPostgresContainer('postgres:17-alpine', 'UTC+1'); diff --git a/packages/zero-cache/test/pg-18.ts b/packages/zero-cache/test/pg-18.ts index 04d5a3fde9..35b3fc85e7 100644 --- a/packages/zero-cache/test/pg-18.ts +++ b/packages/zero-cache/test/pg-18.ts @@ -1,3 +1,3 @@ import {runPostgresContainer} from './pg-container-setup.ts'; -export default runPostgresContainer('postgres:18.1-alpine3.23', 'UTC+1'); +export default runPostgresContainer('postgres:18-alpine', 'UTC+1'); diff --git a/packages/zero-cache/vitest.config.ts b/packages/zero-cache/vitest.config.ts index 198bf51d0c..a6b513d0ba 100644 --- a/packages/zero-cache/vitest.config.ts +++ b/packages/zero-cache/vitest.config.ts @@ -7,7 +7,7 @@ function nameFromURL(url: string) { } export function configForVersion(version: number, url: string) { - const TIMEOUT = (CI ? 2 : 1) * 20_000; + const TIMEOUT = (CI ? 2 : 1) * 30_000; const name = nameFromURL(url); const merged = mergeConfig(config, { test: { @@ -22,6 +22,7 @@ export function configForVersion(version: number, url: string) { }, testTimeout: TIMEOUT, hookTimeout: TIMEOUT, + slowTestThreshold: TIMEOUT / 10, }, }); // Override include to only pg tests (mergeConfig merges arrays, we want to replace) diff --git a/packages/zero-pg/vitest.config.pg-18.ts b/packages/zero-pg/vitest.config.pg-18.ts new file mode 100644 index 0000000000..bbec73330d --- /dev/null +++ b/packages/zero-pg/vitest.config.pg-18.ts @@ -0,0 +1,3 @@ +import {configForVersion} from '../zero-cache/vitest.config.ts'; + +export default configForVersion(18, import.meta.url); diff --git a/packages/zero-server/vitest.config.pg-18.ts b/packages/zero-server/vitest.config.pg-18.ts new file mode 100644 index 0000000000..bbec73330d --- /dev/null +++ b/packages/zero-server/vitest.config.pg-18.ts @@ -0,0 +1,3 @@ +import {configForVersion} from '../zero-cache/vitest.config.ts'; + +export default configForVersion(18, import.meta.url); diff --git a/packages/zql-benchmarks/vitest.config.pg-18.ts b/packages/zql-benchmarks/vitest.config.pg-18.ts new file mode 100644 index 0000000000..bbec73330d --- /dev/null +++ b/packages/zql-benchmarks/vitest.config.pg-18.ts @@ -0,0 +1,3 @@ +import {configForVersion} from '../zero-cache/vitest.config.ts'; + +export default configForVersion(18, import.meta.url); diff --git a/packages/zql-integration-tests/vitest.config.pg-18.ts b/packages/zql-integration-tests/vitest.config.pg-18.ts new file mode 100644 index 0000000000..bbec73330d --- /dev/null +++ b/packages/zql-integration-tests/vitest.config.pg-18.ts @@ -0,0 +1,3 @@ +import {configForVersion} from '../zero-cache/vitest.config.ts'; + +export default configForVersion(18, import.meta.url); From 09df7779846ca9a78835119d784081571178df06 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 26 Mar 2026 16:15:19 +0100 Subject: [PATCH 177/495] chore: update to syncpack@14 (#5694) --- .github/workflows/js.yml | 2 +- package-lock.json | 164 ++++++++++++++++++++++++++++++++++ package.json | 1 + packages/replicache/README.md | 2 +- packages/zero/package.json | 5 +- packages/zero/tool/release.ts | 2 +- 6 files changed, 171 insertions(+), 5 deletions(-) diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index db7b7235df..77ce2fc30a 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -22,7 +22,7 @@ jobs: with: node-version: 24.x cache: 'npm' - - run: npx syncpack@13 list-mismatches + - run: npx syncpack lint verify-deps: name: Verify Package Dependencies diff --git a/package-lock.json b/package-lock.json index 73f521ef7d..92c0a34bab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "oxlint": "^1.56.0", "oxlint-tsgolint": "^0.17.0", "prettier": "^3.8.1", + "syncpack": "^14.2.1", "tsx": "^4.21.0", "turbo": "^2.4.4", "vitest": "4.1.0" @@ -38116,6 +38117,168 @@ "node": ">=0.10.0" } }, + "node_modules/syncpack": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack/-/syncpack-14.2.1.tgz", + "integrity": "sha512-9CE0+MCThNPt0/yXD5cFaJQw2jxslaB3Ck1ASeP9uFji+lE3KWmfGRBzy8x5sjhygUz6Vt+a84w+ycIzATQicA==", + "dev": true, + "license": "MIT", + "bin": { + "syncpack": "index.cjs" + }, + "engines": { + "node": ">=14.17.0" + }, + "funding": { + "url": "https://github.com/sponsors/JamieMason" + }, + "optionalDependencies": { + "syncpack-darwin-arm64": "14.2.1", + "syncpack-darwin-x64": "14.2.1", + "syncpack-linux-arm64": "14.2.1", + "syncpack-linux-arm64-musl": "14.2.1", + "syncpack-linux-x64": "14.2.1", + "syncpack-linux-x64-musl": "14.2.1", + "syncpack-windows-arm64": "14.2.1", + "syncpack-windows-x64": "14.2.1" + } + }, + "node_modules/syncpack-darwin-arm64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack-darwin-arm64/-/syncpack-darwin-arm64-14.2.1.tgz", + "integrity": "sha512-SGrC163UWiL68TRo8rmPQFgbT83ieT7zQ1GKyoPZ3TAGNQ+6a/3GMXlZQ+HKV3ydVyB2t60H5CsQFlz13QHTqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://github.com/sponsors/JamieMason" + } + }, + "node_modules/syncpack-darwin-x64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack-darwin-x64/-/syncpack-darwin-x64-14.2.1.tgz", + "integrity": "sha512-ZqAJb4FEez3zpuOHUKZNSBWiYGH4FqmN5pI/AzM2N81oSGTYLaI+H4Wmi6rtZdQXRX2ZzQRs4lQrLTdmVv7oQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://github.com/sponsors/JamieMason" + } + }, + "node_modules/syncpack-linux-arm64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack-linux-arm64/-/syncpack-linux-arm64-14.2.1.tgz", + "integrity": "sha512-yjyG1v1lYBmWaD+aGXt4eovZ3k+d/nwHU8AZkFJh2jxBy6He2qTclR7+eI/BFcmiAehncbGNksYhL2h2RlC0Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://github.com/sponsors/JamieMason" + } + }, + "node_modules/syncpack-linux-arm64-musl": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack-linux-arm64-musl/-/syncpack-linux-arm64-musl-14.2.1.tgz", + "integrity": "sha512-vfopyN7ne++jnV4uAsoH8NHbio/6+yfdc9VfXt+9ZQiuR1AxtjT2Hylv6re5e6c1j0MPWaCRtaZBZhDUi0ZPdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://github.com/sponsors/JamieMason" + } + }, + "node_modules/syncpack-linux-x64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack-linux-x64/-/syncpack-linux-x64-14.2.1.tgz", + "integrity": "sha512-rfDzLxiJng7XIVShO7ygrAvrGdCloaKhMm2c4Q8blxVTHgSNcmL4cHRP/Zcvj7pmYGkwok6DtAetgxV47XpoGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://github.com/sponsors/JamieMason" + } + }, + "node_modules/syncpack-linux-x64-musl": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack-linux-x64-musl/-/syncpack-linux-x64-musl-14.2.1.tgz", + "integrity": "sha512-2/LMs6nFWPV2P0XOmMo63Erzv8OQ9skszXdalrhU2ilBO7f6B4sup6NsMKIXJeYHNso94TcLdAxyiGQ4sCdmTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://github.com/sponsors/JamieMason" + } + }, + "node_modules/syncpack-windows-arm64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack-windows-arm64/-/syncpack-windows-arm64-14.2.1.tgz", + "integrity": "sha512-T+qP9ERY8dg6HWAgFtxNKxp67EJ7CIstHeQ8jQAiSmKGNt+HEzzVCipSGMb9yu9SGjVQHuvn2wAf33LppYfivA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "funding": { + "url": "https://github.com/sponsors/JamieMason" + } + }, + "node_modules/syncpack-windows-x64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/syncpack-windows-x64/-/syncpack-windows-x64-14.2.1.tgz", + "integrity": "sha512-yoK6eHbzTgKuaL4dU/AFNaIHqRletqR8w5aBGBzdAY39n2MrNbfGVBUeDglRBYnSoE+PgLtqwbHULIlhPratPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "funding": { + "url": "https://github.com/sponsors/JamieMason" + } + }, "node_modules/tabbable": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", @@ -42614,6 +42777,7 @@ "expo-sqlite": ">=15", "replicache": "15.2.1", "shared": "0.0.0", + "syncpack": "^14.2.1", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", "typescript": "~5.9.3", diff --git a/package.json b/package.json index 744ec38c67..74dcdf6f48 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "oxlint": "^1.56.0", "oxlint-tsgolint": "^0.17.0", "prettier": "^3.8.1", + "syncpack": "^14.2.1", "tsx": "^4.21.0", "turbo": "^2.4.4", "vitest": "4.1.0" diff --git a/packages/replicache/README.md b/packages/replicache/README.md index b6263bb768..da801a90dc 100644 --- a/packages/replicache/README.md +++ b/packages/replicache/README.md @@ -53,7 +53,7 @@ npm install ```bash vim packages/replicache/package.json # Must be done in root of mono checkout -npx syncpack fix-mismatches +npx syncpack fix npm install npm run build git commit -a -m 'chore(replicache): Bump version to v$NEW_VERSION' diff --git a/packages/zero/package.json b/packages/zero/package.json index 5264d20d8f..283fe8a530 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -85,6 +85,7 @@ "expo-sqlite": ">=15", "replicache": "15.2.1", "shared": "0.0.0", + "syncpack": "^14.2.1", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", "typescript": "~5.9.3", @@ -100,8 +101,8 @@ "zqlite": "0.0.0" }, "peerDependencies": { - "expo-sqlite": ">=15", - "@op-engineering/op-sqlite": ">=15" + "@op-engineering/op-sqlite": ">=15", + "expo-sqlite": ">=15" }, "peerDependenciesMeta": { "expo-sqlite": { diff --git a/packages/zero/tool/release.ts b/packages/zero/tool/release.ts index d88060114a..d743a9d255 100644 --- a/packages/zero/tool/release.ts +++ b/packages/zero/tool/release.ts @@ -393,7 +393,7 @@ try { execute('npm install'); execute('npm run build'); execute('npm run format'); - execute('npx -y syncpack@13 fix-mismatches'); + execute('npx -y syncpack fix'); execute('git status'); From 9ab5b957907c48cb8c6878379539bfdf2263947a Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 17:45:32 +0100 Subject: [PATCH 178/495] Cache Playwright browser binaries in CI (#5693) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `playwright-install` downloads browser binaries (~7 min) on every run. Cache them. - Cache `~/.cache/ms-playwright` via `actions/cache@v4`, keyed on `runner.os` + Playwright version - On cache hit: skip browser download, only run `npx playwright install-deps` for system libraries - On cache miss: existing behavior (`npx playwright install --with-deps`) - Cache auto-invalidates on Playwright version bumps - Refactored the `playwright-install` action to only handle caching + install (removed `setup-node`/`npm ci` to avoid duplication since callers already have these) - Migrated `js.yml` and `perf-smoke.yml` from inline `npx playwright install` to use the cached action, ensuring all Playwright workflows benefit from caching --- 💬 Send tasks to Copilot coding agent from [Slack](https://gh.io/cca-slack-docs) and [Teams](https://gh.io/cca-teams-docs) to turn conversations into code. Copilot posts an update in your thread when it's finished. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arv <45845+arv@users.noreply.github.com> Co-authored-by: Erik Arvidsson --- .github/actions/playwright-install/action.yml | 23 +++++++++++++------ .github/workflows/bencher-benchmarks-pr.yml | 5 ++++ .github/workflows/bencher-benchmarks.yml | 5 ++++ .github/workflows/js.yml | 3 +-- .github/workflows/perf-smoke.yml | 3 +-- .github/workflows/perf-v2.js.yml | 5 ++++ 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/.github/actions/playwright-install/action.yml b/.github/actions/playwright-install/action.yml index 5e3af10ecb..e7b31061ed 100644 --- a/.github/actions/playwright-install/action.yml +++ b/.github/actions/playwright-install/action.yml @@ -1,15 +1,24 @@ name: 'Install Playwright' -description: 'Install Playwright browsers and system dependencies' +description: 'Install Playwright browsers and system dependencies with caching. Requires node and npm dependencies to be set up before use.' runs: using: 'composite' steps: - - uses: actions/setup-node@v6 - with: - node-version: 24.x - cache: 'npm' - - run: npm ci + - name: Get Playwright version + id: playwright-version + run: echo "version=$(npx playwright --version | awk '{print $NF}')" >> "$GITHUB_OUTPUT" shell: bash - - name: Install Playwright + - name: Cache Playwright browsers + id: playwright-cache + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: playwright-${{ runner.os }}-${{ steps.playwright-version.outputs.version }} + - name: Install Playwright browsers and system deps + if: steps.playwright-cache.outputs.cache-hit != 'true' run: npx playwright install --with-deps shell: bash + - name: Install Playwright system deps only + if: steps.playwright-cache.outputs.cache-hit == 'true' + run: npx playwright install-deps + shell: bash diff --git a/.github/workflows/bencher-benchmarks-pr.yml b/.github/workflows/bencher-benchmarks-pr.yml index 57990fed53..de256ab5ba 100644 --- a/.github/workflows/bencher-benchmarks-pr.yml +++ b/.github/workflows/bencher-benchmarks-pr.yml @@ -71,6 +71,11 @@ jobs: runs-on: self-hosted steps: - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: 24.x + cache: 'npm' + - run: npm ci - uses: ./.github/actions/playwright-install perf: diff --git a/.github/workflows/bencher-benchmarks.yml b/.github/workflows/bencher-benchmarks.yml index 2afbedef78..11a99ff12f 100644 --- a/.github/workflows/bencher-benchmarks.yml +++ b/.github/workflows/bencher-benchmarks.yml @@ -58,6 +58,11 @@ jobs: runs-on: self-hosted steps: - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: 24.x + cache: 'npm' + - run: npm ci - uses: ./.github/actions/playwright-install perf: diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index 77ce2fc30a..93433b8df8 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -109,8 +109,7 @@ jobs: node-version: 24.x cache: 'npm' - run: npm ci - - name: Install Playwright - run: npx playwright install chromium firefox webkit --with-deps + - uses: ./.github/actions/playwright-install - name: Run tests run: TEST_PG_MODE=nopg npm run test -- --shard=${{ matrix.shard }}/3 diff --git a/.github/workflows/perf-smoke.yml b/.github/workflows/perf-smoke.yml index 2b34d3f824..187e3c7a77 100644 --- a/.github/workflows/perf-smoke.yml +++ b/.github/workflows/perf-smoke.yml @@ -21,8 +21,7 @@ jobs: node-version: 24.x cache: 'npm' - run: npm ci - - name: Install Playwright - run: npx playwright install --with-deps + - uses: ./.github/actions/playwright-install - name: Run benchmark shell: bash working-directory: packages/replicache-perf diff --git a/.github/workflows/perf-v2.js.yml b/.github/workflows/perf-v2.js.yml index df1f80e327..4a070a39cd 100644 --- a/.github/workflows/perf-v2.js.yml +++ b/.github/workflows/perf-v2.js.yml @@ -13,6 +13,11 @@ jobs: runs-on: self-hosted steps: - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: 24.x + cache: 'npm' + - run: npm ci - uses: ./.github/actions/playwright-install benchmark: From e338032408209db35f5aff9e81a9d33419be68d3 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 19:45:29 +0100 Subject: [PATCH 179/495] Shard pg CI jobs into 2 parallel shards per version (#5697) The `test-pg` job ran each PostgreSQL version as a single serial job, making it the slowest part of CI. This adds a `shard` dimension to the matrix, splitting each version's test run across 2 parallel runners (8 total jobs instead of 4). ## Changes - **`test-pg` matrix**: Added `shard: [1, 2]` alongside `pg-version` - **Job name**: `Test PG ${{ matrix.pg-version }} (Shard ${{ matrix.shard }}/2)` - **Test command**: `npm run test -- --shard=${{ matrix.shard }}/2` Mirrors the existing sharding pattern already used by the non-pg `test` job. --- .github/workflows/js.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index 93433b8df8..4ecb9480d9 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -114,12 +114,13 @@ jobs: run: TEST_PG_MODE=nopg npm run test -- --shard=${{ matrix.shard }}/3 test-pg: - name: Test PG ${{ matrix.pg-version }} + name: Test PG ${{ matrix.pg-version }} (Shard ${{ matrix.shard }}/2) runs-on: ubuntu-latest needs: [format, lint, check-types] strategy: matrix: pg-version: [18, 17, 16, 15] + shard: [1, 2] env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: rocicorp @@ -133,4 +134,4 @@ jobs: cache: 'npm' - run: npm ci - name: Run tests - run: TEST_PG_MODE=pg-${{ matrix.pg-version }} npm run test + run: TEST_PG_MODE=pg-${{ matrix.pg-version }} npm run test -- --shard=${{ matrix.shard }}/2 From fc9fc2154b373a39e0d9c56f3bf863b51338d1ae Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Thu, 26 Mar 2026 14:44:57 -0400 Subject: [PATCH 180/495] feat(zql): add Cap operator for EXISTS pipelines (#5661) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces the `Cap` operator, an alternative to `Take` for EXISTS subquery pipelines. This eliminates SQLite's need to create temporary B-trees for ORDER BY in EXISTS child pipelines, where only row existence matters — not order. **Key changes:** - **`Cap` operator** (`cap.ts`): Count-based limiter that tracks membership by primary key set rather than sorted bounds. No comparator, no `start`/`reverse` fetch support needed. - **Unordered source connections**: `Source.connect()` now accepts `sort: undefined`. `MemorySource` falls back to primary key ordering internally while exposing `schema.sort = undefined` to downstream operators. - **Unordered overlay generators**: New `generateWithOverlayUnordered` variants in both `memory-source.ts`, `table-source.ts`, and `join-utils.ts` that inject/suppress rows by PK match without requiring sorted iteration. - **Builder integration** (`builder.ts`): EXISTS child pipelines now pass `isExistsChild` flag, connecting sources without ordering and using `Cap` instead of `Take`. - **Schema change**: `SourceSchema.sort` is now optional (`Ordering | undefined`), reflecting that not all pipelines are ordered. - **Guard rails**: `Take`, `Skip`, and `UnionFanIn` now assert that their input is sorted, catching misuse early. - **Query builder** (`query-builder.ts`): `buildSelectQuery` omits `ORDER BY` when no ordering is specified. **Tests:** - `cap.push.test.ts` - join-utils unordered overlay tests (`join-utils.test.ts`) - Unordered MemorySource tests - Integration tests (`cap.pg.test.ts`) testing various overlay configurations ``` ┌─────────────────────────────────────────┬─────────────┬─────────────┬─────────────┐ │ Benchmark │ main (Take) │ cap-2 (Cap) │ Delta │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ exists(album) where title - unplanned │ 11.13 ms │ 10.44 ms │ -6% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ exists(album) where title - planned │ 76.37 us │ 77.77 us │ +2% (noise) │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ exists(album).exists(genre) - unplanned │ 15.53 ms │ 13.49 ms │ -13% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ exists(album).exists(genre) - planned │ 15.23 ms │ 13.38 ms │ -12% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ exists w/filters - unplanned │ 10.92 ms │ 10.13 ms │ -7% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ exists w/filters - planned │ 101.99 us │ 101.72 us │ ~0% (noise) │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ playlist.exists(tracks) - unplanned │ 977.91 us │ 814.73 us │ -17% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ playlist.exists(tracks) - planned │ 960.68 us │ 798.66 us │ -17% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ track.exists(playlists) - unplanned │ 159.29 ms │ 142.05 ms │ -11% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ track.exists(playlists) - planned │ 159.82 ms │ 143.35 ms │ -10% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ exists OR - unplanned │ 13.52 ms │ 12.26 ms │ -9% │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ exists OR - planned │ 3.45 ms │ 3.44 ms │ ~0% (noise) │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ manual: flipped (related) │ 97.59 us │ 98.89 us │ ~0% (noise) │ ├─────────────────────────────────────────┼─────────────┼─────────────┼─────────────┤ │ manual: not flipped (whereExists) │ 14.25 ms │ 13.55 ms │ -5% │ └─────────────────────────────────────────┴─────────────┴─────────────┴─────────────┘ ``` --- .gitignore | 2 + .../zql-integration-tests/src/cap.pg.test.ts | 309 +++++ .../src/chinook/planner-exec.pg.test.ts | 14 +- .../src/discord-repro.pg.test.ts | 10 +- .../src/pagila/planner-exec.pg.test.ts | 8 +- packages/zql/src/builder/builder.ts | 51 +- packages/zql/src/ivm/cap.push.test.ts | 1075 +++++++++++++++++ packages/zql/src/ivm/cap.ts | 333 +++++ packages/zql/src/ivm/join-utils.test.ts | 377 ++++++ packages/zql/src/ivm/join-utils.ts | 65 + packages/zql/src/ivm/join.ts | 11 +- packages/zql/src/ivm/memory-source.test.ts | 211 ++++ packages/zql/src/ivm/memory-source.ts | 98 +- packages/zql/src/ivm/schema.ts | 2 +- packages/zql/src/ivm/skip.ts | 3 + packages/zql/src/ivm/source.ts | 2 +- packages/zql/src/ivm/take.ts | 13 +- packages/zql/src/ivm/union-fan-in.ts | 1 + packages/zql/src/query/test/test-schemas.ts | 5 + packages/zqlite/src/query-builder.ts | 9 +- packages/zqlite/src/table-source.ts | 78 +- 21 files changed, 2608 insertions(+), 69 deletions(-) create mode 100644 packages/zql-integration-tests/src/cap.pg.test.ts create mode 100644 packages/zql/src/ivm/cap.push.test.ts create mode 100644 packages/zql/src/ivm/cap.ts create mode 100644 packages/zql/src/ivm/join-utils.test.ts diff --git a/.gitignore b/.gitignore index 35b8c404b1..2fc62b05c4 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,5 @@ bun.lock .claude/ packages/zql-integration-tests/Chinook_Sqlite.sqlite + +*.ignore.* diff --git a/packages/zql-integration-tests/src/cap.pg.test.ts b/packages/zql-integration-tests/src/cap.pg.test.ts new file mode 100644 index 0000000000..7100c30578 --- /dev/null +++ b/packages/zql-integration-tests/src/cap.pg.test.ts @@ -0,0 +1,309 @@ +import {consoleLogSink, LogContext} from '@rocicorp/logger'; +import {beforeAll, expect, test} from 'vitest'; +import {testLogConfig} from '../../otel/src/test-log-config.ts'; +import {createSilentLogContext} from '../../shared/src/logging-test-utils.ts'; +import {must} from '../../shared/src/must.ts'; +import {initialSync} from '../../zero-cache/src/services/change-source/pg/initial-sync.ts'; +import {getConnectionURI, testDBs} from '../../zero-cache/src/test/db.ts'; +import type {PostgresDB} from '../../zero-cache/src/types/pg.ts'; +import {consume} from '../../zql/src/ivm/stream.ts'; +import type {QueryDelegate} from '../../zql/src/query/query-delegate.ts'; +import {newQuery} from '../../zql/src/query/query-impl.ts'; +import type {Query} from '../../zql/src/query/query.ts'; +import {createTableSQL, schema} from '../../zql/src/query/test/test-schemas.ts'; +import {Database} from '../../zqlite/src/db.ts'; +import {newQueryDelegate} from '../../zqlite/src/test/source-factory.ts'; + +const lc = createSilentLogContext(); + +let pg: PostgresDB; +let sqlite: Database; +type Schema = typeof schema; +let issueQuery: Query<'issue', Schema>; +let queryDelegate: QueryDelegate; + +beforeAll(async () => { + pg = await testDBs.create('cap-integration'); + await pg.unsafe(createTableSQL); + sqlite = new Database(lc, ':memory:'); + + await pg.unsafe(/*sql*/ ` + INSERT INTO "users" ("id", "name") VALUES + ('user1', 'User 1'); + + INSERT INTO "issues" ("id", "title", "description", "closed", "owner_id", "createdAt") VALUES + ('issue1', 'Issue 1', 'Desc 1', false, 'user1', TIMESTAMPTZ '2001-01-01T00:00:00.000Z'), + ('issue2', 'Issue 2', 'Desc 2', false, 'user1', TIMESTAMPTZ '2001-01-02T00:00:00.000Z'), + ('issue3', 'Issue 3', 'Desc 3', false, 'user1', TIMESTAMPTZ '2001-01-03T00:00:00.000Z'), + ('issue4', 'Issue 4', 'Desc 4', false, 'user1', TIMESTAMPTZ '2001-01-04T00:00:00.000Z'); + + -- issue1: no comments (excluded by EXISTS) + -- issue2: 1 comment (below cap of 3) + INSERT INTO "comments" ("id", "authorId", "issue_id", "text", "createdAt") VALUES + ('c2a', 'user1', 'issue2', 'Comment 2a', TIMESTAMP '2002-01-01 00:00:00'); + + -- issue3: 3 comments (at cap limit) + INSERT INTO "comments" ("id", "authorId", "issue_id", "text", "createdAt") VALUES + ('c3a', 'user1', 'issue3', 'Comment 3a', TIMESTAMP '2002-02-01 00:00:00'), + ('c3b', 'user1', 'issue3', 'Comment 3b', TIMESTAMP '2002-02-02 00:00:00'), + ('c3c', 'user1', 'issue3', 'Comment 3c', TIMESTAMP '2002-02-03 00:00:00'); + + -- issue4: 5 comments (3 tracked + 2 overflow) + INSERT INTO "comments" ("id", "authorId", "issue_id", "text", "createdAt") VALUES + ('c4a', 'user1', 'issue4', 'Comment 4a', TIMESTAMP '2002-03-01 00:00:00'), + ('c4b', 'user1', 'issue4', 'Comment 4b', TIMESTAMP '2002-03-02 00:00:00'), + ('c4c', 'user1', 'issue4', 'Comment 4c', TIMESTAMP '2002-03-03 00:00:00'), + ('c4d', 'user1', 'issue4', 'Comment 4d', TIMESTAMP '2002-03-04 00:00:00'), + ('c4e', 'user1', 'issue4', 'Comment 4e', TIMESTAMP '2002-03-05 00:00:00'); + `); + + await initialSync( + new LogContext('debug', {}, consoleLogSink), + {appID: 'cap_integration', shardNum: 0, publications: []}, + sqlite, + getConnectionURI(pg), + {tableCopyWorkers: 1}, + {}, + ); + + queryDelegate = newQueryDelegate(lc, testLogConfig, sqlite, schema); + issueQuery = newQuery(schema, 'issue'); +}); + +function makeQuery() { + return issueQuery.whereExists('comments').related('comments'); +} + +test('initial materialization — issue1 excluded, issue2/3/4 included', () => { + const q = makeQuery(); + const view = queryDelegate.materialize(q); + const data = view.data as ReadonlyArray<{ + readonly id: string; + readonly comments: ReadonlyArray<{readonly id: string}>; + }>; + + // issue1 has no comments → excluded by EXISTS + const ids = data.map(r => r.id); + expect(ids).not.toContain('issue1'); + expect(ids).toContain('issue2'); + expect(ids).toContain('issue3'); + expect(ids).toContain('issue4'); + + // issue4 has all 5 comments in related (Cap only affects EXISTS child, not related) + const issue4 = must(data.find(r => r.id === 'issue4')); + expect(issue4.comments).toHaveLength(5); + + expect(view.data).toEqual(queryDelegate.materialize(q).data); +}); + +test('add comment to commentless issue → issue appears', () => { + const q = makeQuery(); + const view = queryDelegate.materialize(q); + + consume( + must(queryDelegate.getSource('comments')).push({ + type: 'add', + row: { + id: 'c1a', + authorId: 'user1', + issue_id: 'issue1', + text: 'Comment 1a', + createdAt: 1100000000000, + }, + }), + ); + + const data = view.data as ReadonlyArray<{readonly id: string}>; + expect(data.map(r => r.id)).toContain('issue1'); + + expect(view.data).toEqual(queryDelegate.materialize(q).data); +}); + +test('add beyond cap limit → issue stays, related shows all', () => { + const q = makeQuery(); + const view = queryDelegate.materialize(q); + + // issue3 had 3 comments (at cap). Add a 4th. + consume( + must(queryDelegate.getSource('comments')).push({ + type: 'add', + row: { + id: 'c3d', + authorId: 'user1', + issue_id: 'issue3', + text: 'Comment 3d', + createdAt: 1100000001000, + }, + }), + ); + + const data = view.data as ReadonlyArray<{ + readonly id: string; + readonly comments: ReadonlyArray<{readonly id: string}>; + }>; + expect(data.map(r => r.id)).toContain('issue3'); + + // Related shows all 4 comments + const issue3 = must(data.find(r => r.id === 'issue3')); + expect(issue3.comments).toHaveLength(4); + + expect(view.data).toEqual(queryDelegate.materialize(q).data); +}); + +test('remove tracked comment with overflow → issue stays', () => { + const q = makeQuery(); + const view = queryDelegate.materialize(q); + + // issue4 has 5 comments. Remove c4a (tracked by cap). Cap refills from overflow. + consume( + must(queryDelegate.getSource('comments')).push({ + type: 'remove', + row: { + id: 'c4a', + authorId: 'user1', + issue_id: 'issue4', + text: 'Comment 4a', + createdAt: 1015027200000, + }, + }), + ); + + const data = view.data as ReadonlyArray<{readonly id: string}>; + expect(data.map(r => r.id)).toContain('issue4'); + + expect(view.data).toEqual(queryDelegate.materialize(q).data); +}); + +test('remove untracked overflow comment → issue stays', () => { + const q = makeQuery(); + const view = queryDelegate.materialize(q); + + // Remove c4e (overflow, not tracked by cap) + consume( + must(queryDelegate.getSource('comments')).push({ + type: 'remove', + row: { + id: 'c4e', + authorId: 'user1', + issue_id: 'issue4', + text: 'Comment 4e', + createdAt: 1015372800000, + }, + }), + ); + + const data = view.data as ReadonlyArray<{readonly id: string}>; + expect(data.map(r => r.id)).toContain('issue4'); + + expect(view.data).toEqual(queryDelegate.materialize(q).data); +}); + +test('remove only comment → issue disappears', () => { + const q = makeQuery(); + const view = queryDelegate.materialize(q); + + // Remove c1a from issue1 (the only comment, added in test 2) + consume( + must(queryDelegate.getSource('comments')).push({ + type: 'remove', + row: { + id: 'c1a', + authorId: 'user1', + issue_id: 'issue1', + text: 'Comment 1a', + createdAt: 1100000000000, + }, + }), + ); + + const data = view.data as ReadonlyArray<{readonly id: string}>; + expect(data.map(r => r.id)).not.toContain('issue1'); + + expect(view.data).toEqual(queryDelegate.materialize(q).data); +}); + +test('re-add comment → issue reappears', () => { + const q = makeQuery(); + const view = queryDelegate.materialize(q); + + consume( + must(queryDelegate.getSource('comments')).push({ + type: 'add', + row: { + id: 'c1b', + authorId: 'user1', + issue_id: 'issue1', + text: 'Comment 1b', + createdAt: 1100000002000, + }, + }), + ); + + const data = view.data as ReadonlyArray<{readonly id: string}>; + expect(data.map(r => r.id)).toContain('issue1'); + + expect(view.data).toEqual(queryDelegate.materialize(q).data); +}); + +test('join-level unordered overlay — remove comment triggers overlay for multiple parent issues', () => { + // Uses ownerComments: issue.ownerId = comment.authorId + // All 4 issues have ownerId='user1', all comments have authorId='user1' + // So a single comment change matches ALL 4 issues as parents. + // With flip: false, the planner builds a regular Join + Cap(limit=3, unordered). + // When Cap pushes a remove+refill to Join, Join iterates all 4 parent issues, + // and for issues 2-4, generateWithOverlayUnordered (join-utils.ts) is called. + const q = issueQuery.whereExists('ownerComments', {flip: false}); + const view = queryDelegate.materialize(q); + + // All 4 issues should be present (all have ownerComments via ownerId='user1') + const initialData = view.data as ReadonlyArray<{readonly id: string}>; + const initialIds = initialData.map(r => r.id); + expect(initialIds).toContain('issue1'); + expect(initialIds).toContain('issue2'); + expect(initialIds).toContain('issue3'); + expect(initialIds).toContain('issue4'); + + expect(view.data).toEqual(queryDelegate.materialize(q).data); + + // Remove comments to ensure we hit a tracked one. + // Cap tracks the first 3 it encounters (unordered). Removing multiple + // guarantees at least one hits a tracked comment, triggering Cap refill → Join overlay. + // After prior tests, the remaining comments are: + // c1b (issue1), c2a (issue2), c3a/c3b/c3c/c3d (issue3), c4b/c4c/c4d (issue4) + const commentsToRemove = [ + { + id: 'c2a', + authorId: 'user1', + issue_id: 'issue2', + text: 'Comment 2a', + createdAt: 1009843200000, + }, + { + id: 'c3a', + authorId: 'user1', + issue_id: 'issue3', + text: 'Comment 3a', + createdAt: 1012521600000, + }, + { + id: 'c3b', + authorId: 'user1', + issue_id: 'issue3', + text: 'Comment 3b', + createdAt: 1012608000000, + }, + { + id: 'c4b', + authorId: 'user1', + issue_id: 'issue4', + text: 'Comment 4b', + createdAt: 1015113600000, + }, + ]; + + const source = must(queryDelegate.getSource('comments')); + for (const row of commentsToRemove) { + consume(source.push({type: 'remove', row})); + expect(view.data).toEqual(queryDelegate.materialize(q).data); + } +}); diff --git a/packages/zql-integration-tests/src/chinook/planner-exec.pg.test.ts b/packages/zql-integration-tests/src/chinook/planner-exec.pg.test.ts index 83ad9a9c59..0165bd7b11 100644 --- a/packages/zql-integration-tests/src/chinook/planner-exec.pg.test.ts +++ b/packages/zql-integration-tests/src/chinook/planner-exec.pg.test.ts @@ -224,13 +224,13 @@ describe('Chinook planner execution cost validation', () => { .limit(15), validations: [ ['correlation', 0], - ['within-optimal', 1.7], - ['within-baseline', 1.7], + ['within-optimal', 1.75], + ['within-baseline', 1.75], ], extraIndexValidations: [ ['correlation', 0], - ['within-optimal', 1.7], - ['within-baseline', 1.7], + ['within-optimal', 1.75], + ['within-baseline', 1.75], ], }, @@ -255,7 +255,7 @@ describe('Chinook planner execution cost validation', () => { extraIndexValidations: [ ['correlation', 0.8], ['within-optimal', 1], - ['within-baseline', 0.025], + ['within-baseline', 0.04], ], }, @@ -425,12 +425,12 @@ describe('Chinook planner execution cost validation', () => { .where('name', 'LIKE', 'Music%') .whereExists('tracks', t => t.where('name', 'LIKE', 'A%')), validations: [ - ['correlation', 0.8], + ['correlation', 0.4], ['within-optimal', 1], ['within-baseline', 1], ], extraIndexValidations: [ - ['correlation', 0.8], + ['correlation', 0.4], ['within-optimal', 1], ['within-baseline', 1], ], diff --git a/packages/zql-integration-tests/src/discord-repro.pg.test.ts b/packages/zql-integration-tests/src/discord-repro.pg.test.ts index b9046caa7c..9f2c01d353 100644 --- a/packages/zql-integration-tests/src/discord-repro.pg.test.ts +++ b/packages/zql-integration-tests/src/discord-repro.pg.test.ts @@ -116,19 +116,19 @@ test('discord report https://discord.com/channels/830183651022471199/13475501749 title: 'Test Issue 1', description: 'Description for issue 1', closed: false, - ownerId: 'user1', + owner_id: 'user1', + createdAt: 982355920000, }, row: { id: 'issue1', title: 'Test Issue 1', description: 'Description for issue 1', closed: true, - ownerId: 'user1', + owner_id: 'user1', + createdAt: 982355920000, }, }), ); - expect(mapResultToClientNames(view.data, schema, 'issue')).toEqual( - queryDelegate.materialize(q).data, - ); + expect(view.data).toEqual(queryDelegate.materialize(q).data); }); diff --git a/packages/zql-integration-tests/src/pagila/planner-exec.pg.test.ts b/packages/zql-integration-tests/src/pagila/planner-exec.pg.test.ts index f40ebcd2e1..5a419d5952 100644 --- a/packages/zql-integration-tests/src/pagila/planner-exec.pg.test.ts +++ b/packages/zql-integration-tests/src/pagila/planner-exec.pg.test.ts @@ -71,9 +71,9 @@ describe('Pagila planner execution cost validation', () => { a.where('lastName', 'GUINESS'), ), validations: [ - ['correlation', 0.4], + ['correlation', 0.2], ['within-optimal', 1], - ['within-baseline', 0.013], + ['within-baseline', 0.025], ], }, @@ -95,9 +95,9 @@ describe('Pagila planner execution cost validation', () => { .whereExists('actors', a => a.where('lastName', 'GUINESS')) .whereExists('categories', c => c.where('name', 'Action')), validations: [ - ['correlation', -0.08], + ['correlation', -0.09], ['within-optimal', 1], - ['within-baseline', 0.04], + ['within-baseline', 0.07], ], }, diff --git a/packages/zql/src/builder/builder.ts b/packages/zql/src/builder/builder.ts index f399ab95c0..ac33a94476 100644 --- a/packages/zql/src/builder/builder.ts +++ b/packages/zql/src/builder/builder.ts @@ -32,6 +32,7 @@ import {Join} from '../ivm/join.ts'; import type {Input, InputBase, Storage} from '../ivm/operator.ts'; import {Skip} from '../ivm/skip.ts'; import type {Source, SourceInput} from '../ivm/source.ts'; +import {Cap} from '../ivm/cap.ts'; import {Take} from '../ivm/take.ts'; import {UnionFanIn} from '../ivm/union-fan-in.ts'; import {UnionFanOut} from '../ivm/union-fan-out.ts'; @@ -258,6 +259,7 @@ function buildPipelineInternal( queryID: string, name: string, partitionKey?: CompoundKey, + isNonFlippedExistsChild?: boolean | undefined, ): Input { const source = delegate.getSource(ast.table); if (!source) { @@ -288,8 +290,18 @@ function buildPipelineInternal( } } } + if (isNonFlippedExistsChild) { + assert(ast.start === undefined, 'EXISTS subqueries must not have start'); + assert( + ast.related === undefined, + 'EXISTS subqueries must not have related', + ); + } + const conn = source.connect( - must(ast.orderBy), + // exists pipelines are unordered — orderBy is ignored here. + // Non-exists pipelines always have orderBy completed with PKs. + isNonFlippedExistsChild ? undefined : must(ast.orderBy), ast.where, splitEditKeys, delegate.debug, @@ -333,15 +345,32 @@ function buildPipelineInternal( } if (ast.limit !== undefined) { - const takeName = `${name}:take`; - const take = new Take( - end, - delegate.createStorage(takeName), - ast.limit, - partitionKey, - ); - delegate.addEdge(end, take); - end = delegate.decorateInput(take, takeName); + // We end `exists` pipelines with `cap` + // The reason is that `cap` does not care about the order of the pipeline. + // This allows SQLite to chose the order and never end up creating temp b-trees. + // The problem with SQLite creating a temp b-tree is it will incur a scan of the entire + // result set where exists only needs the first row. + if (isNonFlippedExistsChild) { + const capName = `${name}:cap`; + const cap = new Cap( + end, + delegate.createStorage(capName), + ast.limit, + partitionKey, + ); + delegate.addEdge(end, cap); + end = delegate.decorateInput(cap, capName); + } else { + const takeName = `${name}:take`; + const take = new Take( + end, + delegate.createStorage(takeName), + ast.limit, + partitionKey, + ); + delegate.addEdge(end, take); + end = delegate.decorateInput(take, takeName); + } } if (ast.related) { @@ -455,6 +484,7 @@ function applyFilterWithFlips( '', `${name}.${sq.subquery.alias}`, sq.correlation.childField, + false, ); const flippedJoin = new FlippedJoin({ parent: end, @@ -629,6 +659,7 @@ function applyCorrelatedSubQuery( queryID, `${name}.${sq.subquery.alias}`, sq.correlation.childField, + fromCondition, ); const joinName = `${name}:join(${sq.subquery.alias})`; diff --git a/packages/zql/src/ivm/cap.push.test.ts b/packages/zql/src/ivm/cap.push.test.ts new file mode 100644 index 0000000000..1cd1d518ce --- /dev/null +++ b/packages/zql/src/ivm/cap.push.test.ts @@ -0,0 +1,1075 @@ +import {expect, suite, test} from 'vitest'; +import { + runPushTest, + type SourceContents, + type Sources, +} from './test/fetch-and-push-tests.ts'; +import type {Format} from './view.ts'; +import type {AST} from '../../../zero-protocol/src/ast.ts'; + +suite('Cap push - basic behavior', () => { + const sources: Sources = { + issue: { + columns: { + id: {type: 'string'}, + text: {type: 'string'}, + }, + primaryKeys: ['id'], + }, + comment: { + columns: { + id: {type: 'string'}, + issueID: {type: 'string'}, + text: {type: 'string'}, + }, + primaryKeys: ['id'], + }, + }; + + const ast: AST = { + table: 'issue', + orderBy: [['id', 'asc']], + where: { + type: 'correlatedSubquery', + related: { + system: 'client', + correlation: {parentField: ['id'], childField: ['issueID']}, + subquery: { + table: 'comment', + alias: 'comments', + orderBy: [['id', 'asc']], + }, + }, + op: 'EXISTS', + }, + } as const; + + const format: Format = { + singular: false, + relationships: { + comments: { + singular: false, + relationships: {}, + }, + }, + }; + + test('child add below cap limit is forwarded', () => { + const sourceContents: SourceContents = { + issue: [{id: 'i1', text: 'i1'}], + comment: [{id: 'c1', issueID: 'i1', text: 'c1'}], + }; + const {log, data, actualStorage, pushes} = runPushTest({ + sources, + sourceContents, + ast, + format, + pushes: [ + [ + 'comment', + { + type: 'add', + row: {id: 'c2', issueID: 'i1', text: 'c2'}, + }, + ], + ], + }); + + expect(data).toMatchInlineSnapshot(` + [ + { + "comments": [ + { + "id": "c1", + "issueID": "i1", + "text": "c1", + Symbol(rc): 1, + }, + { + "id": "c2", + "issueID": "i1", + "text": "c2", + Symbol(rc): 1, + }, + ], + "id": "i1", + "text": "i1", + Symbol(rc): 1, + }, + ] + `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` + { + "["cap","i1"]": { + "pks": [ + "["c1"]", + "["c2"]", + ], + "size": 2, + }, + } + `); + expect(log.filter(msg => msg[0] === '.comments:cap')) + .toMatchInlineSnapshot(` + [ + [ + ".comments:cap", + "push", + { + "row": { + "id": "c2", + "issueID": "i1", + "text": "c2", + }, + "type": "add", + }, + ], + [ + ".comments:cap", + "fetch", + { + "constraint": { + "issueID": "i1", + }, + }, + ], + ] + `); + expect(pushes).toMatchInlineSnapshot(` + [ + { + "child": { + "change": { + "node": { + "relationships": {}, + "row": { + "id": "c2", + "issueID": "i1", + "text": "c2", + }, + }, + "type": "add", + }, + "relationshipName": "comments", + }, + "row": { + "id": "i1", + "text": "i1", + }, + "type": "child", + }, + ] + `); + }); + + test('child add at cap limit is dropped', () => { + const sourceContents: SourceContents = { + issue: [{id: 'i1', text: 'i1'}], + comment: [ + {id: 'c1', issueID: 'i1', text: 'c1'}, + {id: 'c2', issueID: 'i1', text: 'c2'}, + {id: 'c3', issueID: 'i1', text: 'c3'}, + ], + }; + const {log, data, actualStorage, pushes} = runPushTest({ + sources, + sourceContents, + ast, + format, + pushes: [ + [ + 'comment', + { + type: 'add', + row: {id: 'c4', issueID: 'i1', text: 'c4'}, + }, + ], + ], + }); + + expect(data).toMatchInlineSnapshot(` + [ + { + "comments": [ + { + "id": "c1", + "issueID": "i1", + "text": "c1", + Symbol(rc): 1, + }, + { + "id": "c2", + "issueID": "i1", + "text": "c2", + Symbol(rc): 1, + }, + { + "id": "c3", + "issueID": "i1", + "text": "c3", + Symbol(rc): 1, + }, + ], + "id": "i1", + "text": "i1", + Symbol(rc): 1, + }, + ] + `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` + { + "["cap","i1"]": { + "pks": [ + "["c1"]", + "["c2"]", + "["c3"]", + ], + "size": 3, + }, + } + `); + expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( + `[]`, + ); + expect(pushes).toMatchInlineSnapshot(`[]`); + }); + + test('child remove with refill', () => { + const sourceContents: SourceContents = { + issue: [{id: 'i1', text: 'i1'}], + comment: [ + {id: 'c1', issueID: 'i1', text: 'c1'}, + {id: 'c2', issueID: 'i1', text: 'c2'}, + {id: 'c3', issueID: 'i1', text: 'c3'}, + {id: 'c4', issueID: 'i1', text: 'c4'}, + ], + }; + const {log, data, actualStorage, pushes} = runPushTest({ + sources, + sourceContents, + ast, + format, + pushes: [ + [ + 'comment', + { + type: 'remove', + row: {id: 'c2', issueID: 'i1', text: 'c2'}, + }, + ], + ], + }); + + expect(data).toMatchInlineSnapshot(` + [ + { + "comments": [ + { + "id": "c1", + "issueID": "i1", + "text": "c1", + Symbol(rc): 1, + }, + { + "id": "c3", + "issueID": "i1", + "text": "c3", + Symbol(rc): 1, + }, + { + "id": "c4", + "issueID": "i1", + "text": "c4", + Symbol(rc): 1, + }, + ], + "id": "i1", + "text": "i1", + Symbol(rc): 1, + }, + ] + `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` + { + "["cap","i1"]": { + "pks": [ + "["c1"]", + "["c3"]", + "["c4"]", + ], + "size": 3, + }, + } + `); + expect(log.filter(msg => msg[0] === '.comments:cap')) + .toMatchInlineSnapshot(` + [ + [ + ".comments:cap", + "push", + { + "row": { + "id": "c2", + "issueID": "i1", + "text": "c2", + }, + "type": "remove", + }, + ], + [ + ".comments:cap", + "fetch", + { + "constraint": { + "issueID": "i1", + }, + }, + ], + [ + ".comments:cap", + "push", + { + "row": { + "id": "c4", + "issueID": "i1", + "text": "c4", + }, + "type": "add", + }, + ], + [ + ".comments:cap", + "fetch", + { + "constraint": { + "issueID": "i1", + }, + }, + ], + ] + `); + expect(pushes).toMatchInlineSnapshot(` + [ + { + "child": { + "change": { + "node": { + "relationships": {}, + "row": { + "id": "c2", + "issueID": "i1", + "text": "c2", + }, + }, + "type": "remove", + }, + "relationshipName": "comments", + }, + "row": { + "id": "i1", + "text": "i1", + }, + "type": "child", + }, + { + "child": { + "change": { + "node": { + "relationships": {}, + "row": { + "id": "c4", + "issueID": "i1", + "text": "c4", + }, + }, + "type": "add", + }, + "relationshipName": "comments", + }, + "row": { + "id": "i1", + "text": "i1", + }, + "type": "child", + }, + ] + `); + }); + + test('child remove without refill', () => { + const sourceContents: SourceContents = { + issue: [{id: 'i1', text: 'i1'}], + comment: [ + {id: 'c1', issueID: 'i1', text: 'c1'}, + {id: 'c2', issueID: 'i1', text: 'c2'}, + ], + }; + const {log, data, actualStorage, pushes} = runPushTest({ + sources, + sourceContents, + ast, + format, + pushes: [ + [ + 'comment', + { + type: 'remove', + row: {id: 'c1', issueID: 'i1', text: 'c1'}, + }, + ], + ], + }); + + expect(data).toMatchInlineSnapshot(` + [ + { + "comments": [ + { + "id": "c2", + "issueID": "i1", + "text": "c2", + Symbol(rc): 1, + }, + ], + "id": "i1", + "text": "i1", + Symbol(rc): 1, + }, + ] + `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` + { + "["cap","i1"]": { + "pks": [ + "["c2"]", + ], + "size": 1, + }, + } + `); + expect(log.filter(msg => msg[0] === '.comments:cap')) + .toMatchInlineSnapshot(` + [ + [ + ".comments:cap", + "push", + { + "row": { + "id": "c1", + "issueID": "i1", + "text": "c1", + }, + "type": "remove", + }, + ], + [ + ".comments:cap", + "fetch", + { + "constraint": { + "issueID": "i1", + }, + }, + ], + ] + `); + expect(pushes).toMatchInlineSnapshot(` + [ + { + "child": { + "change": { + "node": { + "relationships": {}, + "row": { + "id": "c1", + "issueID": "i1", + "text": "c1", + }, + }, + "type": "remove", + }, + "relationshipName": "comments", + }, + "row": { + "id": "i1", + "text": "i1", + }, + "type": "child", + }, + ] + `); + }); + + test('child remove of last row causes parent retraction', () => { + const sourceContents: SourceContents = { + issue: [{id: 'i1', text: 'i1'}], + comment: [{id: 'c1', issueID: 'i1', text: 'c1'}], + }; + const {log, data, actualStorage, pushes} = runPushTest({ + sources, + sourceContents, + ast, + format, + pushes: [ + [ + 'comment', + { + type: 'remove', + row: {id: 'c1', issueID: 'i1', text: 'c1'}, + }, + ], + ], + }); + + expect(data).toMatchInlineSnapshot(`[]`); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` + { + "["cap","i1"]": { + "pks": [], + "size": 0, + }, + } + `); + expect(log.filter(msg => msg[0] === '.comments:cap')) + .toMatchInlineSnapshot(` + [ + [ + ".comments:cap", + "push", + { + "row": { + "id": "c1", + "issueID": "i1", + "text": "c1", + }, + "type": "remove", + }, + ], + [ + ".comments:cap", + "fetch", + { + "constraint": { + "issueID": "i1", + }, + }, + ], + ] + `); + expect(pushes).toMatchInlineSnapshot(` + [ + { + "node": { + "relationships": { + "comments": [ + { + "relationships": {}, + "row": { + "id": "c1", + "issueID": "i1", + "text": "c1", + }, + }, + ], + }, + "row": { + "id": "i1", + "text": "i1", + }, + }, + "type": "remove", + }, + ] + `); + }); + + test('child remove of untracked PK is dropped', () => { + const sourceContents: SourceContents = { + issue: [{id: 'i1', text: 'i1'}], + comment: [ + {id: 'c1', issueID: 'i1', text: 'c1'}, + {id: 'c2', issueID: 'i1', text: 'c2'}, + {id: 'c3', issueID: 'i1', text: 'c3'}, + {id: 'c4', issueID: 'i1', text: 'c4'}, + ], + }; + const {log, data, actualStorage, pushes} = runPushTest({ + sources, + sourceContents, + ast, + format, + pushes: [ + [ + 'comment', + { + type: 'remove', + row: {id: 'c4', issueID: 'i1', text: 'c4'}, + }, + ], + ], + }); + + expect(data).toMatchInlineSnapshot(` + [ + { + "comments": [ + { + "id": "c1", + "issueID": "i1", + "text": "c1", + Symbol(rc): 1, + }, + { + "id": "c2", + "issueID": "i1", + "text": "c2", + Symbol(rc): 1, + }, + { + "id": "c3", + "issueID": "i1", + "text": "c3", + Symbol(rc): 1, + }, + ], + "id": "i1", + "text": "i1", + Symbol(rc): 1, + }, + ] + `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` + { + "["cap","i1"]": { + "pks": [ + "["c1"]", + "["c2"]", + "["c3"]", + ], + "size": 3, + }, + } + `); + expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( + `[]`, + ); + expect(pushes).toMatchInlineSnapshot(`[]`); + }); + + test('child edit of tracked PK is forwarded', () => { + const sourceContents: SourceContents = { + issue: [{id: 'i1', text: 'i1'}], + comment: [ + {id: 'c1', issueID: 'i1', text: 'c1'}, + {id: 'c2', issueID: 'i1', text: 'c2'}, + ], + }; + const {log, data, actualStorage, pushes} = runPushTest({ + sources, + sourceContents, + ast, + format, + pushes: [ + [ + 'comment', + { + type: 'edit', + oldRow: {id: 'c1', issueID: 'i1', text: 'c1'}, + row: {id: 'c1', issueID: 'i1', text: 'c1 updated'}, + }, + ], + ], + }); + + expect(data).toMatchInlineSnapshot(` + [ + { + "comments": [ + { + "id": "c1", + "issueID": "i1", + "text": "c1 updated", + Symbol(rc): 1, + }, + { + "id": "c2", + "issueID": "i1", + "text": "c2", + Symbol(rc): 1, + }, + ], + "id": "i1", + "text": "i1", + Symbol(rc): 1, + }, + ] + `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` + { + "["cap","i1"]": { + "pks": [ + "["c1"]", + "["c2"]", + ], + "size": 2, + }, + } + `); + expect(log.filter(msg => msg[0] === '.comments:cap')) + .toMatchInlineSnapshot(` + [ + [ + ".comments:cap", + "push", + { + "oldRow": { + "id": "c1", + "issueID": "i1", + "text": "c1", + }, + "row": { + "id": "c1", + "issueID": "i1", + "text": "c1 updated", + }, + "type": "edit", + }, + ], + [ + ".comments:cap", + "fetch", + { + "constraint": { + "issueID": "i1", + }, + }, + ], + ] + `); + expect(pushes).toMatchInlineSnapshot(` + [ + { + "child": { + "change": { + "oldRow": { + "id": "c1", + "issueID": "i1", + "text": "c1", + }, + "row": { + "id": "c1", + "issueID": "i1", + "text": "c1 updated", + }, + "type": "edit", + }, + "relationshipName": "comments", + }, + "row": { + "id": "i1", + "text": "i1", + }, + "type": "child", + }, + ] + `); + }); +}); + +suite('Cap push - unordered overlay in join', () => { + const sources: Sources = { + parent: { + columns: { + id: {type: 'string'}, + group: {type: 'string'}, + }, + primaryKeys: ['id'], + }, + child: { + columns: { + id: {type: 'string'}, + group: {type: 'string'}, + text: {type: 'string'}, + }, + primaryKeys: ['id'], + }, + }; + + const ast: AST = { + table: 'parent', + orderBy: [['id', 'asc']], + where: { + type: 'correlatedSubquery', + related: { + system: 'client', + correlation: {parentField: ['group'], childField: ['group']}, + subquery: { + table: 'child', + alias: 'children', + orderBy: [['id', 'asc']], + }, + }, + op: 'EXISTS', + }, + } as const; + + const format: Format = { + singular: false, + relationships: { + children: { + singular: false, + relationships: {}, + }, + }, + }; + + test('child remove with refill, multiple parents per child (unordered overlay)', () => { + const sourceContents: SourceContents = { + parent: [ + {id: 'p1', group: 'g1'}, + {id: 'p2', group: 'g1'}, + ], + child: [ + {id: 'x1', group: 'g1', text: 'x1'}, + {id: 'x2', group: 'g1', text: 'x2'}, + {id: 'x3', group: 'g1', text: 'x3'}, + {id: 'x4', group: 'g1', text: 'x4'}, + ], + }; + const {log, data, actualStorage, pushes} = runPushTest({ + sources, + sourceContents, + ast, + format, + pushes: [ + [ + 'child', + { + type: 'remove', + row: {id: 'x1', group: 'g1', text: 'x1'}, + }, + ], + ], + }); + + expect(data).toMatchInlineSnapshot(` + [ + { + "children": [ + { + "group": "g1", + "id": "x2", + "text": "x2", + Symbol(rc): 1, + }, + { + "group": "g1", + "id": "x3", + "text": "x3", + Symbol(rc): 1, + }, + { + "group": "g1", + "id": "x4", + "text": "x4", + Symbol(rc): 1, + }, + ], + "group": "g1", + "id": "p1", + Symbol(rc): 1, + }, + { + "children": [ + { + "group": "g1", + "id": "x2", + "text": "x2", + Symbol(rc): 1, + }, + { + "group": "g1", + "id": "x3", + "text": "x3", + Symbol(rc): 1, + }, + { + "group": "g1", + "id": "x4", + "text": "x4", + Symbol(rc): 1, + }, + ], + "group": "g1", + "id": "p2", + Symbol(rc): 1, + }, + ] + `); + expect(actualStorage['.children:cap']).toMatchInlineSnapshot(` + { + "["cap","g1"]": { + "pks": [ + "["x2"]", + "["x3"]", + "["x4"]", + ], + "size": 3, + }, + } + `); + expect(log.filter(msg => msg[0] === '.children:cap')) + .toMatchInlineSnapshot(` + [ + [ + ".children:cap", + "push", + { + "row": { + "group": "g1", + "id": "x1", + "text": "x1", + }, + "type": "remove", + }, + ], + [ + ".children:cap", + "fetch", + { + "constraint": { + "group": "g1", + }, + }, + ], + [ + ".children:cap", + "fetch", + { + "constraint": { + "group": "g1", + }, + }, + ], + [ + ".children:cap", + "push", + { + "row": { + "group": "g1", + "id": "x4", + "text": "x4", + }, + "type": "add", + }, + ], + [ + ".children:cap", + "fetch", + { + "constraint": { + "group": "g1", + }, + }, + ], + [ + ".children:cap", + "fetch", + { + "constraint": { + "group": "g1", + }, + }, + ], + ] + `); + expect(pushes).toMatchInlineSnapshot(` + [ + { + "child": { + "change": { + "node": { + "relationships": {}, + "row": { + "group": "g1", + "id": "x1", + "text": "x1", + }, + }, + "type": "remove", + }, + "relationshipName": "children", + }, + "row": { + "group": "g1", + "id": "p1", + }, + "type": "child", + }, + { + "child": { + "change": { + "node": { + "relationships": {}, + "row": { + "group": "g1", + "id": "x1", + "text": "x1", + }, + }, + "type": "remove", + }, + "relationshipName": "children", + }, + "row": { + "group": "g1", + "id": "p2", + }, + "type": "child", + }, + { + "child": { + "change": { + "node": { + "relationships": {}, + "row": { + "group": "g1", + "id": "x4", + "text": "x4", + }, + }, + "type": "add", + }, + "relationshipName": "children", + }, + "row": { + "group": "g1", + "id": "p1", + }, + "type": "child", + }, + { + "child": { + "change": { + "node": { + "relationships": {}, + "row": { + "group": "g1", + "id": "x4", + "text": "x4", + }, + }, + "type": "add", + }, + "relationshipName": "children", + }, + "row": { + "group": "g1", + "id": "p2", + }, + "type": "child", + }, + ] + `); + }); +}); diff --git a/packages/zql/src/ivm/cap.ts b/packages/zql/src/ivm/cap.ts new file mode 100644 index 0000000000..84ccfb325e --- /dev/null +++ b/packages/zql/src/ivm/cap.ts @@ -0,0 +1,333 @@ +import {assert} from '../../../shared/src/asserts.ts'; +import type {Row, Value} from '../../../zero-protocol/src/data.ts'; +import type {PrimaryKey} from '../../../zero-protocol/src/primary-key.ts'; +import {type Change, type EditChange} from './change.ts'; +import type {Constraint} from './constraint.ts'; +import type {Comparator, Node} from './data.ts'; +import { + throwOutput, + type FetchRequest, + type Input, + type Operator, + type Output, + type Storage, +} from './operator.ts'; +import type {SourceSchema} from './schema.ts'; +import {type Stream} from './stream.ts'; +import { + constraintMatchesPartitionKey, + makePartitionKeyComparator, + type PartitionKey, +} from './take.ts'; + +type CapState = { + size: number; + pks: string[]; +}; + +interface CapStorage { + get(key: string): CapState | undefined; + set(key: string, value: CapState): void; + del(key: string): void; +} + +/** + * The Cap operator is a count-based limiter for EXISTS subqueries that + * does not require ordering. Unlike Take, it tracks membership by primary + * key set rather than by a sorted bound. This means: + * + * - No comparator needed (no ordering requirement) + * - No `start` or `reverse` fetch support + * - No `#rowHiddenFromFetch` complexity (we can defer when adding to the pk set) + * + * Cap is used in EXISTS child pipelines where only the count of matching + * rows matters, not their order. This allows SQLite to skip ORDER BY + * entirely, enabling much faster query plans. + * + * Cap can count rows globally or by unique value of some partition key + * (same as Take). + */ +export class Cap implements Operator { + readonly #input: Input; + readonly #storage: CapStorage; + readonly #limit: number; + readonly #partitionKey: PartitionKey | undefined; + readonly #partitionKeyComparator: Comparator | undefined; + readonly #primaryKey: PrimaryKey; + + #output: Output = throwOutput; + + constructor( + input: Input, + storage: Storage, + limit: number, + partitionKey?: PartitionKey, + ) { + assert(limit >= 0, 'Limit must be non-negative'); + input.setOutput(this); + this.#input = input; + this.#storage = storage as CapStorage; + this.#limit = limit; + this.#partitionKey = partitionKey; + this.#partitionKeyComparator = + partitionKey && makePartitionKeyComparator(partitionKey); + this.#primaryKey = input.getSchema().primaryKey; + } + + setOutput(output: Output): void { + this.#output = output; + } + + getSchema(): SourceSchema { + return this.#input.getSchema(); + } + + *fetch(req: FetchRequest): Stream { + assert(!req.start, 'Cap does not support start'); + assert(!req.reverse, 'Cap does not support reverse'); + + if ( + !this.#partitionKey || + (req.constraint && + constraintMatchesPartitionKey(req.constraint, this.#partitionKey)) + ) { + const capStateKey = getCapStateKey(this.#partitionKey, req.constraint); + const capState = this.#storage.get(capStateKey); + if (!capState) { + yield* this.#initialFetch(req); + return; + } + if (capState.size === 0) { + return; + } + // PK-based point lookups: fetch each tracked row by its PK directly, + // rather than scanning the partition and filtering. + for (const pk of capState.pks) { + const constraint = deserializePKToConstraint(pk, this.#primaryKey); + for (const inputNode of this.#input.fetch({constraint})) { + if (inputNode === 'yield') { + yield inputNode; + continue; + } + yield inputNode; + } + } + return; + } + // There is a partition key, but the fetch is not constrained or constrained + // on a different key. This currently only happens with nested sub-queries. + const pkSetCache = new Map | null>(); + for (const inputNode of this.#input.fetch(req)) { + if (inputNode === 'yield') { + yield inputNode; + continue; + } + const capStateKey = getCapStateKey(this.#partitionKey, inputNode.row); + if (!pkSetCache.has(capStateKey)) { + const capState = this.#storage.get(capStateKey); + pkSetCache.set( + capStateKey, + capState && capState.size > 0 ? new Set(capState.pks) : null, + ); + } + const pkSet = pkSetCache.get(capStateKey); + if (pkSet) { + const pk = serializePK(inputNode.row, this.#primaryKey); + if (pkSet.has(pk)) { + yield inputNode; + } + } + } + } + + *#initialFetch(req: FetchRequest): Stream { + assert( + constraintMatchesPartitionKey(req.constraint, this.#partitionKey), + 'Constraint should match partition key', + ); + + if (this.#limit === 0) { + return; + } + + const capStateKey = getCapStateKey(this.#partitionKey, req.constraint); + assert( + this.#storage.get(capStateKey) === undefined, + 'Cap state should be undefined', + ); + + let size = 0; + const pks: string[] = []; + let downstreamEarlyReturn = true; + let exceptionThrown = false; + try { + for (const inputNode of this.#input.fetch(req)) { + if (inputNode === 'yield') { + yield 'yield'; + continue; + } + yield inputNode; + pks.push(serializePK(inputNode.row, this.#primaryKey)); + size++; + if (size === this.#limit) { + break; + } + } + downstreamEarlyReturn = false; + } catch (e) { + exceptionThrown = true; + throw e; + } finally { + if (!exceptionThrown) { + this.#storage.set(capStateKey, {size, pks}); + // If it becomes necessary to support downstream early return, this + // assert should be removed, and replaced with code that consumes + // the input stream until limit is reached or the input stream is + // exhausted so that capState is properly hydrated. + assert( + !downstreamEarlyReturn, + 'Unexpected early return prevented full hydration', + ); + } + } + } + + *push(change: Change): Stream<'yield'> { + if (change.type === 'edit') { + yield* this.#pushEditChange(change); + return; + } + + const capStateKey = getCapStateKey(this.#partitionKey, change.node.row); + const capState = this.#storage.get(capStateKey); + if (!capState) { + return; + } + + const pk = serializePK(change.node.row, this.#primaryKey); + + if (change.type === 'add') { + if (capState.size < this.#limit) { + const pks = [...capState.pks, pk]; + this.#storage.set(capStateKey, {size: capState.size + 1, pks}); + yield* this.#output.push(change, this); + return; + } + // Full — drop + return; + } else if (change.type === 'remove') { + const pkIndex = capState.pks.indexOf(pk); + if (pkIndex === -1) { + // Not in our set — drop + return; + } + // Remove from set + const pks = [...capState.pks]; + pks.splice(pkIndex, 1); + const newSize = capState.size - 1; + + // Try to refill: fetch from input with partition constraint, + // find first row NOT in PK set + const pkSet = new Set(pks); + const constraint = this.#partitionKey + ? (Object.fromEntries( + this.#partitionKey.map(key => [key, change.node.row[key]] as const), + ) as Constraint) + : undefined; + + let replacement: Node | undefined; + for (const node of this.#input.fetch({constraint})) { + if (node === 'yield') { + yield node; + continue; + } + const nodePK = serializePK(node.row, this.#primaryKey); + if (!pkSet.has(nodePK)) { + replacement = node; + break; + } + } + + if (replacement) { + // Store state WITHOUT replacement during remove forward, + // matching Take's pattern of hiding in-flight changes from re-fetches. + this.#storage.set(capStateKey, {size: newSize, pks}); + yield* this.#output.push(change, this); + // Now add replacement to set and forward the add. + const replacementPK = serializePK(replacement.row, this.#primaryKey); + pks.push(replacementPK); + this.#storage.set(capStateKey, {size: newSize + 1, pks}); + yield* this.#output.push({type: 'add', node: replacement}, this); + } else { + this.#storage.set(capStateKey, {size: newSize, pks}); + yield* this.#output.push(change, this); + } + } else if (change.type === 'child') { + const pkSet = new Set(capState.pks); + if (pkSet.has(pk)) { + yield* this.#output.push(change, this); + } + } + } + + *#pushEditChange(change: EditChange): Stream<'yield'> { + assert( + !this.#partitionKeyComparator || + this.#partitionKeyComparator(change.oldNode.row, change.node.row) === 0, + 'Unexpected change of partition key', + ); + const capStateKey = getCapStateKey(this.#partitionKey, change.oldNode.row); + const capState = this.#storage.get(capStateKey); + if (!capState) { + return; + } + + const oldPK = serializePK(change.oldNode.row, this.#primaryKey); + const pkSet = new Set(capState.pks); + if (pkSet.has(oldPK)) { + // Update the PK in our set if it changed + const newPK = serializePK(change.node.row, this.#primaryKey); + if (oldPK !== newPK) { + const pks = capState.pks.map(p => (p === oldPK ? newPK : p)); + this.#storage.set(capStateKey, {size: capState.size, pks}); + } + yield* this.#output.push(change, this); + } + // If not in our set, drop + } + + destroy(): void { + this.#input.destroy(); + } +} + +function getCapStateKey( + partitionKey: PartitionKey | undefined, + rowOrConstraint: Row | Constraint | undefined, +): string { + const partitionValues: Value[] = []; + + if (partitionKey && rowOrConstraint) { + for (const key of partitionKey) { + partitionValues.push(rowOrConstraint[key]); + } + } + + return JSON.stringify(['cap', ...partitionValues]); +} + +function serializePK(row: Row, primaryKey: PrimaryKey): string { + return JSON.stringify(primaryKey.map(k => row[k])); +} + +function deserializePKToConstraint( + pk: string, + primaryKey: PrimaryKey, +): Constraint { + const values = JSON.parse(pk) as Value[]; + const constraint: Record = {}; + for (let i = 0; i < primaryKey.length; i++) { + constraint[primaryKey[i]] = values[i]; + } + return constraint; +} diff --git a/packages/zql/src/ivm/join-utils.test.ts b/packages/zql/src/ivm/join-utils.test.ts new file mode 100644 index 0000000000..86e323dcca --- /dev/null +++ b/packages/zql/src/ivm/join-utils.test.ts @@ -0,0 +1,377 @@ +import {describe, expect, test} from 'vitest'; +import { + generateWithOverlayUnordered, + generateWithOverlayNoYieldUnordered, + rowEqualsForCompoundKey, + isJoinMatch, + buildJoinConstraint, +} from './join-utils.ts'; +import type {Node} from './data.ts'; +import type {SourceSchema} from './schema.ts'; +import type {Change} from './change.ts'; +import type {Row} from '../../../zero-protocol/src/data.ts'; +import type {Stream} from './stream.ts'; + +function makeNode(row: Row): Node { + return {row, relationships: {}}; +} + +function makeSchema(primaryKey: readonly [string, ...string[]]): SourceSchema { + return { + tableName: 'test', + columns: {}, + primaryKey, + relationships: {}, + isHidden: false, + system: 'client', + compareRows: () => 0, + }; +} + +function collectNodes(stream: Stream): (Node | 'yield')[] { + return [...stream]; +} + +function collectRows( + stream: Stream, +): Record[] { + return [...stream].filter((n): n is Node => n !== 'yield').map(n => n.row); +} + +describe('generateWithOverlayUnordered', () => { + const schema = makeSchema(['id']); + + describe('remove', () => { + test('yields overlay node first then all stream nodes', () => { + const stream: Stream = [ + makeNode({id: 1}), + makeNode({id: 2}), + ]; + const overlay: Change = {type: 'remove', node: makeNode({id: 3})}; + + const result = collectRows( + generateWithOverlayUnordered(stream, overlay, schema), + ); + expect(result).toEqual([{id: 3}, {id: 1}, {id: 2}]); + }); + + test('does not assert when overlay node is not in stream', () => { + const stream: Stream = []; + const overlay: Change = {type: 'remove', node: makeNode({id: 99})}; + + const result = collectRows( + generateWithOverlayUnordered(stream, overlay, schema), + ); + expect(result).toEqual([{id: 99}]); + }); + }); + + describe('add', () => { + test('suppresses matching node from stream', () => { + const stream: Stream = [ + makeNode({id: 1}), + makeNode({id: 2}), + makeNode({id: 3}), + ]; + const overlay: Change = {type: 'add', node: makeNode({id: 2})}; + + const result = collectRows( + generateWithOverlayUnordered(stream, overlay, schema), + ); + expect(result).toEqual([{id: 1}, {id: 3}]); + }); + + test('asserts if no matching node found in stream', () => { + const stream: Stream = [makeNode({id: 1})]; + const overlay: Change = {type: 'add', node: makeNode({id: 99})}; + + expect(() => + collectNodes(generateWithOverlayUnordered(stream, overlay, schema)), + ).toThrow( + 'overlayGenerator: overlay was never applied to any fetched node', + ); + }); + }); + + describe('edit', () => { + test('yields old node first and suppresses matching node from stream', () => { + const stream: Stream = [ + makeNode({id: 1}), + makeNode({id: 2, val: 'new'}), + ]; + const overlay: Change = { + type: 'edit', + node: makeNode({id: 2, val: 'new'}), + oldNode: makeNode({id: 2, val: 'old'}), + }; + + const result = collectRows( + generateWithOverlayUnordered(stream, overlay, schema), + ); + expect(result).toEqual([{id: 2, val: 'old'}, {id: 1}]); + }); + + test('asserts if no matching node found in stream', () => { + const stream: Stream = [makeNode({id: 1})]; + const overlay: Change = { + type: 'edit', + node: makeNode({id: 99}), + oldNode: makeNode({id: 99}), + }; + + expect(() => + collectNodes(generateWithOverlayUnordered(stream, overlay, schema)), + ).toThrow( + 'overlayGenerator: overlay was never applied to any fetched node', + ); + }); + }); + + describe('child', () => { + test('overlays child relationship on matching node', () => { + const childSchema = makeSchema(['cid']); + const schemaWithRel: SourceSchema = { + ...schema, + relationships: {items: childSchema}, + }; + + const stream: Stream = [ + makeNode({id: 1}), + { + row: {id: 2}, + relationships: { + items: function* () { + yield makeNode({cid: 'a'}); + yield makeNode({cid: 'b'}); + }, + }, + }, + ]; + + const childChange: Change = {type: 'add', node: makeNode({cid: 'c'})}; + const overlay: Change = { + type: 'child', + node: makeNode({id: 2}), + child: { + relationshipName: 'items', + change: childChange, + }, + }; + + const result = collectNodes( + generateWithOverlayUnordered(stream, overlay, schemaWithRel), + ); + expect(result).toHaveLength(2); + // First node passes through unchanged + expect((result[0] as Node).row).toEqual({id: 1}); + // Second node has overlaid relationship + const overlaid = result[1] as Node; + expect(overlaid.row).toEqual({id: 2}); + // The relationship should be a function (lazy stream) + expect(typeof overlaid.relationships.items).toBe('function'); + }); + + test('asserts if no matching node found in stream', () => { + const schemaWithRel: SourceSchema = { + ...schema, + relationships: {items: makeSchema(['cid'])}, + }; + + const stream: Stream = [makeNode({id: 1})]; + const overlay: Change = { + type: 'child', + node: makeNode({id: 99}), + child: { + relationshipName: 'items', + change: {type: 'add', node: makeNode({cid: 'c'})}, + }, + }; + + expect(() => + collectNodes( + generateWithOverlayUnordered(stream, overlay, schemaWithRel), + ), + ).toThrow( + 'overlayGenerator: overlay was never applied to any fetched node', + ); + }); + }); + + describe('compound primary key', () => { + const compoundSchema = makeSchema(['a', 'b']); + + test('matches on all PK columns', () => { + const stream: Stream = [ + makeNode({a: 1, b: 1, val: 'x'}), + makeNode({a: 1, b: 2, val: 'y'}), + makeNode({a: 2, b: 1, val: 'z'}), + ]; + const overlay: Change = { + type: 'add', + node: makeNode({a: 1, b: 2}), + }; + + const result = collectRows( + generateWithOverlayUnordered(stream, overlay, compoundSchema), + ); + expect(result).toEqual([ + {a: 1, b: 1, val: 'x'}, + {a: 2, b: 1, val: 'z'}, + ]); + }); + + test('does not match on partial PK', () => { + const stream: Stream = [ + makeNode({a: 1, b: 1}), + makeNode({a: 1, b: 2}), + ]; + // Matches a=1 but b differs + const overlay: Change = { + type: 'add', + node: makeNode({a: 1, b: 3}), + }; + + expect(() => + collectNodes( + generateWithOverlayUnordered(stream, overlay, compoundSchema), + ), + ).toThrow( + 'overlayGenerator: overlay was never applied to any fetched node', + ); + }); + }); + + describe('yield markers', () => { + test('passes yield markers through unchanged', () => { + const stream: Stream = [ + makeNode({id: 1}), + 'yield' as const, + makeNode({id: 2}), + 'yield' as const, + makeNode({id: 3}), + ]; + const overlay: Change = {type: 'add', node: makeNode({id: 2})}; + + const result = collectNodes( + generateWithOverlayUnordered(stream, overlay, schema), + ); + expect(result).toEqual([ + expect.objectContaining({row: {id: 1}}), + 'yield', + 'yield', + expect.objectContaining({row: {id: 3}}), + ]); + }); + }); +}); + +describe('generateWithOverlayNoYieldUnordered', () => { + const schema = makeSchema(['id']); + + test('strips yield markers from output', () => { + function* stream(): Stream { + yield makeNode({id: 1}); + yield makeNode({id: 2}); + yield makeNode({id: 3}); + } + const overlay: Change = {type: 'add', node: makeNode({id: 2})}; + + const result = [ + ...generateWithOverlayNoYieldUnordered(stream(), overlay, schema), + ]; + expect(result).toHaveLength(2); + expect(result.map(n => n.row)).toEqual([{id: 1}, {id: 3}]); + }); +}); + +describe('rowEqualsForCompoundKey', () => { + test('single key match', () => { + expect(rowEqualsForCompoundKey({id: 1}, {id: 1}, ['id'])).toBe(true); + }); + + test('single key mismatch', () => { + expect(rowEqualsForCompoundKey({id: 1}, {id: 2}, ['id'])).toBe(false); + }); + + test('compound key all match', () => { + expect( + rowEqualsForCompoundKey({a: 1, b: 'x'}, {a: 1, b: 'x'}, ['a', 'b']), + ).toBe(true); + }); + + test('compound key partial mismatch', () => { + expect( + rowEqualsForCompoundKey({a: 1, b: 'x'}, {a: 1, b: 'y'}, ['a', 'b']), + ).toBe(false); + }); + + test('null equals null (compareValues treats null as a real value)', () => { + expect(rowEqualsForCompoundKey({id: null}, {id: null}, ['id'])).toBe(true); + }); + + test('extra columns ignored', () => { + expect( + rowEqualsForCompoundKey({id: 1, val: 'a'}, {id: 1, val: 'b'}, ['id']), + ).toBe(true); + }); +}); + +describe('isJoinMatch', () => { + test('single key match', () => { + expect(isJoinMatch({id: 1}, ['id'], {id: 1}, ['id'])).toBe(true); + }); + + test('single key mismatch', () => { + expect(isJoinMatch({id: 1}, ['id'], {id: 2}, ['id'])).toBe(false); + }); + + test('compound key match with different column names', () => { + expect( + isJoinMatch({a: 1, b: 'x'}, ['a', 'b'], {x: 1, y: 'x'}, ['x', 'y']), + ).toBe(true); + }); + + test('null parent value returns false (SQL NULL semantics)', () => { + expect(isJoinMatch({id: null}, ['id'], {id: 1}, ['id'])).toBe(false); + }); + + test('null child value returns false', () => { + expect(isJoinMatch({id: 1}, ['id'], {id: null}, ['id'])).toBe(false); + }); + + test('both null returns false (unlike rowEqualsForCompoundKey)', () => { + expect(isJoinMatch({id: null}, ['id'], {id: null}, ['id'])).toBe(false); + }); +}); + +describe('buildJoinConstraint', () => { + test('single key maps value correctly', () => { + expect(buildJoinConstraint({id: 1}, ['id'], ['id'])).toEqual({id: 1}); + }); + + test('compound key maps all values', () => { + expect(buildJoinConstraint({a: 1, b: 'x'}, ['a', 'b'], ['a', 'b'])).toEqual( + {a: 1, b: 'x'}, + ); + }); + + test('null value returns undefined', () => { + expect(buildJoinConstraint({id: null}, ['id'], ['id'])).toBeUndefined(); + }); + + test('null in second position returns undefined', () => { + expect( + buildJoinConstraint({a: 1, b: null}, ['a', 'b'], ['x', 'y']), + ).toBeUndefined(); + }); + + test('different source/target key names', () => { + expect( + buildJoinConstraint( + {userId: 5, orgId: 10}, + ['userId', 'orgId'], + ['id', 'org'], + ), + ).toEqual({id: 5, org: 10}); + }); +}); diff --git a/packages/zql/src/ivm/join-utils.ts b/packages/zql/src/ivm/join-utils.ts index ce8bb02aa4..7eb1d236c7 100644 --- a/packages/zql/src/ivm/join-utils.ts +++ b/packages/zql/src/ivm/join-utils.ts @@ -118,6 +118,71 @@ export function* generateWithOverlay( ); } +export function generateWithOverlayNoYieldUnordered( + stream: Stream, + overlay: Change, + schema: SourceSchema, +): Stream { + return generateWithOverlayUnordered(stream, overlay, schema) as Stream; +} + +export function* generateWithOverlayUnordered( + stream: Stream, + overlay: Change, + schema: SourceSchema, +): Stream { + // Eager inject + if (overlay.type === 'remove') { + yield overlay.node; + } else if (overlay.type === 'edit') { + yield overlay.oldNode; + } + + // Stream with inline suppress + let suppressed = false; + for (const node of stream) { + if (node === 'yield') { + yield node; + continue; + } + if (!suppressed) { + if (overlay.type === 'add' || overlay.type === 'edit') { + if ( + rowEqualsForCompoundKey(overlay.node.row, node.row, schema.primaryKey) + ) { + suppressed = true; + continue; + } + } + if (overlay.type === 'child') { + if ( + rowEqualsForCompoundKey(overlay.node.row, node.row, schema.primaryKey) + ) { + suppressed = true; + yield { + row: node.row, + relationships: { + ...node.relationships, + [overlay.child.relationshipName]: () => + generateWithOverlay( + node.relationships[overlay.child.relationshipName](), + overlay.child.change, + schema.relationships[overlay.child.relationshipName], + ), + }, + }; + continue; + } + } + } + yield node; + } + assert( + suppressed || overlay.type === 'remove', + 'overlayGenerator: overlay was never applied to any fetched node', + ); +} + export function rowEqualsForCompoundKey( a: Row, b: Row, diff --git a/packages/zql/src/ivm/join.ts b/packages/zql/src/ivm/join.ts index 5d6fd5fefe..d035393208 100644 --- a/packages/zql/src/ivm/join.ts +++ b/packages/zql/src/ivm/join.ts @@ -6,6 +6,7 @@ import type {Node} from './data.ts'; import { buildJoinConstraint, generateWithOverlay, + generateWithOverlayUnordered, isJoinMatch, rowEqualsForCompoundKey, type JoinChangeOverlay, @@ -276,10 +277,18 @@ export class Join implements Input { this.#inprogressChildChange.position, ) > 0 ) { + const childSchema = this.#child.getSchema(); + if (childSchema.sort === undefined) { + return generateWithOverlayUnordered( + stream, + this.#inprogressChildChange.change, + childSchema, + ); + } return generateWithOverlay( stream, this.#inprogressChildChange.change, - this.#child.getSchema(), + childSchema, ); } return stream; diff --git a/packages/zql/src/ivm/memory-source.test.ts b/packages/zql/src/ivm/memory-source.test.ts index 89aca05c7d..7f6499e225 100644 --- a/packages/zql/src/ivm/memory-source.test.ts +++ b/packages/zql/src/ivm/memory-source.test.ts @@ -6,6 +6,8 @@ import {Catch} from './catch.ts'; import type {Change} from './change.ts'; import { generateWithOverlayInner, + generateWithOverlayInnerUnordered, + generateWithOverlayUnordered, MemorySource, overlaysForConstraintForTest, overlaysForStartAtForTest, @@ -510,3 +512,212 @@ test('overlaysForStartAt', () => { ), ).toEqual({add: undefined, remove: undefined}); }); + +describe('generateWithOverlayInnerUnordered', () => { + const rows = [ + {id: 1, s: 'a', n: 11}, + {id: 2, s: 'b', n: 22}, + {id: 3, s: 'c', n: 33}, + ]; + + const pk = ['id'] as const; + + test.each([ + { + name: 'No overlay', + overlays: {add: undefined, remove: undefined}, + expected: rows, + }, + { + name: 'Add overlay — yields added row first', + overlays: {add: {id: 4, s: 'd', n: 44}, remove: undefined}, + expected: [{id: 4, s: 'd', n: 44}, ...rows], + }, + { + name: 'Remove overlay start', + overlays: {add: undefined, remove: {id: 1, s: 'a', n: 11}}, + expected: [rows[1], rows[2]], + }, + { + name: 'Remove overlay middle', + overlays: {add: undefined, remove: {id: 2, s: 'b', n: 22}}, + expected: [rows[0], rows[2]], + }, + { + name: 'Remove overlay end', + overlays: {add: undefined, remove: {id: 3, s: 'c', n: 33}}, + expected: [rows[0], rows[1]], + }, + { + name: 'Remove overlay not found — yields all rows', + overlays: {add: undefined, remove: {id: 99, s: 'z', n: 0}}, + expected: rows, + }, + { + name: 'Edit (add + remove) — new row first, old row suppressed', + overlays: { + add: {id: 2, s: 'b2', n: 225}, + remove: {id: 2, s: 'b', n: 22}, + }, + expected: [{id: 2, s: 'b2', n: 225}, rows[0], rows[2]], + }, + { + name: 'Edit position change — different non-PK values', + overlays: { + add: {id: 5, s: 'e', n: 55}, + remove: {id: 1, s: 'a', n: 11}, + }, + expected: [{id: 5, s: 'e', n: 55}, rows[1], rows[2]], + }, + { + name: 'Empty stream with add', + overlays: {add: {id: 1, s: 'a', n: 11}, remove: undefined}, + rows: [], + expected: [{id: 1, s: 'a', n: 11}], + }, + { + name: 'Empty stream no overlay', + overlays: {add: undefined, remove: undefined}, + rows: [], + expected: [], + }, + ] as const)('$name', c => { + const input = 'rows' in c ? c.rows : rows; + const actual = [ + ...generateWithOverlayInnerUnordered(input, c.overlays, pk), + ].map(({row}) => row); + expect(actual).toEqual(c.expected); + }); + + test('Compound primary key — matches on all PK columns', () => { + const compoundRows = [ + {a: 1, b: 'x', v: 10}, + {a: 1, b: 'y', v: 20}, + {a: 2, b: 'x', v: 30}, + ]; + const compoundPK = ['a', 'b'] as const; + const actual = [ + ...generateWithOverlayInnerUnordered( + compoundRows, + {add: undefined, remove: {a: 1, b: 'y', v: 20}}, + compoundPK, + ), + ].map(({row}) => row); + expect(actual).toEqual([compoundRows[0], compoundRows[2]]); + }); + + test('Compound PK partial match — does not suppress', () => { + const compoundRows = [ + {a: 1, b: 'x', v: 10}, + {a: 1, b: 'y', v: 20}, + {a: 2, b: 'x', v: 30}, + ]; + const compoundPK = ['a', 'b'] as const; + const actual = [ + ...generateWithOverlayInnerUnordered( + compoundRows, + {add: undefined, remove: {a: 1, b: 'z', v: 0}}, + compoundPK, + ), + ].map(({row}) => row); + expect(actual).toEqual(compoundRows); + }); +}); + +describe('generateWithOverlayUnordered', () => { + const rows = [ + {id: 1, s: 'a', n: 11}, + {id: 2, s: 'b', n: 22}, + {id: 3, s: 'c', n: 33}, + ]; + + const pk = ['id'] as const; + + test('Epoch gating — overlay skipped when lastPushedEpoch < overlay.epoch', () => { + const overlay = { + epoch: 5, + change: {type: 'add' as const, row: {id: 4, s: 'd', n: 44}}, + }; + const actual = [ + ...generateWithOverlayUnordered(rows, undefined, overlay, 4, pk), + ].map(({row}) => row); + expect(actual).toEqual(rows); + }); + + test('Epoch gating — overlay applied when lastPushedEpoch >= overlay.epoch', () => { + const overlay = { + epoch: 5, + change: {type: 'add' as const, row: {id: 4, s: 'd', n: 44}}, + }; + const actual = [ + ...generateWithOverlayUnordered(rows, undefined, overlay, 5, pk), + ].map(({row}) => row); + expect(actual).toEqual([{id: 4, s: 'd', n: 44}, ...rows]); + }); + + test('Constraint filtering — overlay filtered out by constraint', () => { + const overlay = { + epoch: 1, + change: {type: 'add' as const, row: {id: 4, s: 'd', n: 44}}, + }; + const actual = [ + ...generateWithOverlayUnordered(rows, {s: 'a'}, overlay, 1, pk), + ].map(({row}) => row); + expect(actual).toEqual(rows); + }); + + test('Filter predicate — overlay filtered out by predicate', () => { + const overlay = { + epoch: 1, + change: {type: 'add' as const, row: {id: 4, s: 'd', n: 44}}, + }; + const actual = [ + ...generateWithOverlayUnordered( + rows, + undefined, + overlay, + 1, + pk, + (row: Row) => (row.n as number) < 40, + ), + ].map(({row}) => row); + expect(actual).toEqual(rows); + }); + + test('Add change type', () => { + const overlay = { + epoch: 1, + change: {type: 'add' as const, row: {id: 4, s: 'd', n: 44}}, + }; + const actual = [ + ...generateWithOverlayUnordered(rows, undefined, overlay, 1, pk), + ].map(({row}) => row); + expect(actual).toEqual([{id: 4, s: 'd', n: 44}, ...rows]); + }); + + test('Remove change type', () => { + const overlay = { + epoch: 1, + change: {type: 'remove' as const, row: {id: 2, s: 'b', n: 22}}, + }; + const actual = [ + ...generateWithOverlayUnordered(rows, undefined, overlay, 1, pk), + ].map(({row}) => row); + expect(actual).toEqual([rows[0], rows[2]]); + }); + + test('Edit change type', () => { + const overlay = { + epoch: 1, + change: { + type: 'edit' as const, + row: {id: 2, s: 'b2', n: 225}, + oldRow: {id: 2, s: 'b', n: 22}, + }, + }; + const actual = [ + ...generateWithOverlayUnordered(rows, undefined, overlay, 1, pk), + ].map(({row}) => row); + expect(actual).toEqual([{id: 2, s: 'b2', n: 225}, rows[0], rows[2]]); + }); +}); diff --git a/packages/zql/src/ivm/memory-source.ts b/packages/zql/src/ivm/memory-source.ts index c216163cbf..769a3c927a 100644 --- a/packages/zql/src/ivm/memory-source.ts +++ b/packages/zql/src/ivm/memory-source.ts @@ -1,6 +1,7 @@ import {assert, unreachable} from '../../../shared/src/asserts.ts'; import {BTreeSet} from '../../../shared/src/btree-set.ts'; import {hasOwn} from '../../../shared/src/has-own.ts'; +import {must} from '../../../shared/src/must.ts'; import {once} from '../../../shared/src/iterables.ts'; import type { Condition, @@ -69,7 +70,7 @@ type Index = { export type Connection = { input: Input; output: Output | undefined; - sort: Ordering; + sort?: Ordering | undefined; splitEditKeys: Set | undefined; compareRows: Comparator; filters: @@ -140,12 +141,12 @@ export class MemorySource implements Source { return this.#getPrimaryIndex().data; } - #getSchema(connection: Connection): SourceSchema { + #getSchema(connection: Connection, unordered: boolean): SourceSchema { return { tableName: this.#tableName, columns: this.#columns, primaryKey: this.#primaryKey, - sort: connection.sort, + sort: unordered ? undefined : connection.sort, system: 'client', relationships: {}, isHidden: false, @@ -154,11 +155,13 @@ export class MemorySource implements Source { } connect( - sort: Ordering, + sort: Ordering | undefined, filters?: Condition, splitEditKeys?: Set, ): SourceInput { const transformedFilters = transformFilters(filters); + const unordered = sort === undefined; + const internalSort = sort ?? this.#primaryIndexSort; const input: SourceInput = { getSchema: () => schema, @@ -175,9 +178,9 @@ export class MemorySource implements Source { const connection: Connection = { input, output: undefined, - sort, + sort: internalSort, splitEditKeys, - compareRows: makeComparator(sort), + compareRows: makeComparator(internalSort), filters: transformedFilters.filters ? { condition: transformedFilters.filters, @@ -186,8 +189,10 @@ export class MemorySource implements Source { : undefined, lastPushedEpoch: 0, }; - const schema = this.#getSchema(connection); - assertOrderingIncludesPK(sort, this.#primaryKey); + const schema = this.#getSchema(connection, unordered); + if (!unordered) { + assertOrderingIncludesPK(internalSort, this.#primaryKey); + } this.#connections.push(connection); return input; } @@ -250,7 +255,8 @@ export class MemorySource implements Source { } *#fetch(req: FetchRequest, conn: Connection): Stream { - const {sort: requestedSort, compareRows} = conn; + const requestedSort = must(conn.sort); + const {compareRows} = conn; const connectionComparator = (r1: Row, r2: Row) => compareRows(r1, r2) * (req.reverse ? -1 : 1); @@ -758,6 +764,80 @@ export function* generateWithOverlayInner( } } +/** + * Like {@link generateWithOverlay} but for unordered streams. + * No `startAt` or comparator needed. Injects remove/old-edit rows eagerly + * at the start, and suppresses add/new-edit rows inline by PK match. + */ +export function* generateWithOverlayUnordered( + rows: Iterable, + constraint: Constraint | undefined, + overlay: Overlay | undefined, + lastPushedEpoch: number, + primaryKey: PrimaryKey, + filterPredicate?: ((row: Row) => boolean) | undefined, +) { + let overlayToApply: Overlay | undefined = undefined; + if (overlay && lastPushedEpoch >= overlay.epoch) { + overlayToApply = overlay; + } + let overlays: Overlays = {add: undefined, remove: undefined}; + switch (overlayToApply?.change.type) { + case 'add': + overlays = {add: overlayToApply.change.row, remove: undefined}; + break; + case 'remove': + overlays = {add: undefined, remove: overlayToApply.change.row}; + break; + case 'edit': + overlays = { + add: overlayToApply.change.row, + remove: overlayToApply.change.oldRow, + }; + break; + } + if (constraint) { + overlays = overlaysForConstraint(overlays, constraint); + } + if (filterPredicate) { + overlays = overlaysForFilterPredicate(overlays, filterPredicate); + } + yield* generateWithOverlayInnerUnordered(rows, overlays, primaryKey); +} + +export function* generateWithOverlayInnerUnordered( + rowIterator: Iterable, + overlays: Overlays, + primaryKey: PrimaryKey, +) { + // Eager inject: yield the add overlay at the start (row not yet in storage) + if (overlays.add) { + yield {row: overlays.add, relationships: {}}; + } + // Stream with inline suppress: skip the remove overlay (row still in storage) + let removeSkipped = false; + for (const row of rowIterator) { + if ( + !removeSkipped && + overlays.remove && + rowMatchesPK(overlays.remove, row, primaryKey) + ) { + removeSkipped = true; + continue; + } + yield {row, relationships: {}}; + } +} + +function rowMatchesPK(a: Row, b: Row, primaryKey: PrimaryKey): boolean { + for (const key of primaryKey) { + if (!valuesEqual(a[key], b[key])) { + return false; + } + } + return true; +} + /** * A location to begin scanning an index from. Can either be a specific value * or the min or max possible value for the type. This is used to start a scan diff --git a/packages/zql/src/ivm/schema.ts b/packages/zql/src/ivm/schema.ts index 2ad74ac3ca..c81c247c1b 100644 --- a/packages/zql/src/ivm/schema.ts +++ b/packages/zql/src/ivm/schema.ts @@ -21,5 +21,5 @@ export type SourceSchema = { // We should not sync the data from the session table to the client. readonly system: System; readonly compareRows: Comparator; - readonly sort: Ordering; + readonly sort?: Ordering | undefined; }; diff --git a/packages/zql/src/ivm/skip.ts b/packages/zql/src/ivm/skip.ts index dd119c87fc..c58a9be782 100644 --- a/packages/zql/src/ivm/skip.ts +++ b/packages/zql/src/ivm/skip.ts @@ -1,3 +1,4 @@ +import {assert} from '../../../shared/src/asserts.ts'; import type {Row} from '../../../zero-protocol/src/data.ts'; import type {AddChange, Change, ChildChange, RemoveChange} from './change.ts'; import type {Comparator, Node} from './data.ts'; @@ -30,6 +31,8 @@ export class Skip implements Operator { #output: Output = throwOutput; constructor(input: Input, bound: Bound) { + const {sort} = input.getSchema(); + assert(sort !== undefined, 'Skip requires sorted input'); this.#input = input; this.#bound = bound; this.#comparator = input.getSchema().compareRows; diff --git a/packages/zql/src/ivm/source.ts b/packages/zql/src/ivm/source.ts index 52456adfca..7c906f9723 100644 --- a/packages/zql/src/ivm/source.ts +++ b/packages/zql/src/ivm/source.ts @@ -61,7 +61,7 @@ export interface Source { * a remove of the old row followed by an add of the new row. */ connect( - sort: Ordering, + sort: Ordering | undefined, filters?: Condition, splitEditKeys?: Set, debug?: DebugDelegate, diff --git a/packages/zql/src/ivm/take.ts b/packages/zql/src/ivm/take.ts index 2b03a82643..7531c4bff2 100644 --- a/packages/zql/src/ivm/take.ts +++ b/packages/zql/src/ivm/take.ts @@ -63,10 +63,9 @@ export class Take implements Operator { partitionKey?: PartitionKey, ) { assert(limit >= 0, 'Limit must be non-negative'); - assertOrderingIncludesPK( - input.getSchema().sort, - input.getSchema().primaryKey, - ); + const {sort} = input.getSchema(); + assert(sort !== undefined, 'Take requires sorted input'); + assertOrderingIncludesPK(sort, input.getSchema().primaryKey); input.setOutput(this); this.#input = input; this.#storage = storage as TakeStorage; @@ -735,7 +734,7 @@ function getTakeStateKey( return JSON.stringify(['take', ...partitionValues]); } -function constraintMatchesPartitionKey( +export function constraintMatchesPartitionKey( constraint: Constraint | undefined, partitionKey: PartitionKey | undefined, ): boolean { @@ -753,7 +752,9 @@ function constraintMatchesPartitionKey( return true; } -function makePartitionKeyComparator(partitionKey: PartitionKey): Comparator { +export function makePartitionKeyComparator( + partitionKey: PartitionKey, +): Comparator { return (a, b) => { for (const key of partitionKey) { const cmp = compareValues(a[key], b[key]); diff --git a/packages/zql/src/ivm/union-fan-in.ts b/packages/zql/src/ivm/union-fan-in.ts index 96ac07096d..d99d9a60cc 100644 --- a/packages/zql/src/ivm/union-fan-in.ts +++ b/packages/zql/src/ivm/union-fan-in.ts @@ -31,6 +31,7 @@ export class UnionFanIn implements Operator { this.#inputs = inputs; const fanOutSchema = fanOut.getSchema(); fanOut.setFanIn(this); + assert(fanOutSchema.sort !== undefined, 'UnionFanIn requires sorted input'); const schema: Writable = { tableName: fanOutSchema.tableName, diff --git a/packages/zql/src/query/test/test-schemas.ts b/packages/zql/src/query/test/test-schemas.ts index 54be563192..689f968471 100644 --- a/packages/zql/src/query/test/test-schemas.ts +++ b/packages/zql/src/query/test/test-schemas.ts @@ -84,6 +84,11 @@ const issueRelationships = relationships(issue, ({one, many}) => ({ destField: ['issueId'], destSchema: comment, }), + ownerComments: many({ + sourceField: ['ownerId'], + destField: ['authorId'], + destSchema: comment, + }), labels: many( { sourceField: ['id'], diff --git a/packages/zqlite/src/query-builder.ts b/packages/zqlite/src/query-builder.ts index 9e8d38af4f..e5b85ce3d3 100644 --- a/packages/zqlite/src/query-builder.ts +++ b/packages/zqlite/src/query-builder.ts @@ -9,6 +9,7 @@ import type { SchemaValue, ValueType, } from '../../zero-schema/src/table-schema.ts'; +import {assert} from '../../shared/src/asserts.ts'; import {sql} from './internal/sql.ts'; import type {Constraint} from '../../zql/src/ivm/constraint.ts'; import type {Start} from '../../zql/src/ivm/operator.ts'; @@ -27,7 +28,7 @@ export function buildSelectQuery( columns: Record, constraint: Constraint | undefined, filters: NoSubqueryCondition | undefined, - order: Ordering, + order: Ordering | undefined, reverse: boolean | undefined, start: Start | undefined, ) { @@ -38,6 +39,7 @@ export function buildSelectQuery( const constraints: SQLQuery[] = constraintsToSQL(constraint, columns); if (start) { + assert(order !== undefined, 'start requires ordering'); constraints.push(gatherStartConstraints(start, reverse, order, columns)); } @@ -49,7 +51,10 @@ export function buildSelectQuery( query = sql`${query} WHERE ${sql.join(constraints, sql` AND `)}`; } - return sql`${query} ${orderByToSQL(order, !!reverse)}`; + if (order && order.length > 0) { + return sql`${query} ${orderByToSQL(order, !!reverse)}`; + } + return query; } export function constraintsToSQL( diff --git a/packages/zqlite/src/table-source.ts b/packages/zqlite/src/table-source.ts index 24ecb40d25..e69841267d 100644 --- a/packages/zqlite/src/table-source.ts +++ b/packages/zqlite/src/table-source.ts @@ -21,6 +21,7 @@ import { import {makeComparator, type Node} from '../../zql/src/ivm/data.ts'; import { generateWithOverlay, + generateWithOverlayUnordered, generateWithStart, genPushAndWriteWithSplitEdit, type Connection, @@ -205,12 +206,12 @@ export class TableSource implements Source { ); } - #getSchema(connection: Connection): SourceSchema { + #getSchema(connection: Connection, unordered: boolean): SourceSchema { return { tableName: this.#table, columns: this.#columns, primaryKey: this.#primaryKey, - sort: connection.sort, + sort: unordered ? undefined : connection.sort, relationships: {}, isHidden: false, system: 'client', @@ -219,12 +220,17 @@ export class TableSource implements Source { } connect( - sort: Ordering, + sort: Ordering | undefined, filters?: Condition, splitEditKeys?: Set, debug?: DebugDelegate, ) { const transformedFilters = transformFilters(filters); + const unordered = sort === undefined; + // PK comparator is used for source-level overlay matching (remove by PK + // equality) even when no ordering is requested. + const primaryKeySort: Ordering = this.#primaryKey.map(k => [k, 'asc']); + const input: SourceInput = { getSchema: () => schema, fetch: req => this.#fetch(req, connection), @@ -251,11 +257,13 @@ export class TableSource implements Source { predicate: createPredicate(transformedFilters.filters), } : undefined, - compareRows: makeComparator(sort), + compareRows: sort ? makeComparator(sort) : makeComparator(primaryKeySort), lastPushedEpoch: 0, }; - const schema = this.#getSchema(connection); - assertOrderingIncludesPK(sort, this.#primaryKey); + const schema = this.#getSchema(connection, unordered); + if (!unordered) { + assertOrderingIncludesPK(sort, this.#primaryKey); + } this.#connections.push(connection); return input; @@ -277,20 +285,39 @@ export class TableSource implements Source { const sqlAndBindings = format(query); const cachedStatement = this.#stmts.cache.get(sqlAndBindings.text); + cachedStatement.statement.safeIntegers(true); + const rowIterator = cachedStatement.statement.iterate( + ...sqlAndBindings.values, + ); try { - cachedStatement.statement.safeIntegers(true); - const rowIterator = cachedStatement.statement.iterate( - ...sqlAndBindings.values, - ); - - const comparator = makeComparator(sort, req.reverse); - debug?.initQuery(this.#table, sqlAndBindings.text); - yield* generateWithStart( - generateWithYields( - generateWithOverlay( - req.start?.row, + if (sort) { + const comparator = makeComparator(sort, req.reverse); + yield* generateWithStart( + generateWithYields( + generateWithOverlay( + req.start?.row, + this.#mapFromSQLiteTypes( + this.#columns, + rowIterator, + sqlAndBindings.text, + debug, + ), + req.constraint, + this.#overlay, + connection.lastPushedEpoch, + comparator, + connection.filters?.predicate, + ), + this.#shouldYield, + ), + req.start, + comparator, + ); + } else { + yield* generateWithYields( + generateWithOverlayUnordered( this.#mapFromSQLiteTypes( this.#columns, rowIterator, @@ -300,15 +327,20 @@ export class TableSource implements Source { req.constraint, this.#overlay, connection.lastPushedEpoch, - comparator, + this.#primaryKey, connection.filters?.predicate, ), this.#shouldYield, - ), - req.start, - comparator, - ); + ); + } } finally { + // Ensure the SQLite iterate() is closed. Normally #mapFromSQLiteTypes + // closes it via its own finally block, but if the generator chain is + // returned before #mapFromSQLiteTypes was ever started (e.g., the + // unordered overlay yielded an add row before iterating the source), + // the SQLite iterator would remain active and lock the connection. + // Calling return() on an already-closed iterator is a safe no-op. + rowIterator.return?.(); if (debug) { let totalNvisit = 0; let i = 0; @@ -487,7 +519,7 @@ export class TableSource implements Source { #requestToSQL( request: FetchRequest, filters: NoSubqueryCondition | undefined, - order: Ordering, + order: Ordering | undefined, ): SQLQuery { return buildSelectQuery( this.#table, From 52618ec5f2ba2e43efe9d8039fb9804978ea1e20 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 26 Mar 2026 20:22:28 +0100 Subject: [PATCH 181/495] refactor: consolidate file size workflows and create reusable file sizes workflow (#5678) --- .github/workflows/bencher-benchmarks-pr.yml | 60 ----------- .github/workflows/bencher-benchmarks.yml | 48 --------- .github/workflows/bencher-file-sizes-pr.yml | 20 ++++ .github/workflows/bencher-file-sizes.yml | 12 +++ .github/workflows/reusable-file-sizes.yml | 105 ++++++++++++++++++++ 5 files changed, 137 insertions(+), 108 deletions(-) create mode 100644 .github/workflows/bencher-file-sizes-pr.yml create mode 100644 .github/workflows/bencher-file-sizes.yml create mode 100644 .github/workflows/reusable-file-sizes.yml diff --git a/.github/workflows/bencher-benchmarks-pr.yml b/.github/workflows/bencher-benchmarks-pr.yml index de256ab5ba..e6968a3335 100644 --- a/.github/workflows/bencher-benchmarks-pr.yml +++ b/.github/workflows/bencher-benchmarks-pr.yml @@ -5,66 +5,6 @@ on: types: [opened, reopened, edited, synchronize] jobs: - file_sizes: - name: File Sizes PR - # DO NOT REMOVE: For handling Fork PRs see Pull Requests from Forks - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository - - permissions: - pull-requests: write - runs-on: ubuntu-latest - env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: rocicorp - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-node@v6 - with: - node-version: 24.x - cache: 'npm' - - uses: bencherdev/bencher@main - - - run: npm ci - - - run: npm run build - - - name: Build npm zero package - working-directory: packages/zero - run: | - npm pack --pack-destination ./out - mv ./out/*.tgz ./out/zero-package.tgz - - - name: Build zero client single file package - working-directory: packages/zero - run: npx tsx tool/build.ts --bundle-sizes - - - name: Compress - working-directory: packages/zero - run: brotli out/zero.js - - - name: Upload PR benchmarks results to bencher.dev - working-directory: packages/zero - run: | - bencher run \ - --project zero \ - --token '${{ secrets.BENCHER_API_TOKEN }}' \ - --adapter json \ - --github-actions '${{ secrets.GITHUB_TOKEN }}' \ - --ci-id size \ - --branch "$GITHUB_HEAD_REF" \ - --start-point "$GITHUB_BASE_REF" \ - --start-point-hash '${{ github.event.pull_request.base.sha }}' \ - --start-point-clone-thresholds \ - --start-point-reset \ - --threshold-measure file-size \ - --threshold-test percentage \ - --threshold-upper-boundary 0.02 \ - --threshold-max-sample-size 2 \ - --err \ - --file-size out/zero-package.tgz \ - --file-size out/zero.js.br \ - --file-size out/zero.js - playwright-install: name: Install Playwright if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository diff --git a/.github/workflows/bencher-benchmarks.yml b/.github/workflows/bencher-benchmarks.yml index 11a99ff12f..97e330588f 100644 --- a/.github/workflows/bencher-benchmarks.yml +++ b/.github/workflows/bencher-benchmarks.yml @@ -5,54 +5,6 @@ on: branches: main jobs: - file_sizes: - name: File Sizes - permissions: - checks: write - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-node@v6 - with: - node-version: 24.x - cache: 'npm' - - uses: bencherdev/bencher@main - - - run: npm ci - - run: npm run build - - - name: Build npm zero package - working-directory: packages/zero - run: | - npm pack --pack-destination ./out - mv ./out/*.tgz ./out/zero-package.tgz - - - name: Build zero client single file package - working-directory: packages/zero - run: npx tsx tool/build.ts --bundle-sizes - - - name: Compress - working-directory: packages/zero - run: brotli out/zero.js - - - name: Upload benchmarks results to bencher.dev - working-directory: packages/zero - run: | - bencher run \ - --project zero \ - --token '${{ secrets.BENCHER_API_TOKEN }}' \ - --adapter json \ - --github-actions '${{ secrets.GITHUB_TOKEN }}' \ - --start-point main \ - --threshold-measure file-size \ - --threshold-test percentage \ - --threshold-upper-boundary 0.02 \ - --threshold-max-sample-size 2 \ - --err \ - --file-size out/zero-package.tgz \ - --file-size out/zero.js.br \ - --file-size out/zero.js - playwright-install: name: Install Playwright runs-on: self-hosted diff --git a/.github/workflows/bencher-file-sizes-pr.yml b/.github/workflows/bencher-file-sizes-pr.yml new file mode 100644 index 0000000000..0a04500a3b --- /dev/null +++ b/.github/workflows/bencher-file-sizes-pr.yml @@ -0,0 +1,20 @@ +name: Bencher File Sizes PR + +on: + pull_request: + types: [opened, reopened, edited, synchronize] + +jobs: + file_sizes: + name: File Sizes PR + # DO NOT REMOVE: For handling Fork PRs see Pull Requests from Forks + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository + uses: ./.github/workflows/reusable-file-sizes.yml + with: + is_pr: true + base_ref: ${{ github.event.pull_request.base.ref }} + head_ref: ${{ github.event.pull_request.head.ref }} + base_sha: ${{ github.event.pull_request.base.sha }} + secrets: + BENCHER_API_TOKEN: ${{ secrets.BENCHER_API_TOKEN }} + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} diff --git a/.github/workflows/bencher-file-sizes.yml b/.github/workflows/bencher-file-sizes.yml new file mode 100644 index 0000000000..270fd28786 --- /dev/null +++ b/.github/workflows/bencher-file-sizes.yml @@ -0,0 +1,12 @@ +name: Bencher File Sizes + +on: + push: + branches: main + +jobs: + file_sizes: + name: File Sizes + uses: ./.github/workflows/reusable-file-sizes.yml + secrets: + BENCHER_API_TOKEN: ${{ secrets.BENCHER_API_TOKEN }} diff --git a/.github/workflows/reusable-file-sizes.yml b/.github/workflows/reusable-file-sizes.yml new file mode 100644 index 0000000000..c401b2cf70 --- /dev/null +++ b/.github/workflows/reusable-file-sizes.yml @@ -0,0 +1,105 @@ +name: Reusable File Sizes Workflow + +on: + workflow_call: + inputs: + is_pr: + required: false + type: boolean + default: false + description: 'Whether this is a PR run' + base_ref: + required: false + type: string + description: 'Base ref for PR runs' + head_ref: + required: false + type: string + description: 'Head ref for PR runs' + base_sha: + required: false + type: string + description: 'Base SHA for PR runs' + secrets: + BENCHER_API_TOKEN: + required: true + TURBO_TOKEN: + required: false + +jobs: + file_sizes: + name: File Sizes + permissions: + checks: write + pull-requests: write + runs-on: ubuntu-latest + env: + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: rocicorp + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: 24.x + cache: 'npm' + - uses: bencherdev/bencher@main + + - run: npm ci + - run: npm run build + + - name: Build npm zero package + working-directory: packages/zero + run: | + npm pack --pack-destination ./out + mv ./out/*.tgz ./out/zero-package.tgz + + - name: Build zero client single file package + working-directory: packages/zero + run: npx tsx tool/build.ts --bundle-sizes + + - name: Compress + working-directory: packages/zero + run: brotli out/zero.js + + - name: Upload benchmarks results to bencher.dev (main) + if: ${{ !inputs.is_pr }} + working-directory: packages/zero + run: | + bencher run \ + --project zero \ + --token '${{ secrets.BENCHER_API_TOKEN }}' \ + --adapter json \ + --github-actions '${{ secrets.GITHUB_TOKEN }}' \ + --start-point main \ + --threshold-measure file-size \ + --threshold-test percentage \ + --threshold-upper-boundary 0.02 \ + --threshold-max-sample-size 2 \ + --err \ + --file-size out/zero-package.tgz \ + --file-size out/zero.js.br \ + --file-size out/zero.js + + - name: Upload PR benchmarks results to bencher.dev + if: ${{ inputs.is_pr }} + working-directory: packages/zero + run: | + bencher run \ + --project zero \ + --token '${{ secrets.BENCHER_API_TOKEN }}' \ + --adapter json \ + --github-actions '${{ secrets.GITHUB_TOKEN }}' \ + --ci-id size \ + --branch "${{ inputs.head_ref }}" \ + --start-point "${{ inputs.base_ref }}" \ + --start-point-hash '${{ inputs.base_sha }}' \ + --start-point-clone-thresholds \ + --start-point-reset \ + --threshold-measure file-size \ + --threshold-test percentage \ + --threshold-upper-boundary 0.02 \ + --threshold-max-sample-size 2 \ + --err \ + --file-size out/zero-package.tgz \ + --file-size out/zero.js.br \ + --file-size out/zero.js From b60a96705ac4f1b177c86c4ad66c52f343d83e7d Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 26 Mar 2026 22:34:04 +0100 Subject: [PATCH 182/495] chore: Fix lint script in packages (#5684) --- apps/otel-proxy/package.json | 4 +- apps/zbugs/package.json | 8 +- apps/zql-viz/package.json | 2 +- oxlint.config.ts | 6 +- package-lock.json | 8820 +++++------------- package.json | 14 +- packages/analyze-query/package.json | 2 +- packages/ast-to-zql/package.json | 2 +- packages/datadog/package.json | 4 +- packages/otel/package.json | 2 +- packages/replicache-perf/package.json | 2 +- packages/replicache/package.json | 4 +- packages/shared/package.json | 4 +- packages/shared/src/tool/vitest-config.ts | 1 + packages/z2s/package.json | 4 +- packages/zero-cache/package.json | 6 +- packages/zero-client/package.json | 2 +- packages/zero-client/tsconfig.json | 1 + packages/zero-events/package.json | 2 +- packages/zero-events/tsconfig.json | 1 + packages/zero-pg/package.json | 4 +- packages/zero-protocol/package.json | 2 +- packages/zero-protocol/src/error.test.ts | 1 - packages/zero-react-native/package.json | 2 +- packages/zero-react/package.json | 2 +- packages/zero-schema/package.json | 2 +- packages/zero-server/package.json | 4 +- packages/zero-solid/package.json | 2 +- packages/zero-types/package.json | 2 +- packages/zero/package.json | 6 +- packages/zero/tsconfig.json | 1 + packages/zql-benchmarks/package.json | 2 +- packages/zql-integration-tests/package.json | 2 +- packages/zql/package.json | 2 +- packages/zqlite-zql-test/package.json | 4 +- packages/zqlite/package.json | 2 +- prod/functions/package.json | 2 +- tools/client-simulator/package.json | 2 +- tools/load-generator/package.json | 2 +- tools/process-tracker/package.json | 2 +- tools/sqlite-io-yield-simulator/package.json | 2 +- tools/verify-package-deps/package.json | 2 +- 42 files changed, 2293 insertions(+), 6650 deletions(-) diff --git a/apps/otel-proxy/package.json b/apps/otel-proxy/package.json index ffb96f4206..06b97b1616 100644 --- a/apps/otel-proxy/package.json +++ b/apps/otel-proxy/package.json @@ -18,8 +18,8 @@ }, "devDependencies": { "@types/node": "^22.10.5", - "@vitest/coverage-v8": "4.1.0", + "@vitest/coverage-v8": "4.1.2", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" } } diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 5bead83938..0ff541243c 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -80,8 +80,8 @@ "@types/react": "^18.3.18", "@types/react-dom": "18.3.5", "@vitejs/plugin-react": "^6.0.1", - "@vitest/runner": "4.1.0", - "drizzle-kit": "0.31.9", + "@vitest/runner": "4.1.2", + "drizzle-kit": "^0.31.10", "drizzle-orm": "^0.45.1", "postcss-preset-env": "^7.4.3", "prettier": "^3.8.1", @@ -90,9 +90,9 @@ "tailwindcss": "^3.0.23", "tsx": "^4.21.0", "typescript": "~5.9.3", - "vite": "8.0.0", + "vite": "8.0.3", "vite-bundle-analyzer": "^1.3.6", "vite-plugin-svgr": "^4.5.0", - "vitest": "4.1.0" + "vitest": "4.1.2" } } diff --git a/apps/zql-viz/package.json b/apps/zql-viz/package.json index ff49fc0431..0e9abc407e 100644 --- a/apps/zql-viz/package.json +++ b/apps/zql-viz/package.json @@ -24,7 +24,7 @@ "@types/react-dom": "18.3.5", "@vitejs/plugin-react": "^6.0.1", "typescript": "~5.9.3", - "vite": "8.0.0", + "vite": "8.0.3", "zero-types": "0.0.0", "zql": "0.0.0" } diff --git a/oxlint.config.ts b/oxlint.config.ts index 28612b48b0..9eab6c1867 100644 --- a/oxlint.config.ts +++ b/oxlint.config.ts @@ -1,10 +1,10 @@ -import {defineConfig} from 'oxlint'; -import {baseConfig} from './oxlint.base.ts'; +import { defineConfig } from 'oxlint'; +import { baseConfig } from './oxlint.base.ts'; export default defineConfig({ ...baseConfig, options: { - typeAware: true, reportUnusedDisableDirectives: 'error', + typeAware: true }, }); diff --git a/package-lock.json b/package-lock.json index 92c0a34bab..dcdf7fd9e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,17 +14,17 @@ "tools/*" ], "devDependencies": { - "@vitest/browser-playwright": "^4.1.0", - "@vitest/coverage-v8": "4.1.0", - "@vitest/runner": "4.1.0", - "baseline-browser-mapping": "^2.10.8", - "oxlint": "^1.56.0", - "oxlint-tsgolint": "^0.17.0", + "@vitest/browser-playwright": "^4.1.2", + "@vitest/coverage-v8": "4.1.2", + "@vitest/runner": "4.1.2", + "baseline-browser-mapping": "^2.10.11", + "oxlint": "^1.57.0", + "oxlint-tsgolint": "^0.17.4", "prettier": "^3.8.1", "syncpack": "^14.2.1", "tsx": "^4.21.0", "turbo": "^2.4.4", - "vitest": "4.1.0" + "vitest": "4.1.2" }, "engines": { "node": ">=22" @@ -37,9 +37,9 @@ }, "devDependencies": { "@types/node": "^22.10.5", - "@vitest/coverage-v8": "4.1.0", + "@vitest/coverage-v8": "4.1.2", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" } }, "apps/zbugs": { @@ -90,8 +90,8 @@ "@types/react": "^18.3.18", "@types/react-dom": "18.3.5", "@vitejs/plugin-react": "^6.0.1", - "@vitest/runner": "4.1.0", - "drizzle-kit": "0.31.9", + "@vitest/runner": "4.1.2", + "drizzle-kit": "^0.31.10", "drizzle-orm": "^0.45.1", "postcss-preset-env": "^7.4.3", "prettier": "^3.8.1", @@ -100,68 +100,412 @@ "tailwindcss": "^3.0.23", "tsx": "^4.21.0", "typescript": "~5.9.3", - "vite": "8.0.0", + "vite": "8.0.3", "vite-bundle-analyzer": "^1.3.6", "vite-plugin-svgr": "^4.5.0", - "vitest": "4.1.0" + "vitest": "4.1.2" } }, - "apps/zbugs/node_modules/drizzle-kit": { - "version": "0.31.9", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.9.tgz", - "integrity": "sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg==", + "apps/zbugs/node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "dev": true, "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@drizzle-team/brocli": "^0.10.2", - "@esbuild-kit/esm-loader": "^2.5.5", - "esbuild": "^0.25.4", - "esbuild-register": "^3.5.0" + "@napi-rs/wasm-runtime": "^1.1.1" }, - "bin": { - "drizzle-kit": "bin.cjs" + "engines": { + "node": ">=14.0.0" } }, - "apps/zbugs/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "apps/zbugs/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zbugs/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "dev": true, + "license": "MIT" + }, + "apps/zbugs/node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" + }, "bin": { - "esbuild": "bin/esbuild" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + } + }, + "apps/zbugs/node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "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.1.0", + "esbuild": "^0.27.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 + } } }, "apps/zql-viz": { @@ -181,11 +525,413 @@ "@types/react-dom": "18.3.5", "@vitejs/plugin-react": "^6.0.1", "typescript": "~5.9.3", - "vite": "8.0.0", + "vite": "8.0.3", "zero-types": "0.0.0", "zql": "0.0.0" } }, + "apps/zql-viz/node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "apps/zql-viz/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "dev": true, + "license": "MIT" + }, + "apps/zql-viz/node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + } + }, + "apps/zql-viz/node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "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.1.0", + "esbuild": "^0.27.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/@algolia/abtesting": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.2.tgz", @@ -1772,42 +2518,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", - "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-syntax-decorators": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", - "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -1820,82 +2530,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", - "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -1908,40 +2542,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.28.6.tgz", - "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", - "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", @@ -1972,34 +2572,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", @@ -2015,124 +2587,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", @@ -2435,24 +2889,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", - "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-flow": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", @@ -2866,40 +3302,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", @@ -3361,27 +3763,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", @@ -7407,542 +7788,50 @@ "license": "MIT", "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@esbuild-kit/esm-loader": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "deprecated": "Merged into tsx: https://tsx.is", - "dev": true, - "license": "MIT", - "dependencies": { - "@esbuild-kit/core-utils": "^3.3.2", - "get-tsconfig": "^4.7.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ - "x64" + "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" ], @@ -7950,33 +7839,33 @@ "license": "MIT", "optional": true, "os": [ - "openbsd" + "netbsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openharmony" + "openbsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" ], @@ -7987,13 +7876,13 @@ "sunos" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" ], @@ -8004,13 +7893,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" ], @@ -8021,13 +7910,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -8038,728 +7927,499 @@ "win32" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@expo/code-signing-certificates": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", - "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "node-forge": "^1.3.3" - } - }, - "node_modules/@expo/config": { - "version": "55.0.8", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.8.tgz", - "integrity": "sha512-D7RYYHfErCgEllGxNwdYdkgzLna7zkzUECBV3snbUpf7RvIpB5l1LpCgzuVoc5KVew5h7N1Tn4LnT/tBSUZsQg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config-plugins": "~55.0.6", - "@expo/config-types": "^55.0.5", - "@expo/json-file": "^10.0.12", - "@expo/require-utils": "^55.0.2", - "deepmerge": "^4.3.1", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "resolve-from": "^5.0.0", - "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", - "slugify": "^1.3.4" - } - }, - "node_modules/@expo/config-plugins": { - "version": "55.0.6", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-55.0.6.tgz", - "integrity": "sha512-cIox6FjZlFaaX40rbQ3DvP9e87S5X85H9uw+BAxJE5timkMhuByy3GAlOsj1h96EyzSiol7Q6YIGgY1Jiz4M+A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config-types": "^55.0.5", - "@expo/json-file": "~10.0.12", - "@expo/plist": "^0.5.2", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/@expo/config-plugins/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@expo/config-plugins/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@expo/config-plugins/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/config-plugins/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/config-types": { - "version": "55.0.5", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-55.0.5.tgz", - "integrity": "sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@expo/config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/devcert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", - "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/sudo-prompt": "^9.3.1", - "debug": "^3.1.0" - } - }, - "node_modules/@expo/devcert/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@expo/env": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.1.1.tgz", - "integrity": "sha512-rVvHC4I6xlPcg+mAO09ydUi2Wjv1ZytpLmHOSzvXzBAz9mMrJggqCe4s4dubjJvi/Ino/xQCLhbaLCnTtLpikg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "getenv": "^2.0.0" - }, - "engines": { - "node": ">=20.12.0" - } - }, - "node_modules/@expo/env/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@expo/env/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@expo/env/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@expo/fingerprint": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.16.6.tgz", - "integrity": "sha512-nRITNbnu3RKSHPvKVehrSU4KG2VY9V8nvULOHBw98ukHCAU4bGrU5APvcblOkX3JAap+xEHsg/mZvqlvkLInmQ==", + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "peer": true, - "dependencies": { - "@expo/env": "^2.0.11", - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "ignore": "^5.3.1", - "minimatch": "^10.2.2", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - }, "bin": { - "fingerprint": "bin/cli.js" - } - }, - "node_modules/@expo/fingerprint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=8" + "node": ">=12" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, - "node_modules/@expo/fingerprint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "deprecated": "Merged into tsx: https://tsx.is", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@expo/fingerprint/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" } }, - "node_modules/@expo/fingerprint/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==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@expo/fingerprint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/image-utils": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.12.tgz", - "integrity": "sha512-3KguH7kyKqq7pNwLb9j6BBdD/bjmNwXZG/HPWT6GWIXbwrvAJt2JNyYTP5agWJ8jbbuys1yuCzmkX+TU6rmI7A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "getenv": "^2.0.0", - "jimp-compact": "0.16.1", - "parse-png": "^2.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" + "node": ">=18" } }, - "node_modules/@expo/image-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/@expo/image-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/@expo/image-utils/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==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@expo/image-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/json-file": { - "version": "10.0.12", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.12.tgz", - "integrity": "sha512-inbDycp1rMAelAofg7h/mMzIe+Owx6F7pur3XdQ3EPTy00tme+4P6FWgHKUcjN8dBSrnbRNpSyh5/shzHyVCyQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.20.0", - "json5": "^2.2.3" - } - }, - "node_modules/@expo/local-build-cache-provider": { - "version": "55.0.6", - "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.6.tgz", - "integrity": "sha512-4kfdv48sKzokijMqi07fINYA9/XprshmPgSLf8i69XgzIv2YdRyBbb70SzrufB7PDneFoltz8N83icW8gOOj1g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config": "~55.0.8", - "chalk": "^4.1.2" + "node": ">=18" } }, - "node_modules/@expo/local-build-cache-provider/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/@expo/local-build-cache-provider/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/@expo/local-build-cache-provider/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@expo/metro": { - "version": "54.2.0", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", - "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@expo/osascript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.2.tgz", - "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@expo/spawn-async": "^1.7.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@expo/package-manager": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.3.tgz", - "integrity": "sha512-ZuXiK/9fCrIuLjPSe1VYmfp0Sa85kCMwd8QQpgyi5ufppYKRtLBg14QOgUqj8ZMbJTxE0xqzd0XR7kOs3vAK9A==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@expo/json-file": "^10.0.12", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "resolve-workspace-root": "^2.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@expo/package-manager/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/@expo/package-manager/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/@expo/package-manager/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@expo/plist": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.2.tgz", - "integrity": "sha512-o4xdVdBpe4aTl3sPMZ2u3fJH4iG1I768EIRk1xRZP+GaFI93MaR3JvoFibYqxeTmLQ1p1kNEVqylfUjezxx45g==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@expo/require-utils": { - "version": "55.0.2", - "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.2.tgz", - "integrity": "sha512-dV5oCShQ1umKBKagMMT4B/N+SREsQe3lU4Zgmko5AO0rxKV0tynZT6xXs+e2JxuqT4Rz997atg7pki0BnZb4uw==", + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8" - }, - "peerDependencies": { - "typescript": "^5.0.0 || ^5.0.0-0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@expo/schema-utils": { - "version": "55.0.2", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.2.tgz", - "integrity": "sha512-QZ5WKbJOWkCrMq0/kfhV9ry8te/OaS34YgLVpG8u9y2gix96TlpRTbxM/YATjNcUR2s4fiQmPCOxkGtog4i37g==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@expo/sdk-runtime-versions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", - "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@expo/spawn-async": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", - "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@expo/sudo-prompt": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", - "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@expo/ws-tunnel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", - "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@expo/xcpretty": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.1.tgz", - "integrity": "sha512-KZNxZvnGCtiM2aYYZ6Wz0Ix5r47dAvpNLApFtZWnSoERzAdOMzVBOPysBoM0JlF6FKWZ8GPqgn6qt3dV/8Zlpg==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.20.0", - "chalk": "^4.1.0", - "js-yaml": "^4.1.0" - }, - "bin": { - "excpretty": "build/cli.js" + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@expo/xcpretty/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/@expo/xcpretty/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/@expo/xcpretty/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/@faker-js/faker": { @@ -9429,204 +9089,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "dev": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -9639,98 +9101,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -12932,6 +12302,7 @@ "version": "0.115.0", "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", + "dev": true, "license": "MIT", "engines": { "node": "^20.19.0 || >=22.12.0" @@ -12941,15 +12312,16 @@ "version": "0.115.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" } }, "node_modules/@oxlint-tsgolint/darwin-arm64": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.17.0.tgz", - "integrity": "sha512-z3XwCDuOAKgk7bO4y5tyH8Zogwr51G56R0XGKC3tlAbrAq8DecoxAd3qhRZqWBMG2Gzl5bWU3Ghu7lrxuLPzYw==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.17.4.tgz", + "integrity": "sha512-XEA7vl/T1+wiVnMq2MR6u5OYr2pwKHiAPgklxpK8tPrjQ1ci/amNmwI8ECn6TPXSCsC8SJsSN5xvzXm5H3dTfw==", "cpu": [ "arm64" ], @@ -12961,9 +12333,9 @@ ] }, "node_modules/@oxlint-tsgolint/darwin-x64": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.17.0.tgz", - "integrity": "sha512-TZgVXy0MtI8nt0MYiceuZhHPwHcwlIZ/YwzFTAKrgdHiTvVzFbqHVdXi5wbZfT/o1nHGw9fbGWPlb6qKZ4uZ9Q==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.17.4.tgz", + "integrity": "sha512-EY2wmHWqkz72B0/ddMiAM564ZXpEuN1i7JqJJhLmDUQfiHX0/X0EqK3xlSScMCFcVicitOxbKO9oqbde3658yg==", "cpu": [ "x64" ], @@ -12975,9 +12347,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-arm64": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.17.0.tgz", - "integrity": "sha512-IDfhFl/Y8bjidCvAP6QAxVyBsl78TmfCHlfjtEv2XtJXgYmIwzv6muO18XMp74SZ2qAyD4y2n2dUedrmghGHeA==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.17.4.tgz", + "integrity": "sha512-XL2X8hgp3/TZWeHFLUnWrveTCBPxy1kNtpzfvVkLtBgyoaRyopPYL0Mnm+ypXKgGvUdcjDaiJhnRjFHWmqZkew==", "cpu": [ "arm64" ], @@ -12989,9 +12361,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-x64": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.17.0.tgz", - "integrity": "sha512-Bgdgqx/m8EnfjmmlRLEeYy9Yhdt1GdFrMr5mTu/NyLRGkB1C9VLAikdxB7U9QambAGTAmjMbHNFDFk8Vx69Huw==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.17.4.tgz", + "integrity": "sha512-jT+aWtQuU8jefwfBLAZu16p4t8xUDjxL6KKlOeuwX3cS6NO60ITJ4Glm8eQYq5cGsOmYIKXNIe4ckPpL5LC+5g==", "cpu": [ "x64" ], @@ -13003,9 +12375,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-arm64": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.17.0.tgz", - "integrity": "sha512-dO6wyKMDqFWh1vwr+zNZS7/ovlfGgl4S3P1LDy4CKjP6V6NGtdmEwWkWax8j/I8RzGZdfXKnoUfb/qhVg5bx0w==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.17.4.tgz", + "integrity": "sha512-pnnkBaI5tHBFhx+EhmpUHccBT3VOAXTgWK2eQBVLE4a/ywhpHN+8D6/QQN+ZTaA4LTkKowvlGD6vDOVP5KRPvw==", "cpu": [ "arm64" ], @@ -13017,9 +12389,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-x64": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.17.0.tgz", - "integrity": "sha512-lPGYFp3yX2nh6hLTpIuMnJbZnt3Df42VkoA/fSkMYi2a/LXdDytQGpgZOrb5j47TICARd34RauKm0P3OA4Oxbw==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.17.4.tgz", + "integrity": "sha512-JxT81aEUBNA/s01Ql2OQ2DLAsuM0M+mK9iLHunukOdPMhjA6NvFE/GtTablBYJKScK21d/xTvnoSLgQU3l22Cw==", "cpu": [ "x64" ], @@ -13031,9 +12403,9 @@ ] }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.56.0.tgz", - "integrity": "sha512-IyfYPthZyiSKwAv/dLjeO18SaK8MxLI9Yss2JrRDyweQAkuL3LhEy7pwIwI7uA3KQc1Vdn20kdmj3q0oUIQL6A==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.57.0.tgz", + "integrity": "sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==", "cpu": [ "arm" ], @@ -13048,9 +12420,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.56.0.tgz", - "integrity": "sha512-Ga5zYrzH6vc/VFxhn6MmyUnYEfy9vRpwTIks99mY3j6Nz30yYpIkWryI0QKPCgvGUtDSXVLEaMum5nA+WrNOSg==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.57.0.tgz", + "integrity": "sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==", "cpu": [ "arm64" ], @@ -13065,9 +12437,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.56.0.tgz", - "integrity": "sha512-ogmbdJysnw/D4bDcpf1sPLpFThZ48lYp4aKYm10Z/6Nh1SON6NtnNhTNOlhEY296tDFItsZUz+2tgcSYqh8Eyw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.57.0.tgz", + "integrity": "sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==", "cpu": [ "arm64" ], @@ -13082,9 +12454,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.56.0.tgz", - "integrity": "sha512-x8QE1h+RAtQ2g+3KPsP6Fk/tdz6zJQUv5c7fTrJxXV3GHOo+Ry5p/PsogU4U+iUZg0rj6hS+E4xi+mnwwlDCWQ==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.57.0.tgz", + "integrity": "sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==", "cpu": [ "x64" ], @@ -13099,9 +12471,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.56.0.tgz", - "integrity": "sha512-6G+WMZvwJpMvY7my+/SHEjb7BTk/PFbePqLpmVmUJRIsJMy/UlyYqjpuh0RCgYYkPLcnXm1rUM04kbTk8yS1Yg==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.57.0.tgz", + "integrity": "sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==", "cpu": [ "x64" ], @@ -13116,9 +12488,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.56.0.tgz", - "integrity": "sha512-YYHBsk/sl7fYwQOok+6W5lBPeUEvisznV/HZD2IfZmF3Bns6cPC3Z0vCtSEOaAWTjYWN3jVsdu55jMxKlsdlhg==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.57.0.tgz", + "integrity": "sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==", "cpu": [ "arm" ], @@ -13133,9 +12505,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.56.0.tgz", - "integrity": "sha512-+AZK8rOUr78y8WT6XkDb04IbMRqauNV+vgT6f8ZLOH8wnpQ9i7Nol0XLxAu+Cq7Sb+J9wC0j6Km5hG8rj47/yQ==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.57.0.tgz", + "integrity": "sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==", "cpu": [ "arm" ], @@ -13150,13 +12522,16 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.56.0.tgz", - "integrity": "sha512-urse2SnugwJRojUkGSSeH2LPMaje5Q50yQtvtL9HFckiyeqXzoFwOAZqD5TR29R2lq7UHidfFDM9EGcchcbb8A==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.57.0.tgz", + "integrity": "sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13167,13 +12542,16 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.56.0.tgz", - "integrity": "sha512-rkTZkBfJ4TYLjansjSzL6mgZOdN5IvUnSq3oNJSLwBcNvy3dlgQtpHPrRxrCEbbcp7oQ6If0tkNaqfOsphYZ9g==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.57.0.tgz", + "integrity": "sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13184,13 +12562,16 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.56.0.tgz", - "integrity": "sha512-uqL1kMH3u69/e1CH2EJhP3CP28jw2ExLsku4o8RVAZ7fySo9zOyI2fy9pVlTAp4voBLVgzndXi3SgtdyCTa2aA==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.57.0.tgz", + "integrity": "sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13201,13 +12582,16 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.56.0.tgz", - "integrity": "sha512-j0CcMBOgV6KsRaBdsebIeiy7hCjEvq2KdEsiULf2LZqAq0v1M1lWjelhCV57LxsqaIGChXFuFJ0RiFrSRHPhSg==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.57.0.tgz", + "integrity": "sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13218,13 +12602,16 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.56.0.tgz", - "integrity": "sha512-7VDOiL8cDG3DQ/CY3yKjbV1c4YPvc4vH8qW09Vv+5ukq3l/Kcyr6XGCd5NvxUmxqDb2vjMpM+eW/4JrEEsUetA==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.57.0.tgz", + "integrity": "sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13235,13 +12622,16 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.56.0.tgz", - "integrity": "sha512-JGRpX0M+ikD3WpwJ7vKcHKV6Kg0dT52BW2Eu2BupXotYeqGXBrbY+QPkAyKO6MNgKozyTNaRh3r7g+VWgyAQYQ==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.57.0.tgz", + "integrity": "sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13252,13 +12642,16 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.56.0.tgz", - "integrity": "sha512-dNaICPvtmuxFP/VbqdofrLqdS3bM/AKJN3LMJD52si44ea7Be1cBk6NpfIahaysG9Uo+L98QKddU9CD5L8UHnQ==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.57.0.tgz", + "integrity": "sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13269,13 +12662,16 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.56.0.tgz", - "integrity": "sha512-pF1vOtM+GuXmbklM1hV8WMsn6tCNPvkUzklj/Ej98JhlanbmA2RB1BILgOpwSuCTRTIYx2MXssmEyQQ90QF5aA==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.57.0.tgz", + "integrity": "sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13286,9 +12682,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.56.0.tgz", - "integrity": "sha512-bp8NQ4RE6fDIFLa4bdBiOA+TAvkNkg+rslR+AvvjlLTYXLy9/uKAYLQudaQouWihLD/hgkrXIKKzXi5IXOewwg==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.57.0.tgz", + "integrity": "sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==", "cpu": [ "arm64" ], @@ -13303,9 +12699,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.56.0.tgz", - "integrity": "sha512-PxT4OJDfMOQBzo3OlzFb9gkoSD+n8qSBxyVq2wQSZIHFQYGEqIRTo9M0ZStvZm5fdhMqaVYpOnJvH2hUMEDk/g==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.57.0.tgz", + "integrity": "sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==", "cpu": [ "arm64" ], @@ -13320,9 +12716,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.56.0.tgz", - "integrity": "sha512-PTRy6sIEPqy2x8PTP1baBNReN/BNEFmde0L+mYeHmjXE1Vlcc9+I5nsqENsB2yAm5wLkzPoTNCMY/7AnabT4/A==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.57.0.tgz", + "integrity": "sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==", "cpu": [ "ia32" ], @@ -13337,9 +12733,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.56.0.tgz", - "integrity": "sha512-ZHa0clocjLmIDr+1LwoWtxRcoYniAvERotvwKUYKhH41NVfl0Y4LNbyQkwMZzwDvKklKGvGZ5+DAG58/Ik47tQ==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.57.0.tgz", + "integrity": "sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==", "cpu": [ "x64" ], @@ -14033,431 +13429,6 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-native/assets-registry": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.84.1.tgz", - "integrity": "sha512-lAJ6PDZv95FdT9s9uhc9ivhikW1Zwh4j9XdXM7J2l4oUA3t37qfoBmTSDLuPyE3Bi+Xtwa11hJm0BUTT2sc/gg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.83.2.tgz", - "integrity": "sha512-XbcN/BEa64pVlb0Hb/E/Ph2SepjVN/FcNKrJcQvtaKZA6mBSO8pW8Eircdlr61/KBH94LihHbQoQDzkQFpeaTg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.83.2" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.83.2.tgz", - "integrity": "sha512-X/RAXDfe6W+om/Fw1i6htTxQXFhBJ2jgNOWx3WpI3KbjeIWbq7ib6vrpTeIAW2NUMg+K3mML1NzgD4dpZeqdjA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.83.2", - "babel-plugin-syntax-hermes-parser": "0.32.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-parser": "0.32.0" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.2.tgz", - "integrity": "sha512-9uK6X1miCXqtL4c759l74N/XbQeneWeQVjoV7SD2CGJuW7ZefxaoYenwGPs7rMoCdtS6wuIyR3hXQ+uWEBGYXA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.32.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen/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", - "peer": true - }, - "node_modules/@react-native/codegen/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@react-native/codegen/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@react-native/codegen/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", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.84.1.tgz", - "integrity": "sha512-f6a+mJEJ6Joxlt/050TqYUr7uRRbeKnz8lnpL7JajhpsgZLEbkJRjH8HY5QiLcRdUwWFtizml4V+vcO3P4RxoQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native/dev-middleware": "0.84.1", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.83.3", - "metro-config": "^0.83.3", - "metro-core": "^0.83.3", - "semver": "^7.1.3" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@react-native-community/cli": "*", - "@react-native/metro-config": "*" - }, - "peerDependenciesMeta": { - "@react-native-community/cli": { - "optional": true - }, - "@react-native/metro-config": { - "optional": true - } - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.84.1.tgz", - "integrity": "sha512-rUU/Pyh3R5zT0WkVgB+yA6VwOp7HM5Hz4NYE97ajFS07OUIcv8JzBL3MXVdSSjLfldfqOuPEuKUaZcAOwPgabw==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-shell": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.84.1.tgz", - "integrity": "sha512-LIGhh4q4ette3yW5OzmukNMYwmINYrRGDZqKyTYc/VZyNpblZPw72coXVHXdfpPT6+YlxHqXzn3UjFZpNODGCQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.6", - "debug": "^4.4.0", - "fb-dotslash": "0.5.8" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.84.1.tgz", - "integrity": "sha512-Z83ra+Gk6ElAhH3XRrv3vwbwCPTb04sPPlNpotxcFZb5LtRQZwT91ZQEXw3GOJCVIFp9EQ/gj8AQbVvtHKOUlQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.84.1", - "@react-native/debugger-shell": "0.84.1", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^7.5.10" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.2.tgz", - "integrity": "sha512-t4fYfa7xopbUF5S4+ihNEwgaq4wLZLKLY0Ms8z72lkMteVd3bOX2Foxa8E2wTfRvdhPOkSpOsTeNDmD8ON4DoQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/debugger-shell": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.2.tgz", - "integrity": "sha512-z9go6NJMsLSDJT5MW6VGugRsZHjYvUTwxtsVc3uLt4U9W6T3J6FWI2wHpXIzd2dUkXRfAiRQ3Zi8ZQQ8fRFg9A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.6", - "fb-dotslash": "0.5.8" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.2.tgz", - "integrity": "sha512-Zi4EVaAm28+icD19NN07Gh8Pqg/84QQu+jn4patfWKNkcToRFP5vPEbbp0eLOGWS+BVB1d1Fn5lvMrJsBbFcOg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.83.2", - "@react-native/debugger-shell": "0.83.2", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^7.5.10" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.84.1.tgz", - "integrity": "sha512-7uVlPBE3uluRNRX4MW7PUJIO1LDBTpAqStKHU7LHH+GRrdZbHsWtOEAX8PiY4GFfBEvG8hEjiuTOqAxMjV+hDg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.84.1.tgz", - "integrity": "sha512-UsTe2AbUugsfyI7XIHMQq4E7xeC8a6GrYwuK+NohMMMJMxmyM3JkzIk+GB9e2il6ScEQNMJNaj+q+i5za8itxQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.2.tgz", - "integrity": "sha512-gkZAb9LoVVzNuYzzOviH7DiPTXQoZPHuiTH2+O2+VWNtOkiznjgvqpwYAhg58a5zfRq5GXlbBdf5mzRj5+3Y5Q==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@react-stately/flags": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz", @@ -14561,6 +13532,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14577,6 +13549,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14593,6 +13566,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14609,6 +13583,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14625,6 +13600,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14641,6 +13617,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14657,6 +13634,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14673,6 +13651,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14689,6 +13668,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14705,6 +13685,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14721,6 +13702,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14737,6 +13719,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14753,6 +13736,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -14769,6 +13753,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14785,6 +13770,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15064,28 +14050,6 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, "node_modules/@slorber/remark-comment": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", @@ -16702,17 +15666,6 @@ "@types/send": "*" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/gtag.js": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", @@ -17085,14 +16038,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@types/strip-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-ansi/-/strip-ansi-3.0.0.tgz", @@ -17453,45 +16398,45 @@ } }, "node_modules/@vitest/browser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.0.tgz", - "integrity": "sha512-tG/iOrgbiHQks0ew7CdelUyNEHkv8NLrt+CqdTivIuoSnXvO7scWMn4Kqo78/UGY1NJ6Hv+vp8BvRnED/bjFdQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.2.tgz", + "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", "dev": true, "license": "MIT", "dependencies": { "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/mocker": "4.1.2", + "@vitest/utils": "4.1.2", "magic-string": "^0.30.21", "pngjs": "^7.0.0", "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", + "tinyrainbow": "^3.1.0", "ws": "^8.19.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.1.0" + "vitest": "4.1.2" } }, "node_modules/@vitest/browser-playwright": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.0.tgz", - "integrity": "sha512-2RU7pZELY9/aVMLmABNy1HeZ4FX23FXGY1jRuHLHgWa2zaAE49aNW2GLzebW+BmbTZIKKyFF1QXvk7DEWViUCQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.2.tgz", + "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/browser": "4.1.0", - "@vitest/mocker": "4.1.0", - "tinyrainbow": "^3.0.3" + "@vitest/browser": "4.1.2", + "@vitest/mocker": "4.1.2", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "playwright": "*", - "vitest": "4.1.0" + "vitest": "4.1.2" }, "peerDependenciesMeta": { "playwright": { @@ -17500,14 +16445,14 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.0.tgz", - "integrity": "sha512-nDWulKeik2bL2Va/Wl4x7DLuTKAXa906iRFooIRPR+huHkcvp9QDkPQ2RJdmjOFrqOqvNfoSQLF68deE3xC3CQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.2.tgz", + "integrity": "sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.0", + "@vitest/utils": "4.1.2", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", @@ -17515,14 +16460,14 @@ "magicast": "^0.5.2", "obug": "^2.1.1", "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.1.0", - "vitest": "4.1.0" + "@vitest/browser": "4.1.2", + "vitest": "4.1.2" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -17531,31 +16476,31 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", - "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", + "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", "chai": "^6.2.2", - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", - "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", + "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.0", + "@vitest/spy": "4.1.2", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -17564,7 +16509,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "msw": { @@ -17576,26 +16521,26 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", - "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", + "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", - "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", + "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.0", + "@vitest/utils": "4.1.2", "pathe": "^2.0.3" }, "funding": { @@ -17603,14 +16548,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", - "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", + "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/pretty-format": "4.1.2", + "@vitest/utils": "4.1.2", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -17619,9 +16564,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", - "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", + "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", "dev": true, "license": "MIT", "funding": { @@ -17629,15 +16574,15 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", - "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", + "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.0", + "@vitest/pretty-format": "4.1.2", "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -17789,17 +16734,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -18098,14 +17032,6 @@ "resolved": "packages/analyze-query", "link": true }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -18526,14 +17452,6 @@ "node": ">=8" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -18758,78 +17676,6 @@ "node": ">= 6.0.0" } }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-loader": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", @@ -18856,41 +17702,6 @@ "object.assign": "^4.1.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/babel-plugin-jsx-dom-expressions": { "version": "0.40.5", "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.5.tgz", @@ -18969,82 +17780,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-react-compiler": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", - "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.26.0" - } - }, - "node_modules/babel-plugin-react-native-web": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", - "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/babel-preset-solid": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.10.tgz", @@ -19081,17 +17816,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "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==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/bare-events": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", @@ -19215,9 +17939,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.8", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", - "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "version": "2.10.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.11.tgz", + "integrity": "sha512-DAKrHphkJyiGuau/cFieRYhcTFeK/lBuD++C7cZ6KZHbMhBrisoi+EvhQ5RZrIfV5qwsW8kgQ07JIC+MDJRAhg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -19270,31 +17994,6 @@ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", "license": "Apache-2.0" }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "license": "Unlicense", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -19480,45 +18179,6 @@ "node": ">=8" } }, - "node_modules/bplist-creator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -19574,17 +18234,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -20014,26 +18663,6 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC" }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -20043,22 +18672,6 @@ "node": ">=6.0" } }, - "node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -20144,34 +18757,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-table3": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", @@ -20277,17 +18862,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -21770,20 +20344,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -22013,14 +20573,6 @@ "node": ">=6" } }, - "node_modules/dnssd-advertise": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.3.tgz", - "integrity": "sha512-XENsHi3MBzWOCAXif3yZvU1Ah0l+nhJj1sjWL6TnOAYKvGiFhbTx32xHN7+wLMLUOCj7Nr0evADWG4R8JtqCDA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/docker-compose": { "version": "0.24.8", "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", @@ -22238,6 +20790,64 @@ "url": "https://dotenvx.com" } }, + "node_modules/drizzle-kit": { + "version": "0.31.10", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", + "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "tsx": "^4.21.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-kit/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/drizzle-orm": { "version": "0.45.1", "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", @@ -22597,17 +21207,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "stackframe": "^1.3.4" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -22973,19 +21572,6 @@ "node": ">=12" } }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, "node_modules/esbuild-sunos-64": { "version": "0.14.47", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", @@ -23826,102 +22412,6 @@ "node": ">=12.0.0" } }, - "node_modules/expo-modules-autolinking": { - "version": "55.0.9", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-55.0.9.tgz", - "integrity": "sha512-OXIrxSYKlT/1Av1AMyUWeSTW1GChGofWV14sB73o5eFbfuz6ocv18fnKx+Ji67ZC7a0RztDctcZTuEQK84S4iw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/require-utils": "^55.0.2", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "commander": "^7.2.0" - }, - "bin": { - "expo-modules-autolinking": "bin/expo-modules-autolinking.js" - } - }, - "node_modules/expo-modules-autolinking/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/expo-modules-autolinking/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/expo-modules-autolinking/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/expo-modules-autolinking/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/expo-server": { - "version": "55.0.6", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-55.0.6.tgz", - "integrity": "sha512-xI72FTm469FfuuBL2R5aNtthgH+GR7ygOpsx/KcPS0K8AZaZd7VjtEExbzn9/qyyYkWW3T+3dAmCDKOMX8gdmQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.16.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, "node_modules/express": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", @@ -24335,31 +22825,6 @@ "node": ">=0.8.0" } }, - "node_modules/fb-dotslash": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", - "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "peer": true, - "bin": { - "dotslash": "bin/dotslash" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "bser": "2.1.1" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -24389,14 +22854,6 @@ "node": ">=0.4.0" } }, - "node_modules/fetch-nodeshim": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.9.tgz", - "integrity": "sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -24704,14 +23161,6 @@ "flat": "cli.js" } }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", @@ -24732,14 +23181,6 @@ } } }, - "node_modules/fontfaceobserver": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", - "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -25069,17 +23510,6 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "license": "ISC" }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/get-port": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", @@ -25151,17 +23581,6 @@ "node": ">= 14" } }, - "node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/giget": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", @@ -25192,25 +23611,6 @@ "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", "license": "ISC" }, - "node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "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", @@ -25245,23 +23645,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -25758,33 +24141,6 @@ "he": "bin/he" } }, - "node_modules/hermes-compiler": { - "version": "250829098.0.9", - "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.9.tgz", - "integrity": "sha512-hZ5O7PDz1vQ99TS7HD3FJ9zVynfU1y+VWId6U1Pldvd8hmAYrNec/XLPYJKD3dLOW6NXak6aAQAuMuSo3ji0tQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.32.0" - } - }, "node_modules/history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -25824,28 +24180,6 @@ "node": ">=16.9.0" } }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC", - "peer": true - }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -26898,35 +25232,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/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", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -26992,185 +25297,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -27243,98 +25369,6 @@ "node": ">=8" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -27350,14 +25384,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jimp-compact": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", - "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -27438,14 +25464,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true, - "license": "0BSD", - "peer": true - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -27584,17 +25602,6 @@ "node": ">=6" } }, - "node_modules/lan-network": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.2.0.tgz", - "integrity": "sha512-EZgbsXMrGS+oK+Ta12mCjzBFse+SIewGdwrSTr5g+MSymnjpox2x05ceI20PQejJOFvOgzcXrfDk/SdY7dSCtw==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lan-network": "dist/lan-network-cli.js" - } - }, "node_modules/latest-version": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", @@ -27712,37 +25719,6 @@ ], "license": "MIT" }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -28090,119 +26066,12 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "license": "MIT" }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "license": "MIT" }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/loglevel": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", @@ -28360,17 +26229,6 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "license": "ISC" }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -28418,14 +26276,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marky": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -28888,14 +26738,6 @@ "tslib": "2" } }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/merge-anything": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", @@ -28945,458 +26787,6 @@ "node": ">= 0.6" } }, - "node_modules/metro": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", - "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.32.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", - "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.32.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-cache": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", - "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-cache-key": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", - "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-config": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", - "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.83.3", - "metro-cache": "0.83.3", - "metro-core": "0.83.3", - "metro-runtime": "0.83.3", - "yaml": "^2.6.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-core": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", - "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-file-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", - "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-minify-terser": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", - "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-resolver": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", - "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-runtime": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", - "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-source-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", - "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.83.3", - "nullthrows": "^1.1.1", - "ob1": "0.83.3", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", - "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.83.3", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-symbolicate/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", - "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", - "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-source-map": "0.83.3", - "metro-transform-plugins": "0.83.3", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/metro/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/metro/node_modules/image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/metro/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/metro/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/metro/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -31563,14 +28953,6 @@ "multicast-dns": "cli.js" } }, - "node_modules/multitars": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/multitars/-/multitars-0.2.4.tgz", - "integrity": "sha512-XgLbg1HHchFauMCQPRwMj6MSyDd5koPlTA1hM3rUFkeXzGpjU/I9fP3to7yrObE9jcN8ChIOQGrM0tV0kUZaKg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/mysql2": { "version": "3.15.3", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", @@ -31777,17 +29159,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "peer": true, - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -31799,14 +29170,6 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/node-releases": { "version": "2.0.36", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", @@ -31849,23 +29212,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -31978,14 +29324,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/nypm": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", @@ -32011,20 +29349,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ob1": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", - "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -32204,135 +29528,6 @@ "opener": "bin/opener-bin.js" } }, - "node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/ora/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/otel": { "resolved": "packages/otel", "link": true @@ -32390,9 +29585,9 @@ } }, "node_modules/oxlint": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.56.0.tgz", - "integrity": "sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.57.0.tgz", + "integrity": "sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==", "dev": true, "license": "MIT", "bin": { @@ -32405,25 +29600,25 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.56.0", - "@oxlint/binding-android-arm64": "1.56.0", - "@oxlint/binding-darwin-arm64": "1.56.0", - "@oxlint/binding-darwin-x64": "1.56.0", - "@oxlint/binding-freebsd-x64": "1.56.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.56.0", - "@oxlint/binding-linux-arm-musleabihf": "1.56.0", - "@oxlint/binding-linux-arm64-gnu": "1.56.0", - "@oxlint/binding-linux-arm64-musl": "1.56.0", - "@oxlint/binding-linux-ppc64-gnu": "1.56.0", - "@oxlint/binding-linux-riscv64-gnu": "1.56.0", - "@oxlint/binding-linux-riscv64-musl": "1.56.0", - "@oxlint/binding-linux-s390x-gnu": "1.56.0", - "@oxlint/binding-linux-x64-gnu": "1.56.0", - "@oxlint/binding-linux-x64-musl": "1.56.0", - "@oxlint/binding-openharmony-arm64": "1.56.0", - "@oxlint/binding-win32-arm64-msvc": "1.56.0", - "@oxlint/binding-win32-ia32-msvc": "1.56.0", - "@oxlint/binding-win32-x64-msvc": "1.56.0" + "@oxlint/binding-android-arm-eabi": "1.57.0", + "@oxlint/binding-android-arm64": "1.57.0", + "@oxlint/binding-darwin-arm64": "1.57.0", + "@oxlint/binding-darwin-x64": "1.57.0", + "@oxlint/binding-freebsd-x64": "1.57.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.57.0", + "@oxlint/binding-linux-arm-musleabihf": "1.57.0", + "@oxlint/binding-linux-arm64-gnu": "1.57.0", + "@oxlint/binding-linux-arm64-musl": "1.57.0", + "@oxlint/binding-linux-ppc64-gnu": "1.57.0", + "@oxlint/binding-linux-riscv64-gnu": "1.57.0", + "@oxlint/binding-linux-riscv64-musl": "1.57.0", + "@oxlint/binding-linux-s390x-gnu": "1.57.0", + "@oxlint/binding-linux-x64-gnu": "1.57.0", + "@oxlint/binding-linux-x64-musl": "1.57.0", + "@oxlint/binding-openharmony-arm64": "1.57.0", + "@oxlint/binding-win32-arm64-msvc": "1.57.0", + "@oxlint/binding-win32-ia32-msvc": "1.57.0", + "@oxlint/binding-win32-x64-msvc": "1.57.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.15.0" @@ -32435,21 +29630,21 @@ } }, "node_modules/oxlint-tsgolint": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.17.0.tgz", - "integrity": "sha512-TdrKhDZCgEYqONFo/j+KvGan7/k3tP5Ouz88wCqpOvJtI2QmcLfGsm1fcMvDnTik48Jj6z83IJBqlkmK9DnY1A==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.17.4.tgz", + "integrity": "sha512-4F/NXJiK2KnK4LQiULUPXRzVq0LOfextGvwCVRW1VKQbF5epI3MDMEGVAl5XjAGL6IFc7xBc/eVA95wczPeEQg==", "dev": true, "license": "MIT", "bin": { "tsgolint": "bin/tsgolint.js" }, "optionalDependencies": { - "@oxlint-tsgolint/darwin-arm64": "0.17.0", - "@oxlint-tsgolint/darwin-x64": "0.17.0", - "@oxlint-tsgolint/linux-arm64": "0.17.0", - "@oxlint-tsgolint/linux-x64": "0.17.0", - "@oxlint-tsgolint/win32-arm64": "0.17.0", - "@oxlint-tsgolint/win32-x64": "0.17.0" + "@oxlint-tsgolint/darwin-arm64": "0.17.4", + "@oxlint-tsgolint/darwin-x64": "0.17.4", + "@oxlint-tsgolint/linux-arm64": "0.17.4", + "@oxlint-tsgolint/linux-x64": "0.17.4", + "@oxlint-tsgolint/win32-arm64": "0.17.4", + "@oxlint-tsgolint/win32-x64": "0.17.4" } }, "node_modules/p-cancelable": { @@ -32566,17 +29761,6 @@ "node": ">=8" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pac-proxy-agent": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", @@ -32754,31 +29938,6 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", "license": "ISC" }, - "node_modules/parse-png": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", - "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "pngjs": "^3.3.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/parse-png/node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/parse-prometheus-text-format": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-prometheus-text-format/-/parse-prometheus-text-format-1.1.1.tgz", @@ -32904,35 +30063,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "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==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "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.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/path-to-regexp": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", @@ -33088,9 +30218,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -33288,22 +30418,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, "node_modules/pngjs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", @@ -34865,17 +31979,6 @@ "node": ">=6" } }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -34915,28 +32018,6 @@ "resolved": "prod", "link": true }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -35172,17 +32253,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -35310,41 +32380,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-devtools-core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", - "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -35474,17 +32509,6 @@ "react": ">=18" } }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-resizable-panels": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.6.tgz", @@ -35771,14 +32795,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/regexp-to-ast": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", @@ -36282,14 +33298,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/resolve-workspace-root": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz", - "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/responselike": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", @@ -36305,46 +33313,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/ret": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", @@ -36448,6 +33416,7 @@ "version": "1.0.0-rc.9", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", + "dev": true, "license": "MIT", "dependencies": { "@oxc-project/types": "=0.115.0", @@ -36481,6 +33450,7 @@ "version": "1.0.0-rc.9", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", + "dev": true, "license": "MIT" }, "node_modules/rtlcss": { @@ -36656,13 +33626,6 @@ } } }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT", - "peer": true - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -36792,17 +33755,6 @@ "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==", "dev": true }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -37235,19 +34187,6 @@ "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", "license": "BSD-3-Clause" }, - "node_modules/simple-plist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "bplist-creator": "0.1.0", - "bplist-parser": "0.3.1", - "plist": "^3.0.5" - } - }, "node_modules/sirv": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", @@ -37315,17 +34254,6 @@ "node": ">=8" } }, - "node_modules/slugify": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.8.tgz", - "integrity": "sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -37611,31 +34539,6 @@ "nan": "^2.23.0" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -37643,39 +34546,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", - "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/state-local": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", @@ -37698,17 +34568,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "license": "Unlicense", - "peer": true, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", @@ -37936,14 +34795,6 @@ ], "license": "MIT" }, - "node_modules/structured-headers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", - "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/style-to-js": { "version": "1.1.21", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", @@ -38026,35 +34877,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -38493,24 +35315,6 @@ "streamx": "^2.12.5" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { "version": "5.46.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", @@ -38582,79 +35386,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/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", - "peer": true - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/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", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/testcontainers": { "version": "10.28.0", "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.28.0.tgz", @@ -38811,14 +35542,6 @@ "node": ">=20" } }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -38914,14 +35637,6 @@ "node": ">=14.14" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -38952,14 +35667,6 @@ "node": ">=0.6" } }, - "node_modules/toqr": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz", - "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -39256,17 +35963,6 @@ "dev": true, "license": "Unlicense" }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -40015,17 +36711,6 @@ } } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/value-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", @@ -40101,6 +36786,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", + "dev": true, "license": "MIT", "dependencies": { "@oxc-project/runtime": "0.115.0", @@ -40246,19 +36932,19 @@ } }, "node_modules/vitest": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", - "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", + "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.0", - "@vitest/mocker": "4.1.0", - "@vitest/pretty-format": "4.1.0", - "@vitest/runner": "4.1.0", - "@vitest/snapshot": "4.1.0", - "@vitest/spy": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/expect": "4.1.2", + "@vitest/mocker": "4.1.2", + "@vitest/pretty-format": "4.1.2", + "@vitest/runner": "4.1.2", + "@vitest/snapshot": "4.1.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -40269,8 +36955,8 @@ "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -40286,13 +36972,13 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.0", - "@vitest/browser-preview": "4.1.0", - "@vitest/browser-webdriverio": "4.1.0", - "@vitest/ui": "4.1.0", + "@vitest/browser-playwright": "4.1.2", + "@vitest/browser-preview": "4.1.2", + "@vitest/browser-webdriverio": "4.1.2", + "@vitest/ui": "4.1.2", "happy-dom": "*", "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -40327,25 +37013,6 @@ } } }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/watchpack": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", @@ -40368,17 +37035,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/web-namespaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", @@ -40911,14 +37567,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -40929,14 +37577,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/whatwg-url-minimum": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.1.tgz", - "integrity": "sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -41254,32 +37894,6 @@ "node": ">=1" } }, - "node_modules/xcode": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", - "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "simple-plist": "^1.1.0", - "uuid": "^7.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/xcode/node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", @@ -41304,43 +37918,6 @@ "xml-js": "bin/cli.js" } }, - "node_modules/xml2js": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -41369,7 +37946,7 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "devOptional": true, + "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -41653,7 +38230,7 @@ "ast-to-zql": "0.0.0", "otel": "0.0.0", "shared": "0.0.0", - "vitest": "4.1.0", + "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", @@ -41681,10 +38258,10 @@ "devDependencies": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" } }, "packages/otel": { @@ -41712,7 +38289,7 @@ "@op-engineering/op-sqlite": ">=15", "@rocicorp/zero-sqlite3": "^1.0.15", "@types/command-line-usage": "^5.0.2", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", "compare-utf8": "^0.1.1", @@ -41721,7 +38298,7 @@ "playwright": "^1.53.2", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" }, "peerDependencies": { "@op-engineering/op-sqlite": ">=15", @@ -41782,864 +38359,421 @@ "shared": "0.0.0", "tsx": "^4.21.0", "typescript": "~5.9.3", - "vite": "8.0.0", + "vite": "8.0.3", "xbytes": "^1.7.0" } }, - "packages/replicache/node_modules/@expo/cli": { - "version": "55.0.16", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.16.tgz", - "integrity": "sha512-rp1mBnA5msGDPTfFuqVl+9RsJOtuA0cXsWSJpHdvsIxcSVg0oJyF/rgvrwsFrNQCLXzkMXm+o3CsY9iL1D/CDA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", - "@expo/devcert": "^1.2.1", - "@expo/env": "~2.1.1", - "@expo/image-utils": "^0.8.12", - "@expo/json-file": "^10.0.12", - "@expo/log-box": "55.0.7", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "~55.0.9", - "@expo/osascript": "^2.4.2", - "@expo/package-manager": "^1.10.3", - "@expo/plist": "^0.5.2", - "@expo/prebuild-config": "^55.0.8", - "@expo/require-utils": "^55.0.2", - "@expo/router-server": "^55.0.10", - "@expo/schema-utils": "^55.0.2", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.4.0", - "@react-native/dev-middleware": "0.83.2", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "dnssd-advertise": "^1.1.3", - "expo-server": "^55.0.6", - "fetch-nodeshim": "^0.4.6", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "lan-network": "^0.2.0", - "multitars": "^0.2.3", - "node-forge": "^1.3.3", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^4.0.3", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "terminal-link": "^2.1.1", - "toqr": "^0.1.1", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1", - "zod": "^3.25.76" - }, - "bin": { - "expo-internal": "build/bin/cli" - }, - "peerDependencies": { - "expo": "*", - "expo-router": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "expo-router": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "packages/replicache/node_modules/@expo/devtools": { - "version": "55.0.2", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.2.tgz", - "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^4.1.2" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "packages/replicache/node_modules/@expo/dom-webview": { - "version": "55.0.3", - "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.3.tgz", - "integrity": "sha512-bY4/rfcZ0f43DvOtMn8/kmPlmo01tex5hRoc5hKbwBwQjqWQuQt0ACwu7akR9IHI4j0WNG48eL6cZB6dZUFrzg==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/replicache/node_modules/@expo/log-box": { - "version": "55.0.7", - "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.7.tgz", - "integrity": "sha512-m7V1k2vlMp4NOj3fopjOg4zl/ANXyTRF3HMTMep2GZAKsPiDzgOQ41nm8CaU50/HlDIGXlCObss07gOn20UpHQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/dom-webview": "^55.0.3", - "anser": "^1.4.9", - "stacktrace-parser": "^0.1.10" - }, - "peerDependencies": { - "@expo/dom-webview": "^55.0.3", - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/replicache/node_modules/@expo/metro-config": { - "version": "55.0.9", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.9.tgz", - "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~55.0.8", - "@expo/env": "~2.1.1", - "@expo/json-file": "~10.0.12", - "@expo/metro": "~54.2.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "hermes-parser": "^0.32.0", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "picomatch": "^4.0.3", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "expo": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, - "packages/replicache/node_modules/@expo/prebuild-config": { - "version": "55.0.8", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.8.tgz", - "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", - "@expo/config-types": "^55.0.5", - "@expo/image-utils": "^0.8.12", - "@expo/json-file": "^10.0.12", - "@react-native/normalize-colors": "0.83.2", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "packages/replicache/node_modules/@expo/router-server": { - "version": "55.0.10", - "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.10.tgz", - "integrity": "sha512-NZQzHwkaedufNPayVfPxsZGEMngOD3gDvYx9lld4sitRexrKDx5sHmmNHi6IByGbmCb4jwLXub5sIyWh6z1xPQ==", - "dev": true, + "packages/replicache-perf/node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "@expo/metro-runtime": "^55.0.6", - "expo": "*", - "expo-constants": "^55.0.7", - "expo-font": "^55.0.4", - "expo-router": "*", - "expo-server": "^55.0.6", - "react": "*", - "react-dom": "*", - "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" - }, - "peerDependenciesMeta": { - "@expo/metro-runtime": { - "optional": true - }, - "expo-router": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-server-dom-webpack": { - "optional": true - } - } - }, - "packages/replicache/node_modules/@expo/vector-icons": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", - "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "expo-font": ">=14.0.4", - "react": "*", - "react-native": "*" + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "packages/replicache/node_modules/@op-engineering/op-sqlite": { - "version": "15.2.7", - "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.2.7.tgz", - "integrity": "sha512-rXpzEt6FL0syAHa2QqBaB7DhhXwxEOs05cTIhv0RI+iur66XcuM73SpUSD8gnh8opHJu+Hw6Nu3IM4EDWxEdng==", - "dev": true, - "license": "MIT", - "workspaces": [ - "example", - "node" + "packages/replicache-perf/node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" ], - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "packages/replicache/node_modules/@react-native/codegen": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.84.1.tgz", - "integrity": "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==", - "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "hermes-parser": "0.32.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "tinyglobby": "^0.2.15", - "yargs": "^17.6.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/@react-native/virtualized-lists": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.84.1.tgz", - "integrity": "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.2.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/replicache/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-parser": "0.32.0" - } - }, - "packages/replicache/node_modules/babel-preset-expo": { - "version": "55.0.11", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.11.tgz", - "integrity": "sha512-ti8t4xufD6gUQQh+qY+b+VT/1zyA0n1PBnwOzCkPUyEDiIVBpaOixR+BzVH68hqu9mH2wDfzoFuGgv+2LfRdqw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/generator": "^7.20.5", - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.83.2", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.32.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "@babel/runtime": "^7.20.0", - "expo": "*", - "expo-widgets": "^55.0.4", - "react-refresh": ">=0.14.0 <1.0.0" - }, - "peerDependenciesMeta": { - "@babel/runtime": { - "optional": true - }, - "expo": { - "optional": true - }, - "expo-widgets": { - "optional": true - } + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" - } - }, - "packages/replicache/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/expo": { - "version": "55.0.6", - "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.6.tgz", - "integrity": "sha512-gaF8bh5beWmrptz3d4Gr138CiPoLJtzjNbqNSOQ8kdQm3wMW8lJGT1dsY5NPJTZ7MNJBTN+pcRwshr4BMK4OiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.20.0", - "@expo/cli": "55.0.16", - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", - "@expo/devtools": "55.0.2", - "@expo/fingerprint": "0.16.6", - "@expo/local-build-cache-provider": "55.0.6", - "@expo/log-box": "55.0.7", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "55.0.9", - "@expo/vector-icons": "^15.0.2", - "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~55.0.11", - "expo-asset": "~55.0.8", - "expo-constants": "~55.0.7", - "expo-file-system": "~55.0.10", - "expo-font": "~55.0.4", - "expo-keep-awake": "~55.0.4", - "expo-modules-autolinking": "55.0.9", - "expo-modules-core": "55.0.15", - "pretty-format": "^29.7.0", - "react-refresh": "^0.14.2", - "whatwg-url-minimum": "^0.1.1" - }, - "bin": { - "expo": "bin/cli", - "expo-modules-autolinking": "bin/autolinking", - "fingerprint": "bin/fingerprint" - }, - "peerDependencies": { - "@expo/dom-webview": "*", - "@expo/metro-runtime": "*", - "react": "*", - "react-native": "*", - "react-native-webview": "*" - }, - "peerDependenciesMeta": { - "@expo/dom-webview": { - "optional": true - }, - "@expo/metro-runtime": { - "optional": true - }, - "react-native-webview": { - "optional": true - } + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/expo-asset": { - "version": "55.0.8", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.8.tgz", - "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@expo/image-utils": "^0.8.12", - "expo-constants": "~55.0.7" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/expo-constants": { - "version": "55.0.7", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.7.tgz", - "integrity": "sha512-kdcO4TsQRRqt0USvjaY5vgQMO9H52K3kBZ/ejC7F6rz70mv08GoowrZ1CYOr5O4JpPDRlIpQfZJUucaS/c+KWQ==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config": "~55.0.8", - "@expo/env": "~2.1.1" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/expo-file-system": { - "version": "55.0.10", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.10.tgz", - "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/expo-font": { - "version": "55.0.4", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.4.tgz", - "integrity": "sha512-ZKeGTFffPygvY5dM/9ATM2p7QDkhsaHopH7wFAWgP2lKzqUMS9B/RxCvw5CaObr9Ro7x9YptyeRKX2HmgmMfrg==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], "license": "MIT", - "peer": true, - "dependencies": { - "fontfaceobserver": "^2.1.0" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/expo-keep-awake": { - "version": "55.0.4", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.4.tgz", - "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/expo-modules-core": { - "version": "55.0.15", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.15.tgz", - "integrity": "sha512-MAGz1SYSVgQbwVeUysWgPtLh8ozbBwORatXoA4w0NZqZBZzEyBgUQNhuwaroaIi9W8Ir3wy1McmZcDYDJNGmVw==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], "license": "MIT", - "peer": true, - "dependencies": { - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/expo-sqlite": { - "version": "55.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-55.0.10.tgz", - "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "await-lock": "^2.2.2" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/replicache/node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "optional": true, + "os": [ + "openharmony" ], - "license": "MIT", - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "packages/replicache-perf/node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" ], "license": "MIT", - "peer": true, + "optional": true, "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "@napi-rs/wasm-runtime": "^1.1.1" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=14.0.0" } }, - "packages/replicache/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", - "dev": true, + "packages/replicache-perf/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/replicache/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT", - "peer": true + "packages/replicache-perf/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "license": "MIT" }, - "packages/replicache/node_modules/react-native": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.84.1.tgz", - "integrity": "sha512-0PjxOyXRu3tZ8EobabxSukvhKje2HJbsZikR0U+pvS0pYZza2hXKjcSBiBdFN4h9D0S3v6a8kkrDK6WTRKMwzg==", - "dev": true, + "packages/replicache-perf/node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "license": "MIT", - "peer": true, "dependencies": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.84.1", - "@react-native/codegen": "0.84.1", - "@react-native/community-cli-plugin": "0.84.1", - "@react-native/gradle-plugin": "0.84.1", - "@react-native/js-polyfills": "0.84.1", - "@react-native/normalize-colors": "0.84.1", - "@react-native/virtualized-lists": "0.84.1", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.32.0", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "hermes-compiler": "250829098.0.9", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.3", - "metro-source-map": "^0.83.3", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.27.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "tinyglobby": "^0.2.15", - "whatwg-fetch": "^3.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" }, "bin": { - "react-native": "cli.js" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.1", - "react": "^19.2.3" + "node": "^20.19.0 || >=22.12.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/replicache/node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.1.tgz", - "integrity": "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/react-native/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + } + }, + "packages/replicache-perf/node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "license": "MIT", - "peer": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=8.3.0" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.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": { - "bufferutil": { + "@types/node": { "optional": true }, - "utf-8-validate": { + "@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 } } }, - "packages/replicache/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "packages/replicache/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/replicache/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/replicache/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/replicache/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "packages/replicache/node_modules/@op-engineering/op-sqlite": { + "version": "15.2.7", + "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.2.7.tgz", + "integrity": "sha512-rXpzEt6FL0syAHa2QqBaB7DhhXwxEOs05cTIhv0RI+iur66XcuM73SpUSD8gnh8opHJu+Hw6Nu3IM4EDWxEdng==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "workspaces": [ + "example", + "node" + ], + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "packages/replicache/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "packages/replicache/node_modules/expo-sqlite": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-55.0.10.tgz", + "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "await-lock": "^2.2.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/replicache/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, "packages/shared": { @@ -42660,14 +38794,14 @@ "devDependencies": { "@types/semver": "^7.5.1", "@types/strip-ansi": "^3.0.0", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "compare-utf8": "^0.1.1", "fast-check": "^3.18.0", "package-up": "^5.0.0", "playwright": "^1.53.2", "type-fest": "^4.30.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" } }, "packages/shared/node_modules/type-fest": { @@ -42692,10 +38826,10 @@ "devDependencies": { "@faker-js/faker": "^9.6.0", "@types/pg": "^8.11.11", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "pg": "^8.16.3", "shared": "0.0.0", - "vitest": "4.1.0", + "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", @@ -42771,7 +38905,7 @@ }, "devDependencies": { "@op-engineering/op-sqlite": ">=15", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", "expo-sqlite": ">=15", @@ -42781,8 +38915,8 @@ "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", "typescript": "~5.9.3", - "vite": "8.0.0", - "vitest": "4.1.0", + "vite": "8.0.3", + "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-client": "0.0.0", "zero-pg": "0.0.0", @@ -42860,13 +38994,13 @@ "@types/pg-format": "^1.0.5", "@types/strip-ansi": "^3.0.0", "@types/ws": "^8.5.12", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "mockttp": "^4.2.1", "nock": "^14.0.4", "otel": "0.0.0", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0", + "vitest": "4.1.2", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zql": "0.0.0" @@ -42908,8 +39042,8 @@ "@rocicorp/logger": "^5.4.0" }, "devDependencies": { - "@vitest/runner": "4.1.0", - "vitest": "4.1.0", + "@vitest/runner": "4.1.2", + "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-server": "0.0.0" } @@ -42921,490 +39055,88 @@ }, "devDependencies": { "shared": "0.0.0", - "typescript": "~5.9.3", - "zero-types": "0.0.0" - } - }, - "packages/zero-react": { - "version": "0.0.0", - "devDependencies": { - "@testing-library/react": "^16.3.2", - "@types/react": "^18.3.18", - "react": "^18.3.1", - "shared": "0.0.0", - "zero-client": "0.0.0", - "zero-schema": "0.0.0", - "zql": "0.0.0" - }, - "peerDependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - } - }, - "packages/zero-react-native": { - "version": "0.0.0", - "dependencies": { - "@rocicorp/resolver": "^1.0.2" - }, - "devDependencies": { - "replicache": "15.2.1", - "shared": "0.0.0" - } - }, - "packages/zero-schema": { - "version": "0.0.0", - "devDependencies": { - "shared": "0.0.0", - "zero-protocol": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "packages/zero-server": { - "version": "0.0.0", - "hasInstallScript": true, - "dependencies": { - "@rocicorp/logger": "^5.4.0" - }, - "devDependencies": { - "@prisma/adapter-pg": "^7.2.0", - "@prisma/client": "^7.2.0", - "@vitest/runner": "4.1.0", - "drizzle-orm": "^0.45.1", - "pg": "^8.16.3", - "postgres": "3.4.7", - "prisma": "^7.2.0", - "shared": "0.0.0", - "vitest": "4.1.0", - "z2s": "0.0.0", - "zero-cache": "0.0.0", - "zero-protocol": "0.0.0", - "zero-schema": "0.0.0", - "zero-types": "0.0.0", - "zql": "0.0.0" - } - }, - "packages/zero-solid": { - "version": "0.0.0", - "devDependencies": { - "@solidjs/testing-library": "^0.8.10", - "shared": "0.0.0", - "solid-js": "^1.9.4", - "vite-plugin-solid": "^2.11.11", - "zero-client": "0.0.0" - }, - "peerDependencies": { - "solid-js": "^1.9.4" - } - }, - "packages/zero-types": { - "version": "0.0.0", - "devDependencies": { - "shared": "0.0.0", - "typescript": "~5.9.3", - "vitest": "4.1.0" - } - }, - "packages/zero/node_modules/@expo/cli": { - "version": "55.0.16", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.16.tgz", - "integrity": "sha512-rp1mBnA5msGDPTfFuqVl+9RsJOtuA0cXsWSJpHdvsIxcSVg0oJyF/rgvrwsFrNQCLXzkMXm+o3CsY9iL1D/CDA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", - "@expo/devcert": "^1.2.1", - "@expo/env": "~2.1.1", - "@expo/image-utils": "^0.8.12", - "@expo/json-file": "^10.0.12", - "@expo/log-box": "55.0.7", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "~55.0.9", - "@expo/osascript": "^2.4.2", - "@expo/package-manager": "^1.10.3", - "@expo/plist": "^0.5.2", - "@expo/prebuild-config": "^55.0.8", - "@expo/require-utils": "^55.0.2", - "@expo/router-server": "^55.0.10", - "@expo/schema-utils": "^55.0.2", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.4.0", - "@react-native/dev-middleware": "0.83.2", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "dnssd-advertise": "^1.1.3", - "expo-server": "^55.0.6", - "fetch-nodeshim": "^0.4.6", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "lan-network": "^0.2.0", - "multitars": "^0.2.3", - "node-forge": "^1.3.3", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^4.0.3", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "terminal-link": "^2.1.1", - "toqr": "^0.1.1", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1", - "zod": "^3.25.76" - }, - "bin": { - "expo-internal": "build/bin/cli" - }, - "peerDependencies": { - "expo": "*", - "expo-router": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "expo-router": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "packages/zero/node_modules/@expo/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/devtools": { - "version": "55.0.2", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.2.tgz", - "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^4.1.2" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "packages/zero/node_modules/@expo/devtools/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/devtools/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/dom-webview": { - "version": "55.0.3", - "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.3.tgz", - "integrity": "sha512-bY4/rfcZ0f43DvOtMn8/kmPlmo01tex5hRoc5hKbwBwQjqWQuQt0ACwu7akR9IHI4j0WNG48eL6cZB6dZUFrzg==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/@expo/log-box": { - "version": "55.0.7", - "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.7.tgz", - "integrity": "sha512-m7V1k2vlMp4NOj3fopjOg4zl/ANXyTRF3HMTMep2GZAKsPiDzgOQ41nm8CaU50/HlDIGXlCObss07gOn20UpHQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/dom-webview": "^55.0.3", - "anser": "^1.4.9", - "stacktrace-parser": "^0.1.10" - }, - "peerDependencies": { - "@expo/dom-webview": "^55.0.3", - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "packages/zero/node_modules/@expo/metro-config": { - "version": "55.0.9", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.9.tgz", - "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~55.0.8", - "@expo/env": "~2.1.1", - "@expo/json-file": "~10.0.12", - "@expo/metro": "~54.2.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "hermes-parser": "^0.32.0", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "picomatch": "^4.0.3", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "expo": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, - "packages/zero/node_modules/@expo/metro-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/metro-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/zero/node_modules/@expo/metro-config/node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "packages/zero/node_modules/@expo/metro-config/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "typescript": "~5.9.3", + "zero-types": "0.0.0" } }, - "packages/zero/node_modules/@expo/prebuild-config": { - "version": "55.0.8", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.8.tgz", - "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", - "@expo/config-types": "^55.0.5", - "@expo/image-utils": "^0.8.12", - "@expo/json-file": "^10.0.12", - "@react-native/normalize-colors": "0.83.2", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" + "packages/zero-react": { + "version": "0.0.0", + "devDependencies": { + "@testing-library/react": "^16.3.2", + "@types/react": "^18.3.18", + "react": "^18.3.1", + "shared": "0.0.0", + "zero-client": "0.0.0", + "zero-schema": "0.0.0", + "zql": "0.0.0" }, "peerDependencies": { - "expo": "*" + "react": "^18.3.1", + "react-dom": "^18.3.1" } }, - "packages/zero/node_modules/@expo/router-server": { - "version": "55.0.10", - "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.10.tgz", - "integrity": "sha512-NZQzHwkaedufNPayVfPxsZGEMngOD3gDvYx9lld4sitRexrKDx5sHmmNHi6IByGbmCb4jwLXub5sIyWh6z1xPQ==", - "dev": true, - "license": "MIT", - "peer": true, + "packages/zero-react-native": { + "version": "0.0.0", "dependencies": { - "debug": "^4.3.4" + "@rocicorp/resolver": "^1.0.2" }, - "peerDependencies": { - "@expo/metro-runtime": "^55.0.6", - "expo": "*", - "expo-constants": "^55.0.7", - "expo-font": "^55.0.4", - "expo-router": "*", - "expo-server": "^55.0.6", - "react": "*", - "react-dom": "*", - "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" + "devDependencies": { + "replicache": "15.2.1", + "shared": "0.0.0" + } + }, + "packages/zero-schema": { + "version": "0.0.0", + "devDependencies": { + "shared": "0.0.0", + "zero-protocol": "0.0.0", + "zero-types": "0.0.0", + "zql": "0.0.0" + } + }, + "packages/zero-server": { + "version": "0.0.0", + "hasInstallScript": true, + "dependencies": { + "@rocicorp/logger": "^5.4.0" }, - "peerDependenciesMeta": { - "@expo/metro-runtime": { - "optional": true - }, - "expo-router": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-server-dom-webpack": { - "optional": true - } + "devDependencies": { + "@prisma/adapter-pg": "^7.2.0", + "@prisma/client": "^7.2.0", + "@vitest/runner": "4.1.2", + "drizzle-orm": "^0.45.1", + "pg": "^8.16.3", + "postgres": "3.4.7", + "prisma": "^7.2.0", + "shared": "0.0.0", + "vitest": "4.1.2", + "z2s": "0.0.0", + "zero-cache": "0.0.0", + "zero-protocol": "0.0.0", + "zero-schema": "0.0.0", + "zero-types": "0.0.0", + "zql": "0.0.0" } }, - "packages/zero/node_modules/@expo/vector-icons": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", - "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", - "dev": true, - "license": "MIT", - "peer": true, + "packages/zero-solid": { + "version": "0.0.0", + "devDependencies": { + "@solidjs/testing-library": "^0.8.10", + "shared": "0.0.0", + "solid-js": "^1.9.4", + "vite-plugin-solid": "^2.11.11", + "zero-client": "0.0.0" + }, "peerDependencies": { - "expo-font": ">=14.0.4", - "react": "*", - "react-native": "*" + "solid-js": "^1.9.4" + } + }, + "packages/zero-types": { + "version": "0.0.0", + "devDependencies": { + "shared": "0.0.0", + "typescript": "~5.9.3", + "vitest": "4.1.2" } }, "packages/zero/node_modules/@op-engineering/op-sqlite": { @@ -43422,513 +39154,421 @@ "react-native": "*" } }, - "packages/zero/node_modules/@react-native/codegen": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.84.1.tgz", - "integrity": "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==", + "packages/zero/node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "hermes-parser": "0.32.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "tinyglobby": "^0.2.15", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "packages/zero/node_modules/@react-native/virtualized-lists": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.84.1.tgz", - "integrity": "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==", + "packages/zero/node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.2.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/zero/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-parser": "0.32.0" - } - }, - "packages/zero/node_modules/babel-preset-expo": { - "version": "55.0.11", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.11.tgz", - "integrity": "sha512-ti8t4xufD6gUQQh+qY+b+VT/1zyA0n1PBnwOzCkPUyEDiIVBpaOixR+BzVH68hqu9mH2wDfzoFuGgv+2LfRdqw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/generator": "^7.20.5", - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.83.2", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.32.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "@babel/runtime": "^7.20.0", - "expo": "*", - "expo-widgets": "^55.0.4", - "react-refresh": ">=0.14.0 <1.0.0" - }, - "peerDependenciesMeta": { - "@babel/runtime": { - "optional": true - }, - "expo": { - "optional": true - }, - "expo-widgets": { - "optional": true - } + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "packages/zero/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "packages/zero/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/expo": { - "version": "55.0.6", - "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.6.tgz", - "integrity": "sha512-gaF8bh5beWmrptz3d4Gr138CiPoLJtzjNbqNSOQ8kdQm3wMW8lJGT1dsY5NPJTZ7MNJBTN+pcRwshr4BMK4OiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.20.0", - "@expo/cli": "55.0.16", - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", - "@expo/devtools": "55.0.2", - "@expo/fingerprint": "0.16.6", - "@expo/local-build-cache-provider": "55.0.6", - "@expo/log-box": "55.0.7", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "55.0.9", - "@expo/vector-icons": "^15.0.2", - "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~55.0.11", - "expo-asset": "~55.0.8", - "expo-constants": "~55.0.7", - "expo-file-system": "~55.0.10", - "expo-font": "~55.0.4", - "expo-keep-awake": "~55.0.4", - "expo-modules-autolinking": "55.0.9", - "expo-modules-core": "55.0.15", - "pretty-format": "^29.7.0", - "react-refresh": "^0.14.2", - "whatwg-url-minimum": "^0.1.1" - }, - "bin": { - "expo": "bin/cli", - "expo-modules-autolinking": "bin/autolinking", - "fingerprint": "bin/fingerprint" - }, - "peerDependencies": { - "@expo/dom-webview": "*", - "@expo/metro-runtime": "*", - "react": "*", - "react-native": "*", - "react-native-webview": "*" - }, - "peerDependenciesMeta": { - "@expo/dom-webview": { - "optional": true - }, - "@expo/metro-runtime": { - "optional": true - }, - "react-native-webview": { - "optional": true - } + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/expo-asset": { - "version": "55.0.8", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.8.tgz", - "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", + "packages/zero/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@expo/image-utils": "^0.8.12", - "expo-constants": "~55.0.7" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/expo-constants": { - "version": "55.0.7", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.7.tgz", - "integrity": "sha512-kdcO4TsQRRqt0USvjaY5vgQMO9H52K3kBZ/ejC7F6rz70mv08GoowrZ1CYOr5O4JpPDRlIpQfZJUucaS/c+KWQ==", + "packages/zero/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@expo/config": "~55.0.8", - "@expo/env": "~2.1.1" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/expo-file-system": { - "version": "55.0.10", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.10.tgz", - "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", + "packages/zero/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/expo-font": { - "version": "55.0.4", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.4.tgz", - "integrity": "sha512-ZKeGTFffPygvY5dM/9ATM2p7QDkhsaHopH7wFAWgP2lKzqUMS9B/RxCvw5CaObr9Ro7x9YptyeRKX2HmgmMfrg==", + "packages/zero/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "peer": true, - "dependencies": { - "fontfaceobserver": "^2.1.0" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/expo-keep-awake": { - "version": "55.0.4", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.4.tgz", - "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", + "packages/zero/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/expo-modules-core": { - "version": "55.0.15", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.15.tgz", - "integrity": "sha512-MAGz1SYSVgQbwVeUysWgPtLh8ozbBwORatXoA4w0NZqZBZzEyBgUQNhuwaroaIi9W8Ir3wy1McmZcDYDJNGmVw==", + "packages/zero/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "peer": true, - "dependencies": { - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/expo-sqlite": { - "version": "55.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-55.0.10.tgz", - "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", + "packages/zero/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "await-lock": "^2.2.2" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "packages/zero/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "packages/zero/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=0.10.0" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/react-native": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.84.1.tgz", - "integrity": "sha512-0PjxOyXRu3tZ8EobabxSukvhKje2HJbsZikR0U+pvS0pYZza2hXKjcSBiBdFN4h9D0S3v6a8kkrDK6WTRKMwzg==", + "packages/zero/node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, "dependencies": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.84.1", - "@react-native/codegen": "0.84.1", - "@react-native/community-cli-plugin": "0.84.1", - "@react-native/gradle-plugin": "0.84.1", - "@react-native/js-polyfills": "0.84.1", - "@react-native/normalize-colors": "0.84.1", - "@react-native/virtualized-lists": "0.84.1", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.32.0", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "hermes-compiler": "250829098.0.9", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.3", - "metro-source-map": "^0.83.3", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.27.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "tinyglobby": "^0.2.15", - "whatwg-fetch": "^3.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" + "@napi-rs/wasm-runtime": "^1.1.1" }, "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.1", - "react": "^19.2.3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=14.0.0" } }, - "packages/zero/node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.84.1", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.1.tgz", - "integrity": "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/zero/node_modules/react-native/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "packages/zero/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/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==", + "packages/zero/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "packages/zero/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "packages/zero/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, - "packages/zero/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "packages/zero/node_modules/expo-sqlite": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-55.0.10.tgz", + "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "await-lock": "^2.2.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "packages/zero/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "packages/zero/node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" }, - "engines": { - "node": ">=8" - } - }, - "packages/zero/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "bin": { + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=10" + "node": "^20.19.0 || >=22.12.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "packages/zero/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + } + }, + "packages/zero/node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/zero/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "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.1.0", + "esbuild": "^0.27.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 + } } }, "packages/zql": { @@ -44014,10 +39654,10 @@ }, "devDependencies": { "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" } }, "prod": { diff --git a/package.json b/package.json index 74dcdf6f48..236afe57de 100644 --- a/package.json +++ b/package.json @@ -33,17 +33,17 @@ "bench:bmf:silent": "npx turbo run bench:bmf:silent --concurrency=1" }, "devDependencies": { - "@vitest/browser-playwright": "^4.1.0", - "@vitest/coverage-v8": "4.1.0", - "@vitest/runner": "4.1.0", - "baseline-browser-mapping": "^2.10.8", - "oxlint": "^1.56.0", - "oxlint-tsgolint": "^0.17.0", + "@vitest/browser-playwright": "^4.1.2", + "@vitest/coverage-v8": "4.1.2", + "@vitest/runner": "4.1.2", + "baseline-browser-mapping": "^2.10.11", + "oxlint": "^1.57.0", + "oxlint-tsgolint": "^0.17.4", "prettier": "^3.8.1", "syncpack": "^14.2.1", "tsx": "^4.21.0", "turbo": "^2.4.4", - "vitest": "4.1.0" + "vitest": "4.1.2" }, "overrides": { "esbuild": "^0.27.4" diff --git a/packages/analyze-query/package.json b/packages/analyze-query/package.json index b59a9e2e78..d365a76997 100644 --- a/packages/analyze-query/package.json +++ b/packages/analyze-query/package.json @@ -20,7 +20,7 @@ "ast-to-zql": "0.0.0", "otel": "0.0.0", "shared": "0.0.0", - "vitest": "4.1.0", + "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", diff --git a/packages/ast-to-zql/package.json b/packages/ast-to-zql/package.json index 8f430f68b9..4f8ecba44e 100644 --- a/packages/ast-to-zql/package.json +++ b/packages/ast-to-zql/package.json @@ -8,7 +8,7 @@ "check-types:watch": "tsc --watch", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:watch": "vitest" }, diff --git a/packages/datadog/package.json b/packages/datadog/package.json index 791b001db9..83325b6e14 100644 --- a/packages/datadog/package.json +++ b/packages/datadog/package.json @@ -6,10 +6,10 @@ "devDependencies": { "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" }, "scripts": { "test": "vitest run", diff --git a/packages/otel/package.json b/packages/otel/package.json index 6de078bc02..e970aabcee 100644 --- a/packages/otel/package.json +++ b/packages/otel/package.json @@ -8,7 +8,7 @@ "check-types:watch": "tsc --watch", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { "@opentelemetry/api": "^1.9.0" diff --git a/packages/replicache-perf/package.json b/packages/replicache-perf/package.json index 9ed9d326d3..6e43266826 100644 --- a/packages/replicache-perf/package.json +++ b/packages/replicache-perf/package.json @@ -25,7 +25,7 @@ "shared": "0.0.0", "tsx": "^4.21.0", "typescript": "~5.9.3", - "vite": "8.0.0", + "vite": "8.0.3", "xbytes": "^1.7.0" } } diff --git a/packages/replicache/package.json b/packages/replicache/package.json index 1163d6aeed..ee0d04fc72 100644 --- a/packages/replicache/package.json +++ b/packages/replicache/package.json @@ -46,7 +46,7 @@ "@op-engineering/op-sqlite": ">=15", "@rocicorp/zero-sqlite3": "^1.0.15", "@types/command-line-usage": "^5.0.2", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", "compare-utf8": "^0.1.1", @@ -55,7 +55,7 @@ "playwright": "^1.53.2", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" }, "peerDependencies": { "@op-engineering/op-sqlite": ">=15", diff --git a/packages/shared/package.json b/packages/shared/package.json index 12fdc0b832..dc07237831 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -37,13 +37,13 @@ "devDependencies": { "@types/semver": "^7.5.1", "@types/strip-ansi": "^3.0.0", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "compare-utf8": "^0.1.1", "fast-check": "^3.18.0", "package-up": "^5.0.0", "playwright": "^1.53.2", "type-fest": "^4.30.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" } } diff --git a/packages/shared/src/tool/vitest-config.ts b/packages/shared/src/tool/vitest-config.ts index 9811ee6e56..be2cc5c63f 100644 --- a/packages/shared/src/tool/vitest-config.ts +++ b/packages/shared/src/tool/vitest-config.ts @@ -65,6 +65,7 @@ export default defineConfig({ include: ['src/**/*.{test,spec}{,.node}.?(c|m)[jt]s?(x)'], silent: 'passed-only', browser, + coverage: { provider: 'v8', include: ['src/**'], diff --git a/packages/z2s/package.json b/packages/z2s/package.json index 865f5ef283..48e16b7292 100644 --- a/packages/z2s/package.json +++ b/packages/z2s/package.json @@ -28,10 +28,10 @@ "devDependencies": { "@faker-js/faker": "^9.6.0", "@types/pg": "^8.11.11", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "pg": "^8.16.3", "shared": "0.0.0", - "vitest": "4.1.0", + "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index 19d65ced03..15a3308250 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -18,7 +18,7 @@ "check-types:watch": "tsc --watch", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --quiet --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "bench": "vitest run --config vitest.config.bench.ts", "bench:bmf": "BENCH_OUTPUT_FORMAT=json npm run bench 2>&1 | npx tsx ../shared/src/tool/mitata-json-to-bmf.ts", "bench:bmf:silent": "npm run bench:bmf --silent", @@ -79,13 +79,13 @@ "@types/pg-format": "^1.0.5", "@types/strip-ansi": "^3.0.0", "@types/ws": "^8.5.12", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "mockttp": "^4.2.1", "nock": "^14.0.4", "otel": "0.0.0", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0", + "vitest": "4.1.2", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zql": "0.0.0" diff --git a/packages/zero-client/package.json b/packages/zero-client/package.json index 6e03143607..e5aab54be2 100644 --- a/packages/zero-client/package.json +++ b/packages/zero-client/package.json @@ -6,7 +6,7 @@ "scripts": { "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:watch": "vitest", "test:chromium": "VITEST_BROWSER=chromium vitest run", diff --git a/packages/zero-client/tsconfig.json b/packages/zero-client/tsconfig.json index 26cccaa6b3..a3f2816175 100644 --- a/packages/zero-client/tsconfig.json +++ b/packages/zero-client/tsconfig.json @@ -2,6 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "out", + "rootDir": "../", "noEmit": false, "emitDeclarationOnly": true }, diff --git a/packages/zero-events/package.json b/packages/zero-events/package.json index 728f5ea540..48467e549f 100644 --- a/packages/zero-events/package.json +++ b/packages/zero-events/package.json @@ -28,7 +28,7 @@ "check-types:watch": "tsc --watch", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run" }, "devDependencies": { diff --git a/packages/zero-events/tsconfig.json b/packages/zero-events/tsconfig.json index 7965e9e49d..1d3a57a6fd 100644 --- a/packages/zero-events/tsconfig.json +++ b/packages/zero-events/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "noEmit": false, "emitDeclarationOnly": true, + "rootDir": "../", "outDir": "out" }, "include": ["src"], diff --git a/packages/zero-pg/package.json b/packages/zero-pg/package.json index 8850a1ea46..13835c4766 100644 --- a/packages/zero-pg/package.json +++ b/packages/zero-pg/package.json @@ -17,8 +17,8 @@ "@rocicorp/logger": "^5.4.0" }, "devDependencies": { - "@vitest/runner": "4.1.0", - "vitest": "4.1.0", + "@vitest/runner": "4.1.2", + "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-server": "0.0.0" } diff --git a/packages/zero-protocol/package.json b/packages/zero-protocol/package.json index f74ea1881a..4300ed3817 100644 --- a/packages/zero-protocol/package.json +++ b/packages/zero-protocol/package.json @@ -8,7 +8,7 @@ "check-types:watch": "tsc --watch", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:watch": "vitest watch" }, diff --git a/packages/zero-protocol/src/error.test.ts b/packages/zero-protocol/src/error.test.ts index 82cc5e7f2b..7b472fa251 100644 --- a/packages/zero-protocol/src/error.test.ts +++ b/packages/zero-protocol/src/error.test.ts @@ -43,7 +43,6 @@ describe('ProtocolError', () => { message: 'invalid push', }); - expect(error.stack).toBeDefined(); // Stack formatting differs by engine: V8/Spidermonkey includes error class names, // while WebKit often only includes callsite URLs and line numbers. expect(error.stack).toMatch(/ProtocolError|error\.test\.ts:\d+:\d+/); diff --git a/packages/zero-react-native/package.json b/packages/zero-react-native/package.json index 48698d6577..afbb8464fe 100644 --- a/packages/zero-react-native/package.json +++ b/packages/zero-react-native/package.json @@ -11,7 +11,7 @@ "test:watch": "vitest watch", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { "@rocicorp/resolver": "^1.0.2" diff --git a/packages/zero-react/package.json b/packages/zero-react/package.json index 485fdddaad..0c2803ed83 100644 --- a/packages/zero-react/package.json +++ b/packages/zero-react/package.json @@ -17,7 +17,7 @@ "test:webkit:watch": "VITEST_BROWSER=webkit vitest", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "peerDependencies": { "react": "^18.3.1", diff --git a/packages/zero-schema/package.json b/packages/zero-schema/package.json index 28bfaa93e5..a65414c1ab 100644 --- a/packages/zero-schema/package.json +++ b/packages/zero-schema/package.json @@ -11,7 +11,7 @@ "test:watch": "vitest watch", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "devDependencies": { "shared": "0.0.0", diff --git a/packages/zero-server/package.json b/packages/zero-server/package.json index 41220a3766..d3118feef2 100644 --- a/packages/zero-server/package.json +++ b/packages/zero-server/package.json @@ -21,14 +21,14 @@ }, "devDependencies": { "@prisma/adapter-pg": "^7.2.0", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "@prisma/client": "^7.2.0", "drizzle-orm": "^0.45.1", "pg": "^8.16.3", "postgres": "3.4.7", "prisma": "^7.2.0", "shared": "0.0.0", - "vitest": "4.1.0", + "vitest": "4.1.2", "z2s": "0.0.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", diff --git a/packages/zero-solid/package.json b/packages/zero-solid/package.json index 8cf4c5126d..49ee3bd8b5 100644 --- a/packages/zero-solid/package.json +++ b/packages/zero-solid/package.json @@ -17,7 +17,7 @@ "check-types:watch": "tsc --watch", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "peerDependencies": { "solid-js": "^1.9.4" diff --git a/packages/zero-types/package.json b/packages/zero-types/package.json index 8bebe361b5..a2d0dc0db5 100644 --- a/packages/zero-types/package.json +++ b/packages/zero-types/package.json @@ -15,6 +15,6 @@ "devDependencies": { "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" } } diff --git a/packages/zero/package.json b/packages/zero/package.json index 283fe8a530..cc16031c58 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -79,7 +79,7 @@ }, "devDependencies": { "@op-engineering/op-sqlite": ">=15", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", "expo-sqlite": ">=15", @@ -89,8 +89,8 @@ "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", "typescript": "~5.9.3", - "vite": "8.0.0", - "vitest": "4.1.0", + "vite": "8.0.3", + "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-client": "0.0.0", "zero-pg": "0.0.0", diff --git a/packages/zero/tsconfig.json b/packages/zero/tsconfig.json index 035cecff58..aeac490834 100644 --- a/packages/zero/tsconfig.json +++ b/packages/zero/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "jsx": "react-jsx", "outDir": "out", + "rootDir": "../", "noEmit": false, "emitDeclarationOnly": true }, diff --git a/packages/zql-benchmarks/package.json b/packages/zql-benchmarks/package.json index 46f4190bad..694bd97dd2 100644 --- a/packages/zql-benchmarks/package.json +++ b/packages/zql-benchmarks/package.json @@ -10,7 +10,7 @@ "check-types": "tsc", "check-types:watch": "tsc --watch", "build:bin": "tsc -p tsconfig.bin.json", - "lint": "oxlint --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run --silent=false --disable-console-intercept", "test:watch": "vitest watch", "bench": "vitest run --config vitest.config.bench.ts", diff --git a/packages/zql-integration-tests/package.json b/packages/zql-integration-tests/package.json index 1e57c38c6c..d95a817cf2 100644 --- a/packages/zql-integration-tests/package.json +++ b/packages/zql-integration-tests/package.json @@ -10,7 +10,7 @@ "check-types": "tsc", "check-types:watch": "tsc --watch", "build:bin": "tsc -p tsconfig.bin.json", - "lint": "oxlint --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:pg17": "vitest run --project='*17*'", "test:watch": "vitest watch", diff --git a/packages/zql/package.json b/packages/zql/package.json index 00a078bd32..8bb61fd766 100644 --- a/packages/zql/package.json +++ b/packages/zql/package.json @@ -9,7 +9,7 @@ "check-format": "prettier --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", - "lint": "oxlint --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:watch": "vitest watch" }, diff --git a/packages/zqlite-zql-test/package.json b/packages/zqlite-zql-test/package.json index 7d9be3897a..2ed68578e3 100644 --- a/packages/zqlite-zql-test/package.json +++ b/packages/zqlite-zql-test/package.json @@ -15,10 +15,10 @@ }, "devDependencies": { "@rocicorp/logger": "^5.4.0", - "@vitest/runner": "4.1.0", + "@vitest/runner": "4.1.2", "shared": "0.0.0", "typescript": "~5.9.3", - "vitest": "4.1.0" + "vitest": "4.1.2" }, "dependencies": { "zqlite": "0.0.0" diff --git a/packages/zqlite/package.json b/packages/zqlite/package.json index 4cb5343aa2..83d5234ac0 100644 --- a/packages/zqlite/package.json +++ b/packages/zqlite/package.json @@ -10,7 +10,7 @@ "check-types": "tsc", "check-types:watch": "tsc --watch", "build:bin": "tsc -p tsconfig.bin.json", - "lint": "oxlint --type-aware src/", + "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:watch": "vitest watch", "bench": "vitest bench", diff --git a/prod/functions/package.json b/prod/functions/package.json index 351528f418..ee5dd8385e 100644 --- a/prod/functions/package.json +++ b/prod/functions/package.json @@ -7,7 +7,7 @@ "check-types": "tsc", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { "@rocicorp/zero": "file:rocicorp-zero.tgz" diff --git a/tools/client-simulator/package.json b/tools/client-simulator/package.json index 4a9093055a..ec434ad8ca 100644 --- a/tools/client-simulator/package.json +++ b/tools/client-simulator/package.json @@ -8,7 +8,7 @@ "check-types": "tsc", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { "@dotenvx/dotenvx": "^1.39.0", diff --git a/tools/load-generator/package.json b/tools/load-generator/package.json index 54b0d9bdbf..d8f826397e 100644 --- a/tools/load-generator/package.json +++ b/tools/load-generator/package.json @@ -8,7 +8,7 @@ "check-types": "tsc", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { "@dotenvx/dotenvx": "^1.39.0", diff --git a/tools/process-tracker/package.json b/tools/process-tracker/package.json index a6d5a7ee59..f338bc16b4 100644 --- a/tools/process-tracker/package.json +++ b/tools/process-tracker/package.json @@ -8,7 +8,7 @@ "check-types": "tsc", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { "@rocicorp/logger": "^5.4.0", diff --git a/tools/sqlite-io-yield-simulator/package.json b/tools/sqlite-io-yield-simulator/package.json index 923dbed26e..ce08d52809 100644 --- a/tools/sqlite-io-yield-simulator/package.json +++ b/tools/sqlite-io-yield-simulator/package.json @@ -8,7 +8,7 @@ "check-types": "tsc", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { "@rocicorp/lock": "^1.0.4", diff --git a/tools/verify-package-deps/package.json b/tools/verify-package-deps/package.json index 0fbbb09ea4..66c128abf1 100644 --- a/tools/verify-package-deps/package.json +++ b/tools/verify-package-deps/package.json @@ -13,7 +13,7 @@ "check-types": "tsc", "format": "prettier --write .", "check-format": "prettier --check .", - "lint": "oxlint --type-aware src/" + "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { "oxc-parser": "^0.94.0" From a11fb69ebe2cb6ccc521b105f32ca37f388f332c Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 26 Mar 2026 18:46:01 -0700 Subject: [PATCH 183/495] chore(zero-cache): re-initiate lag report if skipped (#5699) --- .../change-source/pg/change-source.pg.test.ts | 47 ++++++++++- .../change-source/pg/change-source.ts | 77 ++++++++++++++----- 2 files changed, 103 insertions(+), 21 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index 3b81235f08..a70af958f0 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -29,7 +29,7 @@ import type { Commit, } from '../protocol/current/downstream.ts'; import {initializePostgresChangeSource} from './change-source.ts'; -import {toBigInt} from './lsn.ts'; +import {fromStateVersionString, toBigInt, toStateVersionString} from './lsn.ts'; import {dropEventTriggerStatements} from './schema/ddl.ts'; const APP_ID = '23'; @@ -934,6 +934,51 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { } }); + test('replication lag report re-initiated if skipped', async () => { + await startReplication(10); + + // Initiates a lag report. + await source.startLagReporter(); + + // Get the current lsn (which is at or after the lag report) and + // start a subscription _after_ it to skip the lag report. + const [{lsn}] = await upstream< + {lsn: string}[] + > /*sql*/ `SELECT pg_current_wal_lsn() as lsn`; + + const watermark = toStateVersionString(lsn); + lc.debug?.( + `starting subscription from ${watermark} (${fromStateVersionString(watermark)})`, + ); + + const {changes} = await startStream(watermark); + try { + const downstream = drainToQueue(changes); + + const EXPECTED_LAG_REPORT = [ + 'status', + { + ack: false, + lagReport: { + lastTimings: { + sendTimeMs: expect.any(Number), + commitTimeMs: expect.any(Number), + receiveTimeMs: expect.any(Number), + }, + nextSendTimeMs: expect.any(Number), + }, + }, + { + watermark: WATERMARK_REGEX, + }, + ]; + + expect(await downstream.dequeue()).toMatchObject(EXPECTED_LAG_REPORT); + } finally { + changes.cancel(); + } + }); + test('missing replication slot', async () => { await startReplication(); // Purposely drop the replication slot to test the error case. diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index a9d0494859..5fd25721c0 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -85,7 +85,7 @@ import type { MessageRelation as PostgresRelation, } from './logical-replication/pgoutput.types.ts'; import {subscribe, type StreamMessage} from './logical-replication/stream.ts'; -import {fromBigInt, toStateVersionString, type LSN} from './lsn.ts'; +import {fromBigInt, toBigInt, toStateVersionString, type LSN} from './lsn.ts'; import { replicationEventSchema, type DdlUpdateEvent, @@ -291,7 +291,7 @@ class PostgresChangeSource implements ChangeSource { } startLagReporter(): Promise<{nextSendTimeMs: number}> | null { - return this.#lagReporter ? this.#lagReporter.initiateLagReport() : null; + return this.#lagReporter ? this.#lagReporter.initiateLagReport(true) : null; } async startStream( @@ -350,6 +350,17 @@ class PostgresChangeSource implements ChangeSource { lsn: bigint, msg: StreamMessage[1], ): msg is Message => { + if ( + msg.tag === 'message' && + msg.prefix === this.#lagReporter?.messagePrefix + ) { + changes.pushStatus(this.#lagReporter.processLagReport(msg)); + return false; + } + // Checks if we are passed the LSN of the expected lag report, in which + // case a new one is initiated. + this.#lagReporter?.checkCurrentLSN(lsn); + if (msg.tag === 'keepalive') { changes.pushStatus([ 'status', @@ -358,13 +369,6 @@ class PostgresChangeSource implements ChangeSource { ]); return false; } - if ( - msg.tag === 'message' && - msg.prefix === this.#lagReporter?.messagePrefix - ) { - changes.pushStatus(this.#lagReporter.processLagReport(msg)); - return false; - } return true; }; @@ -648,6 +652,11 @@ const lagReportSchema = v.object({ export type LagReport = v.Infer; +type InitiatedLagReport = { + id: string; + lsn: bigint; +}; + class LagReporter { static readonly MESSAGE_SUFFIX = '/lag-report/v1'; @@ -661,7 +670,7 @@ class LagReporter { readonly #lagIntervalMs: number; #pgVersion: number | undefined; - #lastReportID: string = ''; + #expectingLagReport: InitiatedLagReport | null = null; #timer: NodeJS.Timeout | undefined; constructor( @@ -685,22 +694,27 @@ class LagReporter { return this.#pgVersion; } - async initiateLagReport(now = Date.now()) { + async initiateLagReport(log = false) { const pgVersion = this.#pgVersion ?? (await this.#getPgVersion()); - this.#lastReportID = nanoid(); + const now = Date.now(); + const id = nanoid(); + + const lagReport = {id, lsn: 0n}; // lsn is filled in after the db call. + this.#expectingLagReport = lagReport; + let lsn: string; if (pgVersion >= 170000) { - await this.#db /*sql*/ ` + [{lsn}] = await this.#db<{lsn: string}[]> /*sql*/ ` SELECT pg_logical_emit_message( false, ${this.messagePrefix}, json_build_object( - 'id', ${this.#lastReportID}::text, + 'id', ${id}::text, 'sendTimeMs', ${now}::int8, 'commitTimeMs', extract(epoch from now()) * 1000 )::text, true - ); + ) as lsn; `; } else { // Versions before PG 17 do not support the final `flush` option of @@ -708,22 +722,43 @@ class LagReporter { // for replication reports when the db is idle, which is still // acceptable for the purpose for alerting on pathological lag, for // which the threshold is much higher (e.g. many seconds). - await this.#db /*sql*/ ` + [{lsn}] = await this.#db<{lsn: string}[]> /*sql*/ ` SELECT pg_logical_emit_message( false, ${this.messagePrefix}, json_build_object( - 'id', ${this.#lastReportID}::text, + 'id', ${id}::text, 'sendTimeMs', ${now}::int8, 'commitTimeMs', extract(epoch from now()) * 1000 )::text - ); + ) as lsn; `; } + + // Note: We don't know the lsn until after pg_logical_emit_message() + // returns, at which point it is possible that the report has + // already been sent through the replication stream, but this + // is okay since this.#expectingLagReport will have be updated. + lagReport.lsn = toBigInt(lsn); + + if (log) { + this.#lc.info?.(`initiated lag report at lsn ${lsn}`, {id, lsn}); + } return {nextSendTimeMs: now}; } + checkCurrentLSN(lsn: bigint) { + if (this.#expectingLagReport?.lsn && lsn > this.#expectingLagReport.lsn) { + this.#lc.warn?.( + `LSN ${fromBigInt(lsn)} is passed expected lag report ` + + `${fromBigInt(this.#expectingLagReport.lsn)}. Initiating new report.`, + ); + this.#scheduleNextReport(0); + } + } + #scheduleNextReport(delayMs: number) { + this.#expectingLagReport = null; clearTimeout(this.#timer); this.#timer = setTimeout(async () => { try { @@ -746,12 +781,14 @@ class LagReporter { now, report.sendTimeMs + this.#lagIntervalMs, ); - if (report.id === this.#lastReportID) { + if (report.id === this.#expectingLagReport?.id) { + this.#scheduleNextReport(nextSendTimeMs - now); + } else { // Only schedule the next report when receiving the previous report. // For historic reports in the WAL, or reports generated by other // replication-managers, status messages are still sent downstream, // but the next report is not actually scheduled. - this.#scheduleNextReport(nextSendTimeMs - now); + this.#lc.debug?.(`received extraneous lag report`, {report}); } const {sendTimeMs, commitTimeMs} = report; return [ From e142b1ece5a2f9fd8509a7837001a252d8836151 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 26 Mar 2026 19:00:42 -0700 Subject: [PATCH 184/495] chore(zero-cache): log post-close child process error events at "warn" (#5700) --- packages/zero-cache/src/services/life-cycle.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/zero-cache/src/services/life-cycle.ts b/packages/zero-cache/src/services/life-cycle.ts index a46283b5a7..b7a7431268 100644 --- a/packages/zero-cache/src/services/life-cycle.ts +++ b/packages/zero-cache/src/services/life-cycle.ts @@ -102,11 +102,21 @@ export class ProcessManager { } this.#all.add(proc); + let isOpen = true; + proc.on('close', (code, signal) => { + isOpen = false; + this.#onExit(code, signal, null, type, name, proc); + }); + + // As per https://nodejs.org/api/child_process.html#event-error + // 'error' events can happen when sending a message to a child process + // fails. This is not really an error when the server is shutting down, + // so log any post-close errors at 'warn'. proc.on('error', err => - this.#lc.error?.(`error from ${name} ${proc.pid}`, err), - ); - proc.on('close', (code, signal) => - this.#onExit(code, signal, null, type, name, proc), + this.#lc[isOpen ? 'error' : 'warn']?.( + `error from ${name} ${proc.pid}`, + err, + ), ); } From cfcbf0e64b042798cb0a4bb09ab25a16e2110771 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 26 Mar 2026 20:00:07 -0700 Subject: [PATCH 185/495] chore(zero-cache): set busy_timeout during replica init (#5702) --- packages/zero-cache/src/workers/replicator.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/zero-cache/src/workers/replicator.ts b/packages/zero-cache/src/workers/replicator.ts index 4df59a0d72..f5dc3b254b 100644 --- a/packages/zero-cache/src/workers/replicator.ts +++ b/packages/zero-cache/src/workers/replicator.ts @@ -43,6 +43,11 @@ async function connect( ): Promise { const replica = new Database(lc, file); + // To allow other readers (e.g. the change-streamer) to access the replica + // for stats / event publishing, allow a short busy_timeout for performing + // locking operations. + replica.pragma('busy_timeout = 1000'); + // Perform any upgrades to the replica in case the backup is an // earlier version. await upgradeReplica(lc, `${mode}-replica`, file); From e15f49ac00f646d55ae8ad524e58c72329a73e8c Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Fri, 27 Mar 2026 00:52:42 -1000 Subject: [PATCH 186/495] Bump Zero to 1.1.0 --- apps/zbugs/package.json | 2 +- package-lock.json | 164 ++++++++++++++----------------------- packages/zero/package.json | 2 +- 3 files changed, 64 insertions(+), 104 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 0ff541243c..45bbd0fe0c 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -44,7 +44,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "1.0.1", + "@rocicorp/zero": "1.1.0", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", diff --git a/package-lock.json b/package-lock.json index dcdf7fd9e2..c681709fe9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "1.0.1", + "@rocicorp/zero": "1.1.0", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", @@ -209,9 +209,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -229,9 +226,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -249,9 +243,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -269,9 +260,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -289,9 +277,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -309,9 +294,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -633,9 +615,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -653,9 +632,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -673,9 +649,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -693,9 +666,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -713,9 +683,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -733,9 +700,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1068,6 +1032,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.49.2", "@algolia/requester-browser-xhr": "5.49.2", @@ -2091,6 +2056,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -3999,6 +3965,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -4021,6 +3988,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -6594,6 +6562,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6934,6 +6903,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7488,7 +7458,8 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz", "integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.20", @@ -9752,6 +9723,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -9882,6 +9854,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10078,6 +10051,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -10174,6 +10148,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -12529,9 +12504,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -12549,9 +12521,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -12569,9 +12538,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -12589,9 +12555,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -12609,9 +12572,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -12629,9 +12589,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -12649,9 +12606,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -12669,9 +12623,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -13064,6 +13015,7 @@ "integrity": "sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.5.0" }, @@ -14981,6 +14933,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15118,6 +15071,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.23" }, @@ -15135,6 +15089,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -15242,6 +15197,7 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15808,6 +15764,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15884,6 +15841,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -16403,6 +16361,7 @@ "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.2", @@ -16426,6 +16385,7 @@ "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/browser": "4.1.2", "@vitest/mocker": "4.1.2", @@ -16851,6 +16811,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16936,6 +16897,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -16996,6 +16958,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.15.2", "@algolia/client-abtesting": "5.49.2", @@ -18220,6 +18183,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -20175,6 +20139,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -21281,6 +21246,7 @@ "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22903,6 +22869,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -23773,6 +23740,7 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.x" } @@ -24176,6 +24144,7 @@ "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -25389,6 +25358,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -26201,6 +26171,7 @@ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", @@ -28914,7 +28885,8 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/mri": { "version": "1.2.0", @@ -28959,6 +28931,7 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -29280,6 +29253,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -29635,6 +29609,7 @@ "integrity": "sha512-4F/NXJiK2KnK4LQiULUPXRzVq0LOfextGvwCVRW1VKQbF5epI3MDMEGVAl5XjAGL6IFc7xBc/eVA95wczPeEQg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -30107,6 +30082,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", @@ -30470,6 +30446,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31683,6 +31660,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31943,6 +31921,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "7.5.0", "@prisma/dev": "0.20.0", @@ -32373,6 +32352,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32385,6 +32365,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32459,6 +32440,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -32524,6 +32506,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -33770,6 +33753,7 @@ "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -34335,6 +34319,7 @@ "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", @@ -35126,6 +35111,7 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35320,6 +35306,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -35803,7 +35790,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.21.0", @@ -36069,6 +36057,7 @@ "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 18" }, @@ -36114,6 +36103,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -36477,6 +36467,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -36788,6 +36779,7 @@ "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", @@ -36937,6 +36929,7 @@ "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.1.2", "@vitest/mocker": "4.1.2", @@ -37056,6 +37049,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -37839,6 +37833,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -37946,8 +37941,9 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "dev": true, + "devOptional": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -38459,9 +38455,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -38478,9 +38471,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -38497,9 +38487,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -38516,9 +38503,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -38535,9 +38519,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -38554,9 +38535,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -38839,7 +38817,7 @@ }, "packages/zero": { "name": "@rocicorp/zero", - "version": "1.0.1", + "version": "1.1.0", "license": "Apache-2.0", "dependencies": { "@badrap/valita": "0.3.11", @@ -39257,9 +39235,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -39277,9 +39252,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -39297,9 +39269,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -39317,9 +39286,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -39337,9 +39303,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -39357,9 +39320,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ diff --git a/packages/zero/package.json b/packages/zero/package.json index cc16031c58..cc9af300e8 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero", - "version": "1.0.1", + "version": "1.1.0", "description": "Zero is a web framework for serverless web development.", "author": "Rocicorp, Inc.", "repository": { From 38c4cfa8d8b0d12ef0842d4a24e45ec64e43eac3 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Fri, 27 Mar 2026 01:08:06 -1000 Subject: [PATCH 187/495] Bump Zero to 1.2.0 --- apps/zbugs/package.json | 2 +- package-lock.json | 4 ++-- packages/zero/package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 45bbd0fe0c..ce824a05d3 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -44,7 +44,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "1.1.0", + "@rocicorp/zero": "1.2.0", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", diff --git a/package-lock.json b/package-lock.json index c681709fe9..60c3dad1ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "@floating-ui/react": "^0.26.28", "@headlessui/react": "^2.1.8", "@octokit/core": "^6.1.2", - "@rocicorp/zero": "1.1.0", + "@rocicorp/zero": "1.2.0", "@rocicorp/zero-virtual": "^0.1.1", "@schickling/fps-meter": "^0.1.2", "@tanstack/react-virtual": "^3.13.19", @@ -38817,7 +38817,7 @@ }, "packages/zero": { "name": "@rocicorp/zero", - "version": "1.1.0", + "version": "1.2.0", "license": "Apache-2.0", "dependencies": { "@badrap/valita": "0.3.11", diff --git a/packages/zero/package.json b/packages/zero/package.json index cc9af300e8..b4392c07b8 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -1,6 +1,6 @@ { "name": "@rocicorp/zero", - "version": "1.1.0", + "version": "1.2.0", "description": "Zero is a web framework for serverless web development.", "author": "Rocicorp, Inc.", "repository": { From 7331077ec33da5d5b2f2e48f82d94db25a00ead3 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 27 Mar 2026 12:40:30 -0700 Subject: [PATCH 188/495] chore(zero-cache): make replication status publishing less invasive (#5705) --- .../zero-cache/src/server/change-streamer.ts | 7 ++-- packages/zero-cache/src/server/replicator.ts | 7 +++- .../change-source/custom/change-source.ts | 2 +- .../services/change-source/pg/initial-sync.ts | 7 ++-- .../change-streamer-service.ts | 22 ++++++---- .../replicator/incremental-sync.test.ts | 10 ++--- .../services/replicator/incremental-sync.ts | 35 +++++----------- .../replicator/replication-status.test.ts | 16 +++++-- .../services/replicator/replication-status.ts | 42 +++++++++++++------ .../src/services/replicator/replicator.ts | 8 ++-- .../zero-cache/src/services/running-state.ts | 4 ++ packages/zero-cache/src/workers/replicator.ts | 35 ++++++++++++---- 12 files changed, 118 insertions(+), 77 deletions(-) diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index d494a36295..e38a755a40 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -1,6 +1,6 @@ import {assert} from '../../../shared/src/asserts.ts'; import {must} from '../../../shared/src/must.ts'; -import {Database, DatabaseInitError} from '../../../zqlite/src/db.ts'; +import {DatabaseInitError} from '../../../zqlite/src/db.ts'; import {getServerContext} from '../config/server-context.ts'; import {getNormalizedZeroConfig} from '../config/zero-config.ts'; import {deleteLiteDB} from '../db/delete-lite-db.ts'; @@ -103,9 +103,8 @@ export default async function runWorker( context, ); - const replicationStatusPublisher = new ReplicationStatusPublisher( - new Database(lc, replica.file, {readonly: true}), - ); + const replicationStatusPublisher = + ReplicationStatusPublisher.forReplicaFile(replica.file); changeStreamer = await initializeStreamer( lc, diff --git a/packages/zero-cache/src/server/replicator.ts b/packages/zero-cache/src/server/replicator.ts index 073adc2fd4..3fbdec1823 100644 --- a/packages/zero-cache/src/server/replicator.ts +++ b/packages/zero-cache/src/server/replicator.ts @@ -6,6 +6,7 @@ import {getNormalizedZeroConfig} from '../config/zero-config.ts'; import {initEventSink} from '../observability/events.ts'; import {ChangeStreamerHttpClient} from '../services/change-streamer/change-streamer-http.ts'; import {exitAfter, runUntilKilled} from '../services/life-cycle.ts'; +import {ReplicationStatusPublisher} from '../services/replicator/replication-status.ts'; import { ReplicatorService, type ReplicatorMode, @@ -73,9 +74,11 @@ export default async function runWorker( `${workerName}-${pid}`, mode, changeStreamer, - replica, workerClient, - runningLocalChangeStreamer, // publish ReplicationStatusEvents + runningLocalChangeStreamer + ? // publish ReplicationStatusEvents from backup-replicator only + ReplicationStatusPublisher.forReplicaFile(dbPath) + : null, ); setUpMessageHandlers(lc, replicator, parent); diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.ts b/packages/zero-cache/src/services/change-source/custom/change-source.ts index 8aefd0221c..746940d65c 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.ts @@ -181,7 +181,7 @@ export async function initialSync( }, ); - const statusPublisher = new ReplicationStatusPublisher(tx); + const statusPublisher = ReplicationStatusPublisher.forRunningTransaction(tx); try { let num = 0; for await (const change of changes) { diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts index f084b9daf7..8c4d0bf8f0 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.ts @@ -86,10 +86,9 @@ export async function initialSync( connection: {replication: 'database'}, // https://www.postgresql.org/docs/current/protocol-replication.html }); const slotName = newReplicationSlot(shard); - const statusPublisher = new ReplicationStatusPublisher(tx).publish( - lc, - 'Initializing', - ); + const statusPublisher = ReplicationStatusPublisher.forRunningTransaction( + tx, + ).publish(lc, 'Initializing'); try { await checkUpstreamConfig(sql); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 3a2611a5dc..587d44ed69 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -97,6 +97,8 @@ export async function initializeStreamer( ); } +const REPLICATION_STATUS_ERROR_DELAY_THRESHOLD_MS = 5000; + /** * Internally all Downstream messages (not just commits) are given a watermark. * These are used for internal ordering for: @@ -355,12 +357,18 @@ class ChangeStreamerImpl implements ChangeStreamerService { this.#storer.run().catch(e => stream.changes.cancel(e)); this.#stream = stream; - this.#state.resetBackoff(); - this.#replicationStatusPublisher.publish( - this.#lc, - 'Replicating', - `Replicating from ${lastWatermark}`, - ); + if ( + this.#state.resetBackoff() > + REPLICATION_STATUS_ERROR_DELAY_THRESHOLD_MS + ) { + // After recovering from a backoff for which a replication status + // error was published, publish an OK status + this.#replicationStatusPublisher.publish( + this.#lc, + 'Replicating', + `Replicating from ${lastWatermark}`, + ); + } watermark = null; for await (const change of stream.changes) { @@ -447,7 +455,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { await Promise.all([ this.#storer.stop(), this.#state.backoff(this.#lc, err), - this.#state.retryDelay > 5000 + this.#state.retryDelay > REPLICATION_STATUS_ERROR_DELAY_THRESHOLD_MS ? publishCriticalEvent( this.#lc, replicationStatusError(this.#lc, 'Replicating', err), diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index d2b7816fc8..0b48d33fed 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -23,6 +23,7 @@ import { type SubscriberContext, } from '../change-streamer/change-streamer.ts'; import {IncrementalSyncer} from './incremental-sync.ts'; +import {ReplicationStatusPublisher} from './replication-status.ts'; import { createReplicationStateTables, initReplicationState, @@ -75,10 +76,9 @@ describe('replicator/incremental-sync', () => { TASK_ID, REPLICA_ID, {subscribe: subscribeFn.mockResolvedValue(downstream)}, - mainDb, worker, 'serving', - true, + ReplicationStatusPublisher.forReplicaFile(dbFile.path), ); }); @@ -725,10 +725,9 @@ describe('replicator/incremental-sync', () => { return resolver().promise; }), }, - mainDb, worker, 'serving', - true, + ReplicationStatusPublisher.forReplicaFile(dbFile.path), ); const localSyncing = syncer.run(); @@ -756,10 +755,9 @@ describe('replicator/incremental-sync', () => { return resolver().promise; }), }, - mainDb, worker, 'serving', - true, + ReplicationStatusPublisher.forReplicaFile(dbFile.path), ); const localSyncing = syncer.run(); diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.ts b/packages/zero-cache/src/services/replicator/incremental-sync.ts index fbb80e614d..6b97915407 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.ts @@ -1,5 +1,4 @@ import type {LogContext} from '@rocicorp/logger'; -import type {Database} from '../../../../zqlite/src/db.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import type {Source} from '../../types/streams.ts'; import type {DownloadStatus} from '../change-source/protocol/current.ts'; @@ -12,7 +11,7 @@ import { import {RunningState} from '../running-state.ts'; import type {CommitResult} from './change-processor.ts'; import {Notifier} from './notifier.ts'; -import {ReplicationStatusPublisher} from './replication-status.ts'; +import type {ReplicationStatusPublisher} from './replication-status.ts'; import type {ReplicaState, ReplicatorMode} from './replicator.ts'; import {ReplicationReportRecorder} from './reporter/recorder.ts'; import type {ReplicationReport} from './reporter/report-schema.ts'; @@ -30,10 +29,9 @@ export class IncrementalSyncer { readonly #taskID: string; readonly #id: string; readonly #changeStreamer: ChangeStreamer; - readonly #statusDb: Database; readonly #worker: WriteWorkerClient; readonly #mode: ReplicatorMode; - readonly #publishReplicationStatus: boolean; + readonly #statusPublisher: ReplicationStatusPublisher | null; readonly #notifier: Notifier; readonly #reporter: ReplicationReportRecorder; @@ -50,19 +48,17 @@ export class IncrementalSyncer { taskID: string, id: string, changeStreamer: ChangeStreamer, - statusDb: Database, worker: WriteWorkerClient, mode: ReplicatorMode, - publishReplicationStatus: boolean, + statusPublisher: ReplicationStatusPublisher | null, ) { this.#lc = lc; this.#taskID = taskID; this.#id = id; this.#changeStreamer = changeStreamer; - this.#statusDb = statusDb; this.#worker = worker; this.#mode = mode; - this.#publishReplicationStatus = publishReplicationStatus; + this.#statusPublisher = statusPublisher; this.#notifier = new Notifier(); this.#reporter = new ReplicationReportRecorder(lc); } @@ -77,11 +73,6 @@ export class IncrementalSyncer { // Notify any waiting subscribers that the replica is ready to be read. void this.#notifier.notifySubscribers(); - // Only the backup replicator publishes replication status events. - const statusPublisher = this.#publishReplicationStatus - ? new ReplicationStatusPublisher(this.#statusDb) - : undefined; - while (this.#state.shouldRun()) { const {replicaVersion, watermark} = await this.#worker.getSubscriptionState(); @@ -102,7 +93,7 @@ export class IncrementalSyncer { }); this.#state.resetBackoff(); unregister = this.#state.cancelOnStop(downstream); - statusPublisher?.publish( + this.#statusPublisher?.publish( lc, 'Replicating', `Replicating from ${watermark}`, @@ -140,7 +131,7 @@ export class IncrementalSyncer { if (!backfillStatus) { // Start publishing the status every 3 seconds. backfillStatus = status; - statusPublisher?.publish( + this.#statusPublisher?.publish( lc, 'Replicating', `Backfilling ${msg.relation.name} table`, @@ -169,7 +160,7 @@ export class IncrementalSyncer { message as ChangeStreamData, ); - this.#handleResult(lc, result, statusPublisher); + this.#handleResult(lc, result); if (result?.completedBackfill) { backfillStatus = undefined; } @@ -184,25 +175,21 @@ export class IncrementalSyncer { } finally { downstream?.cancel(); unregister(); - statusPublisher?.stop(); + this.#statusPublisher?.stop(); } await this.#state.backoff(lc, err); } lc.info?.('IncrementalSyncer stopped'); } - #handleResult( - lc: LogContext, - result: CommitResult | null, - statusPublisher: ReplicationStatusPublisher | undefined, - ) { + #handleResult(lc: LogContext, result: CommitResult | null) { if (!result) { return; } if (result.completedBackfill) { // Publish the final status const status = result.completedBackfill; - statusPublisher?.publish( + this.#statusPublisher?.publish( lc, 'Replicating', `Backfilled ${status.table} table`, @@ -210,7 +197,7 @@ export class IncrementalSyncer { () => ({downloadStatus: [status]}), ); } else if (result.schemaUpdated) { - statusPublisher?.publish(lc, 'Replicating', 'Schema updated'); + this.#statusPublisher?.publish(lc, 'Replicating', 'Schema updated'); } if (result.watermark && result.changeLogUpdated) { void this.#notifier.notifySubscribers({state: 'version-ready'}); diff --git a/packages/zero-cache/src/services/replicator/replication-status.test.ts b/packages/zero-cache/src/services/replicator/replication-status.test.ts index bcce38811a..1a704235ab 100644 --- a/packages/zero-cache/src/services/replicator/replication-status.test.ts +++ b/packages/zero-cache/src/services/replicator/replication-status.test.ts @@ -1,7 +1,8 @@ import type {LogContext} from '@rocicorp/logger'; import {beforeEach, describe, expect, test, vi} from 'vitest'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; -import {Database} from '../../../../zqlite/src/db.ts'; +import type {Database} from '../../../../zqlite/src/db.ts'; +import {DbFile} from '../../test/lite.ts'; import { replicationStatusError, replicationStatusEvent, @@ -11,12 +12,18 @@ import {CREATE_TABLE_METADATA_TABLE} from './schema/table-metadata.ts'; describe('replicator/replication-status', () => { let lc: LogContext; + let replicaFile: DbFile; let replica: Database; beforeEach(() => { lc = createSilentLogContext(); - replica = new Database(createSilentLogContext(), ':memory:'); + + replicaFile = new DbFile('replication-status'); + replica = replicaFile.connect(lc); + replica.exec(CREATE_TABLE_METADATA_TABLE); + + return () => replicaFile.delete(); }); test('initializing', () => { @@ -293,7 +300,10 @@ describe('replicator/replication-status', () => { test('publish with extra state callback', () => { const publish = vi.fn(); - const publisher = new ReplicationStatusPublisher(replica, publish); + const publisher = ReplicationStatusPublisher.forReplicaFile( + replicaFile.path, + publish, + ); publisher.publish( lc, diff --git a/packages/zero-cache/src/services/replicator/replication-status.ts b/packages/zero-cache/src/services/replicator/replication-status.ts index 2213056cd6..1756af52cd 100644 --- a/packages/zero-cache/src/services/replicator/replication-status.ts +++ b/packages/zero-cache/src/services/replicator/replication-status.ts @@ -21,16 +21,34 @@ const byKeys = (a: [string, unknown], b: [string, unknown]) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0; export class ReplicationStatusPublisher { - readonly #db: Database; + readonly #dbRunner: (lc: LogContext, fn: (db: Database) => T) => T; readonly #publish: typeof publishCriticalEvent; #timer: NodeJS.Timeout | undefined; - static forTesting(lc: LogContext = createSilentLogContext(), db?: Database) { - return new ReplicationStatusPublisher(db ?? new Database(lc, ':memory:')); + static forTesting() { + return ReplicationStatusPublisher.forReplicaFile(':memory:'); } - constructor(db: Database, publishFn = publishCriticalEvent) { - this.#db = db; + static forRunningTransaction(tx: Database, publishFn = publishCriticalEvent) { + return new ReplicationStatusPublisher((_lc, fn) => fn(tx), publishFn); + } + + static forReplicaFile(file: string, publishFn = publishCriticalEvent) { + return new ReplicationStatusPublisher((lc, fn) => { + const db = new Database(lc, file, {readonly: true}); + try { + return fn(db); + } finally { + db.close(); + } + }, publishFn); + } + + constructor( + dbRunner: (lc: LogContext, fn: (db: Database) => T) => T, + publishFn = publishCriticalEvent, + ) { + this.#dbRunner = dbRunner; this.#publish = publishFn; } @@ -43,13 +61,9 @@ export class ReplicationStatusPublisher { now = new Date(), ): this { this.stop(); - const event = replicationStatusEvent( - lc, - this.#db, - stage, - 'OK', - description, - now, + + const event = this.#dbRunner(lc, db => + replicationStatusEvent(lc, db, stage, 'OK', description, now), ); if (event.state) { event.state = { @@ -74,7 +88,9 @@ export class ReplicationStatusPublisher { e: unknown, ): Promise { this.stop(); - const event = replicationStatusError(lc, stage, e, this.#db); + const event = this.#dbRunner(lc, db => + replicationStatusError(lc, stage, e, db), + ); await this.#publish(lc, event); throw e; } diff --git a/packages/zero-cache/src/services/replicator/replicator.ts b/packages/zero-cache/src/services/replicator/replicator.ts index af21300bb1..dfbce717f7 100644 --- a/packages/zero-cache/src/services/replicator/replicator.ts +++ b/packages/zero-cache/src/services/replicator/replicator.ts @@ -1,10 +1,10 @@ import type {LogContext} from '@rocicorp/logger'; import type {ReadonlyJSONObject} from '../../../../shared/src/json.ts'; -import type {Database} from '../../../../zqlite/src/db.ts'; import type {Source} from '../../types/streams.ts'; import type {ChangeStreamer} from '../change-streamer/change-streamer.ts'; import type {Service} from '../service.ts'; import {IncrementalSyncer} from './incremental-sync.ts'; +import type {ReplicationStatusPublisher} from './replication-status.ts'; import type {WriteWorkerClient} from './write-worker-client.ts'; /** See {@link ReplicaStateNotifier.subscribe()}. */ @@ -65,9 +65,8 @@ export class ReplicatorService implements Replicator, Service { id: string, mode: ReplicatorMode, changeStreamer: ChangeStreamer, - statusDb: Database, worker: WriteWorkerClient, - publishReplicationStatus: boolean, + statusPublisher: ReplicationStatusPublisher | null, ) { this.id = id; this.#lc = lc @@ -80,10 +79,9 @@ export class ReplicatorService implements Replicator, Service { taskID, `${taskID}/${id}`, changeStreamer, - statusDb, worker, mode, - publishReplicationStatus, + statusPublisher, ); } diff --git a/packages/zero-cache/src/services/running-state.ts b/packages/zero-cache/src/services/running-state.ts index df84bbdf3f..80cf488349 100644 --- a/packages/zero-cache/src/services/running-state.ts +++ b/packages/zero-cache/src/services/running-state.ts @@ -167,9 +167,13 @@ export class RunningState { * When using {@link backoff()}, this method should be called when the * implementation receives a healthy signal (e.g. a successful * response). This resets the delay used in {@link backoff()}. + * + * @returns The previous backoff delay */ resetBackoff() { + const prevDelay = this.#retryDelay; this.#retryDelay = this.#initialRetryDelay; + return prevDelay; } } diff --git a/packages/zero-cache/src/workers/replicator.ts b/packages/zero-cache/src/workers/replicator.ts index f5dc3b254b..5797491fef 100644 --- a/packages/zero-cache/src/workers/replicator.ts +++ b/packages/zero-cache/src/workers/replicator.ts @@ -1,4 +1,5 @@ import type {LogContext} from '@rocicorp/logger'; +import {sleep} from '../../../shared/src/sleep.ts'; import * as v from '../../../shared/src/valita.ts'; import {Database} from '../../../zqlite/src/db.ts'; import type {ReplicaOptions} from '../config/zero-config.ts'; @@ -43,17 +44,12 @@ async function connect( ): Promise { const replica = new Database(lc, file); - // To allow other readers (e.g. the change-streamer) to access the replica - // for stats / event publishing, allow a short busy_timeout for performing - // locking operations. - replica.pragma('busy_timeout = 1000'); - // Perform any upgrades to the replica in case the backup is an // earlier version. await upgradeReplica(lc, `${mode}-replica`, file); // Start by folding any (e.g. restored) WAL(2) files into the main db. - replica.pragma('journal_mode = delete'); + await setJournalMode(lc, replica, 'delete'); const [{page_size: pageSize}] = replica.pragma<{page_size: number}>( 'page_size', @@ -90,8 +86,7 @@ async function connect( } } - lc.info?.(`setting ${file} to ${walMode} mode`); - replica.pragma(`journal_mode = ${walMode}`); + await setJournalMode(lc, replica, walMode); const pragmas = getPragmaConfig(mode); applyPragmas(replica, pragmas); @@ -101,6 +96,30 @@ async function connect( return replica; } +// Setting the journal_mode requires an exclusive lock on the replica. +// Add resilience against random replica reads (for stats, etc.) by +// retrying if the database is locked. Note that the busy_timeout doesn't +// work here. +async function setJournalMode( + lc: LogContext, + replica: Database, + mode: 'delete' | 'wal' | 'wal2', +) { + lc.info?.(`setting ${replica.name} to ${mode} mode`); + let err: unknown; + for (let i = 0; i < 5; i++) { + try { + replica.pragma(`journal_mode = ${mode}`); + return; + } catch (e) { + lc.warn?.(`error setting journal_mode to ${mode} (attempt ${i + 1})`, e); + err = e; + } + await sleep(500); + } + throw err; +} + /** * Returns the PragmaConfig for a given replica file mode. * This is used by both the main thread (setupReplica) and From 2d1cf7643079e083203525fd06d635e891ccec6f Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 27 Mar 2026 15:49:30 -0700 Subject: [PATCH 189/495] chore(zero-cache): skip optimize for readonly dbs (#5707) --- packages/zqlite/src/db.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/zqlite/src/db.ts b/packages/zqlite/src/db.ts index a9db3bf339..aa4ef1ffb3 100644 --- a/packages/zqlite/src/db.ts +++ b/packages/zqlite/src/db.ts @@ -137,14 +137,16 @@ export class Database implements Disposable { close(): void { const start = Date.now(); - try { - this.#db.pragma('optimize'); - const elapsed = Date.now() - start; - if (elapsed > 2) { - this.#lc.debug?.(`PRAGMA optimized (${elapsed} ms)`); + if (!this.#db.readonly) { + try { + this.#db.pragma('optimize'); + const elapsed = Date.now() - start; + if (elapsed > 2) { + this.#lc.debug?.(`PRAGMA optimized (${elapsed} ms)`); + } + } catch (e) { + this.#lc.warn?.('error running PRAGMA optimize', e); } - } catch (e) { - this.#lc.warn?.('error running PRAGMA optimize', e); } this.#db.close(); } From ad27277727215716480182d06963945e1c052ab5 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 27 Mar 2026 16:37:47 -0700 Subject: [PATCH 190/495] chore(zero-cache): enable lag reporting by default (#5709) --- .../zero-cache/src/config/zero-config.test.ts | 4 +- packages/zero-cache/src/config/zero-config.ts | 4 +- .../services/change-source/change-source.ts | 2 +- .../change-source/pg/change-source.ts | 61 ++++++++++++++----- packages/zero-cache/src/types/pg.ts | 4 ++ 5 files changed, 55 insertions(+), 20 deletions(-) diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index 3893a3ee16..19bc737027 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -414,13 +414,13 @@ test('zero-cache --help', () => { clients. This is a heavy-weight operation and can result in user-visible slowness or downtime if compute resources are scarce. - --replication-lag-report-interval-ms number optional + --replication-lag-report-interval-ms number default: 30000 ZERO_REPLICATION_LAG_REPORT_INTERVAL_MS env The minimum interval at which replication lag reports are written upstream and reported via the zero.replication.total_lag opentelemetry metric. Because replication lag reports are only issued after the previous one was received, the actual interval between reports may be longer when there is a backlog in the - replication stream. + replication stream. A negative or 0 value disables lag reporting. This monitoring feature is only support on the postgres upstream type. diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index ea0ac2086c..796d2fa49c 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -638,13 +638,13 @@ export const zeroOptions = { replicationLag: { reportIntervalMs: { - type: v.number().optional(), + type: v.number().default(30000), desc: [ `The minimum interval at which replication lag reports are written upstream and`, `reported via the {bold zero.replication.total_lag} opentelemetry metric. Because`, `replication lag reports are only issued after the previous one was received, the`, `actual interval between reports may be longer when there is a backlog in the`, - `replication stream.`, + `replication stream. A negative or 0 value disables lag reporting.`, ``, `This monitoring feature is only support on the postgres upstream type.`, ], diff --git a/packages/zero-cache/src/services/change-source/change-source.ts b/packages/zero-cache/src/services/change-source/change-source.ts index 22176bba49..73547f243b 100644 --- a/packages/zero-cache/src/services/change-source/change-source.ts +++ b/packages/zero-cache/src/services/change-source/change-source.ts @@ -21,7 +21,7 @@ export interface ChangeSource { * Starts a replication lag reporter, returning the send time of the next * expected report, or `null` if lag reporting is not supported / enabled. */ - startLagReporter(): Promise<{nextSendTimeMs: number}> | null; + startLagReporter(): Promise<{nextSendTimeMs: number} | null> | null; /** * Starts a stream of changes starting after the specific watermark, diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 5fd25721c0..c966ec2845 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -1,5 +1,6 @@ import { PG_ADMIN_SHUTDOWN, + PG_INSUFFICIENT_PRIVILEGE, PG_OBJECT_IN_USE, } from '@drdgvhbh/postgres-error-codes'; import type {LogContext} from '@rocicorp/logger'; @@ -31,7 +32,7 @@ import type { } from '../../../db/specs.ts'; import {StatementRunner} from '../../../db/statements.ts'; import {type LexiVersion} from '../../../types/lexi-version.ts'; -import {pgClient, type PostgresDB} from '../../../types/pg.ts'; +import {isPostgresError, pgClient, type PostgresDB} from '../../../types/pg.ts'; import { upstreamSchema, type ShardConfig, @@ -110,6 +111,8 @@ import { } from './schema/shard.ts'; import {validate} from './schema/validation.ts'; +const PG_17 = 170000; + /** * Initializes a Postgres change source, including the initial sync of the * replica, before streaming changes from the corresponding logical replication @@ -122,7 +125,7 @@ export async function initializePostgresChangeSource( replicaDbFile: string, syncOptions: InitialSyncOptions, context: ServerContext, - lagReportIntervalMs?: number, + lagReportIntervalMs = 0, ): Promise<{subscriptionState: SubscriptionState; changeSource: ChangeSource}> { await initReplica( lc, @@ -154,7 +157,7 @@ export async function initializePostgresChangeSource( shard, upstreamReplica, context, - lagReportIntervalMs ?? null, + lagReportIntervalMs, ); return {subscriptionState, changeSource}; @@ -268,7 +271,7 @@ class PostgresChangeSource implements ChangeSource { shard: ShardID, replica: Replica, context: ServerContext, - lagReportIntervalMs: number | null, + lagReportIntervalMs: number, ) { this.#lc = lc.withContext('component', 'change-source'); this.#db = pgClient(lc, upstreamUri, { @@ -280,18 +283,42 @@ class PostgresChangeSource implements ChangeSource { this.#shard = shard; this.#replica = replica; this.#context = context; - this.#lagReporter = lagReportIntervalMs - ? new LagReporter( - lc.withContext('component', 'lag-reporter'), - shard, - this.#db, - lagReportIntervalMs, - ) - : null; + this.#lagReporter = + lagReportIntervalMs > 0 + ? new LagReporter( + lc.withContext('component', 'lag-reporter'), + shard, + this.#db, + lagReportIntervalMs, + ) + : null; } - startLagReporter(): Promise<{nextSendTimeMs: number}> | null { - return this.#lagReporter ? this.#lagReporter.initiateLagReport(true) : null; + async startLagReporter(): Promise<{nextSendTimeMs: number} | null> { + if (this.#lagReporter) { + try { + return await this.#lagReporter.initiateLagReport(true); + } catch (e) { + if (isPostgresError(e, PG_INSUFFICIENT_PRIVILEGE)) { + const functionName = + (this.#lagReporter.pgVersion ?? 0) >= PG_17 + ? 'pg_logical_emit_message(boolean, text, text, boolean)' + : 'pg_logical_emit_message(boolean, text, text)'; + this.#lc.warn?.( + `\n\nUnable to initiate replication lag reports due to insufficient privileges.` + + `\nTo enable replication lag reporting, run:`, + `\n\tGRANT EXECUTE ON FUNCTION ${functionName} TO ;\n\n`, + e, + ); + } else { + this.#lc.error?.( + `Unexpected error while initiating lag reports. Lag reports will be disabled.`, + e, + ); + } + } + } + return null; } async startStream( @@ -694,6 +721,10 @@ class LagReporter { return this.#pgVersion; } + get pgVersion() { + return this.#pgVersion; + } + async initiateLagReport(log = false) { const pgVersion = this.#pgVersion ?? (await this.#getPgVersion()); const now = Date.now(); @@ -703,7 +734,7 @@ class LagReporter { this.#expectingLagReport = lagReport; let lsn: string; - if (pgVersion >= 170000) { + if (pgVersion >= PG_17) { [{lsn}] = await this.#db<{lsn: string}[]> /*sql*/ ` SELECT pg_logical_emit_message( false, diff --git a/packages/zero-cache/src/types/pg.ts b/packages/zero-cache/src/types/pg.ts index 05c1c41c8c..ffcfeafd1d 100644 --- a/packages/zero-cache/src/types/pg.ts +++ b/packages/zero-cache/src/types/pg.ts @@ -372,3 +372,7 @@ export const typeNameByOID: Record = Object.freeze( ]), ), ); + +export function isPostgresError(e: unknown, ...codes: [string, ...string[]]) { + return e instanceof postgres.PostgresError && codes.includes(e.code); +} From 26f26e28d44c6783007c1e2fa7de21d23ef4e898 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Fri, 27 Mar 2026 20:22:42 -0400 Subject: [PATCH 191/495] fix(zql): do not yet use `cap` (#5708) need to figure out cvr diff. cap could theoretically return a different row than the query returned before while at the same CVR version. --------- Co-authored-by: Gregory Baker --- packages/zql/src/builder/builder.ts | 51 +--- packages/zql/src/ivm/cap.push.test.ts | 335 ++------------------------ 2 files changed, 36 insertions(+), 350 deletions(-) diff --git a/packages/zql/src/builder/builder.ts b/packages/zql/src/builder/builder.ts index ac33a94476..f399ab95c0 100644 --- a/packages/zql/src/builder/builder.ts +++ b/packages/zql/src/builder/builder.ts @@ -32,7 +32,6 @@ import {Join} from '../ivm/join.ts'; import type {Input, InputBase, Storage} from '../ivm/operator.ts'; import {Skip} from '../ivm/skip.ts'; import type {Source, SourceInput} from '../ivm/source.ts'; -import {Cap} from '../ivm/cap.ts'; import {Take} from '../ivm/take.ts'; import {UnionFanIn} from '../ivm/union-fan-in.ts'; import {UnionFanOut} from '../ivm/union-fan-out.ts'; @@ -259,7 +258,6 @@ function buildPipelineInternal( queryID: string, name: string, partitionKey?: CompoundKey, - isNonFlippedExistsChild?: boolean | undefined, ): Input { const source = delegate.getSource(ast.table); if (!source) { @@ -290,18 +288,8 @@ function buildPipelineInternal( } } } - if (isNonFlippedExistsChild) { - assert(ast.start === undefined, 'EXISTS subqueries must not have start'); - assert( - ast.related === undefined, - 'EXISTS subqueries must not have related', - ); - } - const conn = source.connect( - // exists pipelines are unordered — orderBy is ignored here. - // Non-exists pipelines always have orderBy completed with PKs. - isNonFlippedExistsChild ? undefined : must(ast.orderBy), + must(ast.orderBy), ast.where, splitEditKeys, delegate.debug, @@ -345,32 +333,15 @@ function buildPipelineInternal( } if (ast.limit !== undefined) { - // We end `exists` pipelines with `cap` - // The reason is that `cap` does not care about the order of the pipeline. - // This allows SQLite to chose the order and never end up creating temp b-trees. - // The problem with SQLite creating a temp b-tree is it will incur a scan of the entire - // result set where exists only needs the first row. - if (isNonFlippedExistsChild) { - const capName = `${name}:cap`; - const cap = new Cap( - end, - delegate.createStorage(capName), - ast.limit, - partitionKey, - ); - delegate.addEdge(end, cap); - end = delegate.decorateInput(cap, capName); - } else { - const takeName = `${name}:take`; - const take = new Take( - end, - delegate.createStorage(takeName), - ast.limit, - partitionKey, - ); - delegate.addEdge(end, take); - end = delegate.decorateInput(take, takeName); - } + const takeName = `${name}:take`; + const take = new Take( + end, + delegate.createStorage(takeName), + ast.limit, + partitionKey, + ); + delegate.addEdge(end, take); + end = delegate.decorateInput(take, takeName); } if (ast.related) { @@ -484,7 +455,6 @@ function applyFilterWithFlips( '', `${name}.${sq.subquery.alias}`, sq.correlation.childField, - false, ); const flippedJoin = new FlippedJoin({ parent: end, @@ -659,7 +629,6 @@ function applyCorrelatedSubQuery( queryID, `${name}.${sq.subquery.alias}`, sq.correlation.childField, - fromCondition, ); const joinName = `${name}:join(${sq.subquery.alias})`; diff --git a/packages/zql/src/ivm/cap.push.test.ts b/packages/zql/src/ivm/cap.push.test.ts index 1cd1d518ce..aebb6ac92c 100644 --- a/packages/zql/src/ivm/cap.push.test.ts +++ b/packages/zql/src/ivm/cap.push.test.ts @@ -98,43 +98,10 @@ suite('Cap push - basic behavior', () => { }, ] `); - expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` - { - "["cap","i1"]": { - "pks": [ - "["c1"]", - "["c2"]", - ], - "size": 2, - }, - } - `); - expect(log.filter(msg => msg[0] === '.comments:cap')) - .toMatchInlineSnapshot(` - [ - [ - ".comments:cap", - "push", - { - "row": { - "id": "c2", - "issueID": "i1", - "text": "c2", - }, - "type": "add", - }, - ], - [ - ".comments:cap", - "fetch", - { - "constraint": { - "issueID": "i1", - }, - }, - ], - ] - `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(`undefined`); + expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( + `[]`, + ); expect(pushes).toMatchInlineSnapshot(` [ { @@ -216,18 +183,7 @@ suite('Cap push - basic behavior', () => { }, ] `); - expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` - { - "["cap","i1"]": { - "pks": [ - "["c1"]", - "["c2"]", - "["c3"]", - ], - "size": 3, - }, - } - `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(`undefined`); expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( `[]`, ); @@ -289,65 +245,10 @@ suite('Cap push - basic behavior', () => { }, ] `); - expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` - { - "["cap","i1"]": { - "pks": [ - "["c1"]", - "["c3"]", - "["c4"]", - ], - "size": 3, - }, - } - `); - expect(log.filter(msg => msg[0] === '.comments:cap')) - .toMatchInlineSnapshot(` - [ - [ - ".comments:cap", - "push", - { - "row": { - "id": "c2", - "issueID": "i1", - "text": "c2", - }, - "type": "remove", - }, - ], - [ - ".comments:cap", - "fetch", - { - "constraint": { - "issueID": "i1", - }, - }, - ], - [ - ".comments:cap", - "push", - { - "row": { - "id": "c4", - "issueID": "i1", - "text": "c4", - }, - "type": "add", - }, - ], - [ - ".comments:cap", - "fetch", - { - "constraint": { - "issueID": "i1", - }, - }, - ], - ] - `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(`undefined`); + expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( + `[]`, + ); expect(pushes).toMatchInlineSnapshot(` [ { @@ -437,42 +338,10 @@ suite('Cap push - basic behavior', () => { }, ] `); - expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` - { - "["cap","i1"]": { - "pks": [ - "["c2"]", - ], - "size": 1, - }, - } - `); - expect(log.filter(msg => msg[0] === '.comments:cap')) - .toMatchInlineSnapshot(` - [ - [ - ".comments:cap", - "push", - { - "row": { - "id": "c1", - "issueID": "i1", - "text": "c1", - }, - "type": "remove", - }, - ], - [ - ".comments:cap", - "fetch", - { - "constraint": { - "issueID": "i1", - }, - }, - ], - ] - `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(`undefined`); + expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( + `[]`, + ); expect(pushes).toMatchInlineSnapshot(` [ { @@ -522,40 +391,10 @@ suite('Cap push - basic behavior', () => { }); expect(data).toMatchInlineSnapshot(`[]`); - expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` - { - "["cap","i1"]": { - "pks": [], - "size": 0, - }, - } - `); - expect(log.filter(msg => msg[0] === '.comments:cap')) - .toMatchInlineSnapshot(` - [ - [ - ".comments:cap", - "push", - { - "row": { - "id": "c1", - "issueID": "i1", - "text": "c1", - }, - "type": "remove", - }, - ], - [ - ".comments:cap", - "fetch", - { - "constraint": { - "issueID": "i1", - }, - }, - ], - ] - `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(`undefined`); + expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( + `[]`, + ); expect(pushes).toMatchInlineSnapshot(` [ { @@ -638,18 +477,7 @@ suite('Cap push - basic behavior', () => { }, ] `); - expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` - { - "["cap","i1"]": { - "pks": [ - "["c1"]", - "["c2"]", - "["c3"]", - ], - "size": 3, - }, - } - `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(`undefined`); expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( `[]`, ); @@ -704,48 +532,10 @@ suite('Cap push - basic behavior', () => { }, ] `); - expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(` - { - "["cap","i1"]": { - "pks": [ - "["c1"]", - "["c2"]", - ], - "size": 2, - }, - } - `); - expect(log.filter(msg => msg[0] === '.comments:cap')) - .toMatchInlineSnapshot(` - [ - [ - ".comments:cap", - "push", - { - "oldRow": { - "id": "c1", - "issueID": "i1", - "text": "c1", - }, - "row": { - "id": "c1", - "issueID": "i1", - "text": "c1 updated", - }, - "type": "edit", - }, - ], - [ - ".comments:cap", - "fetch", - { - "constraint": { - "issueID": "i1", - }, - }, - ], - ] - `); + expect(actualStorage['.comments:cap']).toMatchInlineSnapshot(`undefined`); + expect(log.filter(msg => msg[0] === '.comments:cap')).toMatchInlineSnapshot( + `[]`, + ); expect(pushes).toMatchInlineSnapshot(` [ { @@ -906,83 +696,10 @@ suite('Cap push - unordered overlay in join', () => { }, ] `); - expect(actualStorage['.children:cap']).toMatchInlineSnapshot(` - { - "["cap","g1"]": { - "pks": [ - "["x2"]", - "["x3"]", - "["x4"]", - ], - "size": 3, - }, - } - `); - expect(log.filter(msg => msg[0] === '.children:cap')) - .toMatchInlineSnapshot(` - [ - [ - ".children:cap", - "push", - { - "row": { - "group": "g1", - "id": "x1", - "text": "x1", - }, - "type": "remove", - }, - ], - [ - ".children:cap", - "fetch", - { - "constraint": { - "group": "g1", - }, - }, - ], - [ - ".children:cap", - "fetch", - { - "constraint": { - "group": "g1", - }, - }, - ], - [ - ".children:cap", - "push", - { - "row": { - "group": "g1", - "id": "x4", - "text": "x4", - }, - "type": "add", - }, - ], - [ - ".children:cap", - "fetch", - { - "constraint": { - "group": "g1", - }, - }, - ], - [ - ".children:cap", - "fetch", - { - "constraint": { - "group": "g1", - }, - }, - ], - ] - `); + expect(actualStorage['.children:cap']).toMatchInlineSnapshot(`undefined`); + expect(log.filter(msg => msg[0] === '.children:cap')).toMatchInlineSnapshot( + `[]`, + ); expect(pushes).toMatchInlineSnapshot(` [ { From 444dd53735cac672bb594e1419ca059c060169f4 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 28 Mar 2026 11:29:49 -0700 Subject: [PATCH 192/495] chore(zero-cache): improve handling of missed lag reports (#5712) --- .../change-source/pg/change-source.pg.test.ts | 66 ++++++------------ .../change-source/pg/change-source.ts | 67 +++++++++++++------ 2 files changed, 65 insertions(+), 68 deletions(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index a70af958f0..bae6f037e1 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -873,7 +873,10 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { }, ); - test('replication lag reports', async () => { + test.each([ + ['received', false], + ['resumed if skipped', true], + ])('replication lag reports: %s', async (_name, startStreamAfterReport) => { await startReplication(10); const initialSend = await source.startLagReporter(); @@ -881,7 +884,21 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { nextSendTimeMs: expect.any(Number), }); - const {changes} = await startStream('00'); + let watermark = '00'; + if (startStreamAfterReport) { + // Get the current lsn (which is at or after the lag report) and + // start a subscription _after_ it to skip the lag report. + const [{lsn}] = await upstream< + {lsn: string}[] + > /*sql*/ `SELECT pg_current_wal_lsn() as lsn`; + + watermark = toStateVersionString(lsn); + lc.debug?.( + `starting subscription from ${watermark} (${fromStateVersionString(watermark)})`, + ); + } + + const {changes} = await startStream(watermark); try { const downstream = drainToQueue(changes); @@ -934,51 +951,6 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { } }); - test('replication lag report re-initiated if skipped', async () => { - await startReplication(10); - - // Initiates a lag report. - await source.startLagReporter(); - - // Get the current lsn (which is at or after the lag report) and - // start a subscription _after_ it to skip the lag report. - const [{lsn}] = await upstream< - {lsn: string}[] - > /*sql*/ `SELECT pg_current_wal_lsn() as lsn`; - - const watermark = toStateVersionString(lsn); - lc.debug?.( - `starting subscription from ${watermark} (${fromStateVersionString(watermark)})`, - ); - - const {changes} = await startStream(watermark); - try { - const downstream = drainToQueue(changes); - - const EXPECTED_LAG_REPORT = [ - 'status', - { - ack: false, - lagReport: { - lastTimings: { - sendTimeMs: expect.any(Number), - commitTimeMs: expect.any(Number), - receiveTimeMs: expect.any(Number), - }, - nextSendTimeMs: expect.any(Number), - }, - }, - { - watermark: WATERMARK_REGEX, - }, - ]; - - expect(await downstream.dequeue()).toMatchObject(EXPECTED_LAG_REPORT); - } finally { - changes.cancel(); - } - }); - test('missing replication slot', async () => { await startReplication(); // Purposely drop the replication slot to test the error case. diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index c966ec2845..5c266fb00f 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -381,12 +381,15 @@ class PostgresChangeSource implements ChangeSource { msg.tag === 'message' && msg.prefix === this.#lagReporter?.messagePrefix ) { - changes.pushStatus(this.#lagReporter.processLagReport(msg)); + changes.pushStatus(this.#lagReporter.processLagReportMessage(msg)); return false; } // Checks if we are passed the LSN of the expected lag report, in which // case a new one is initiated. - this.#lagReporter?.checkCurrentLSN(lsn); + const status = this.#lagReporter?.checkCurrentLSN(lsn); + if (status) { + changes.pushStatus(status); + } if (msg.tag === 'keepalive') { changes.pushStatus([ @@ -679,10 +682,7 @@ const lagReportSchema = v.object({ export type LagReport = v.Infer; -type InitiatedLagReport = { - id: string; - lsn: bigint; -}; +type InitiatedLagReport = LagReport & {lsn: bigint}; class LagReporter { static readonly MESSAGE_SUFFIX = '/lag-report/v1'; @@ -730,22 +730,26 @@ class LagReporter { const now = Date.now(); const id = nanoid(); - const lagReport = {id, lsn: 0n}; // lsn is filled in after the db call. + // lsn is filled in after the db call. + const lagReport = {id, sendTimeMs: now, commitTimeMs: now, lsn: 0n}; this.#expectingLagReport = lagReport; + let commitTimeMs: number; let lsn: string; + if (pgVersion >= PG_17) { - [{lsn}] = await this.#db<{lsn: string}[]> /*sql*/ ` - SELECT pg_logical_emit_message( + [{commitTimeMs, lsn}] = await this.#db /*sql*/ ` + WITH CTE AS (SELECT extract(epoch from now()) * 1000 AS "commitTimeMs") + SELECT "commitTimeMs", pg_logical_emit_message( false, ${this.messagePrefix}, json_build_object( 'id', ${id}::text, 'sendTimeMs', ${now}::int8, - 'commitTimeMs', extract(epoch from now()) * 1000 + 'commitTimeMs', "commitTimeMs" )::text, true - ) as lsn; + ) as lsn FROM CTE; `; } else { // Versions before PG 17 do not support the final `flush` option of @@ -753,16 +757,17 @@ class LagReporter { // for replication reports when the db is idle, which is still // acceptable for the purpose for alerting on pathological lag, for // which the threshold is much higher (e.g. many seconds). - [{lsn}] = await this.#db<{lsn: string}[]> /*sql*/ ` - SELECT pg_logical_emit_message( + [{commitTimeMs, lsn}] = await this.#db /*sql*/ ` + WITH CTE AS (SELECT extract(epoch from now()) * 1000 as "commitTimeMs") + SELECT "commitTimeMs", pg_logical_emit_message( false, ${this.messagePrefix}, json_build_object( 'id', ${id}::text, 'sendTimeMs', ${now}::int8, - 'commitTimeMs', extract(epoch from now()) * 1000 + 'commitTimeMs', "commitTimeMs" )::text - ) as lsn; + ) as lsn FROM CTE; `; } @@ -771,21 +776,31 @@ class LagReporter { // already been sent through the replication stream, but this // is okay since this.#expectingLagReport will have be updated. lagReport.lsn = toBigInt(lsn); + lagReport.commitTimeMs = commitTimeMs; if (log) { - this.#lc.info?.(`initiated lag report at lsn ${lsn}`, {id, lsn}); + this.#lc.info?.(`initiated lag report at lsn ${lsn}`, { + id, + lsn, + sendTimeMs: now, + commitTimeMs, + }); } return {nextSendTimeMs: now}; } - checkCurrentLSN(lsn: bigint) { + checkCurrentLSN(lsn: bigint): DownstreamStatusMessage | undefined { if (this.#expectingLagReport?.lsn && lsn > this.#expectingLagReport.lsn) { this.#lc.warn?.( `LSN ${fromBigInt(lsn)} is passed expected lag report ` + - `${fromBigInt(this.#expectingLagReport.lsn)}. Initiating new report.`, + `${fromBigInt(this.#expectingLagReport.lsn)}. Processing it as received.`, + ); + return this.#processLagReport( + this.#expectingLagReport, + majorVersionToString(lsn), ); - this.#scheduleNextReport(0); } + return undefined; } #scheduleNextReport(delayMs: number) { @@ -801,12 +816,22 @@ class LagReporter { }, delayMs); } - processLagReport(msg: MessageMessage): DownstreamStatusMessage { + processLagReportMessage(msg: MessageMessage): DownstreamStatusMessage { assert( msg.prefix === this.messagePrefix, `unexpected message prefix: ${msg.prefix}`, ); const report = parseLogicalMessageContent(msg, lagReportSchema); + return this.#processLagReport( + report, + toStateVersionString(msg.messageLsn ?? '0/0'), + ); + } + + #processLagReport( + report: LagReport, + watermark: string, + ): DownstreamStatusMessage { const now = Date.now(); const nextSendTimeMs = Math.max( now, @@ -835,7 +860,7 @@ class LagReporter { nextSendTimeMs, }, }, - {watermark: toStateVersionString(msg.messageLsn ?? '0/0')}, + {watermark}, ]; } } From 4948a437c9097d6c123d4916e708dbf9aa3bdb04 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Sat, 28 Mar 2026 11:54:34 -0700 Subject: [PATCH 193/495] chore(zero-cache): log at info instead of warn (#5713) The missed lag report scenario is now well understood and expected for PG < 17. Demote the logged message from warn to info. Add documentation. --- .../change-source/pg/change-source.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 5c266fb00f..008715dbaf 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -789,9 +789,28 @@ class LagReporter { return {nextSendTimeMs: now}; } + /** + * In Postgres < 17, the pg_logical_emit_message lacks an immediate "flush" + * option, which can cause messages to be missed when the replication stream + * starts up: + * + * ``` + * * emit message → WAL write (buffered, not flushed) + * * walsender reads up to current flush LSN + * * emitted message's LSN is beyond flush LSN → not yet visible + * * stream feedback/acknowledgment advances slot + * * WAL eventually flushes → but slot has already moved past it + * ``` + * + * This has been seen to happen for the initial `wal_writer_delay` interval + * of a replication session. + * + * To account for this, the last emitted lag report is considered "received" + * if the stream has advanced beyond the LSN of the report. + */ checkCurrentLSN(lsn: bigint): DownstreamStatusMessage | undefined { if (this.#expectingLagReport?.lsn && lsn > this.#expectingLagReport.lsn) { - this.#lc.warn?.( + this.#lc.info?.( `LSN ${fromBigInt(lsn)} is passed expected lag report ` + `${fromBigInt(this.#expectingLagReport.lsn)}. Processing it as received.`, ); From ba6e83e31ccd35299e2e2161cff47a47461afb91 Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Sun, 29 Mar 2026 13:16:51 -0700 Subject: [PATCH 194/495] chore(zero-cache): add some logging to debug assertNewVersion failure (#5710) Context: https://rocicorp.slack.com/archives/C0ABMK92H47/p1774584500920139 --- .../src/services/view-syncer/cvr.ts | 38 +++++++++++++++++-- .../src/services/view-syncer/view-syncer.ts | 33 ++++++++++++++-- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/cvr.ts b/packages/zero-cache/src/services/view-syncer/cvr.ts index 7b04962a0c..570c9803b3 100644 --- a/packages/zero-cache/src/services/view-syncer/cvr.ts +++ b/packages/zero-cache/src/services/view-syncer/cvr.ts @@ -41,6 +41,7 @@ import { type QueryRecord, type RowID, type RowRecord, + versionString, } from './schema/types.ts'; import {tracer} from './tracer.ts'; import {ttlClockAsNumber, type TTLClock} from './ttl-clock.ts'; @@ -613,6 +614,13 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { // The error will surface when this.#existingRows is awaited. void this.#existingRows.then(() => {}); + const versionBumped = + cmpVersions(this._orig.version, this._cvr.version) < 0; + lc.info?.( + `trackQueries: ${executed.length} executed, ${removed.length} removed, ` + + `version ${versionBumped ? 'bumped' : 'unchanged'}`, + ); + return { newVersion: this._cvr.version, queryPatches: queryPatches.map(patch => ({ @@ -740,10 +748,22 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { * final cookie (i.e. version), and that must be sent before any poke parts * generated from {@link received} are sent. */ - #assertNewVersion(): CVRVersion { + #assertNewVersion( + rowID: RowID, + existingVersion: string | undefined, + newVersion: string | undefined, + refCounts: RefCounts, + ): CVRVersion { assert( cmpVersions(this._orig.version, this._cvr.version) < 0, - 'Expected CVR version to have been bumped above original', + () => + `Expected CVR version to have been bumped above original` + + ` (orig=${versionString(this._orig.version)},` + + ` curr=${versionString(this._cvr.version)}).` + + ` Row ${JSON.stringify(rowID)}:` + + ` existing=${existingVersion},` + + ` new=${newVersion},` + + ` queries=[${Object.keys(refCounts).join(',')}]`, ); return this._cvr.version; } @@ -791,7 +811,12 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { const patchVersion = existing && existing.rowVersion === newRowVersion ? existing.patchVersion // existing row is unchanged - : this.#assertNewVersion(); + : this.#assertNewVersion( + id, + existing?.rowVersion, + newRowVersion, + refCounts, + ); // Note: for determining what to commit to the CVR store, use the // `version` of the update even if `merged` is null (i.e. don't @@ -935,7 +960,12 @@ export class CVRQueryDrivenUpdater extends CVRUpdater { // gets a new patchVersion (and corresponding poke). const patchVersion = newRefCounts ? existing.patchVersion - : this.#assertNewVersion(); + : this.#assertNewVersion( + existing.id, + existing.rowVersion, + undefined, + existing.refCounts ?? {}, + ); const rowRecord: RowRecord = { ...existing, patchVersion, diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.ts index fe0e888925..ae1d2a6e72 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.ts @@ -1251,6 +1251,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { const customQueries: Map = new Map(); const otherQueries: (ClientQueryRecord | InternalQueryRecord)[] = []; + let inactivatedCount = 0; for (const [, query] of gotQueries) { if ( @@ -1259,6 +1260,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { ({inactivatedAt}) => inactivatedAt !== undefined, ) ) { + inactivatedCount++; continue; // No longer desired. } @@ -1270,6 +1272,9 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { } const transformedQueries: TransformedAndHashed[] = []; + let customErrorCount = 0; + let customHashMismatchCount = 0; + let otherHashMismatchCount = 0; if (customQueries.size > 0 && !this.#customQueryTransformer) { lc.warn?.( 'Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.', @@ -1297,10 +1302,13 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { // the client. if (Array.isArray(transformedCustomQueries)) { for (const q of transformedCustomQueries) { - if ( - !('error' in q) && - q.transformationHash === customQueries.get(q.id)?.transformationHash + if ('error' in q) { + customErrorCount++; + } else if ( + q.transformationHash !== customQueries.get(q.id)?.transformationHash ) { + customHashMismatchCount++; + } else { transformedQueries.push(q); } } @@ -1323,9 +1331,20 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { // only process queries that transformed to the same // transformationHash as in the CVR here transformedQueries.push(transformed); + } else { + otherHashMismatchCount++; } } + lc.info?.( + `hydrateUnchangedQueries: ${gotQueries.length} got queries, ` + + `${inactivatedCount} inactivated, ` + + `${customErrorCount} custom transform errors, ` + + `${customHashMismatchCount} custom hash mismatches, ` + + `${otherHashMismatchCount} other hash mismatches, ` + + `${transformedQueries.length} hydrated`, + ); + for (const { id: queryID, transformationHash, @@ -1647,6 +1666,14 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { q.transformationHash, ); + lc.info?.( + `syncQueryPipelineSet: ${cvrQueryEntires.length} CVR queries, ` + + `${customQueriesToTransform.length} custom re-transformed, ` + + `${erroredQueryIDs?.length ?? 0} errored, ` + + `${removeQueriesQueryIds.size} to remove, ` + + `${addQueries.length} to add`, + ); + for (const q of addQueries) { const orig = cvr.queries[q.id]; lc.debug?.( From c142c88e1fb463c8ddfef9fe4af3604738d8d61c Mon Sep 17 00:00:00 2001 From: Greg Baker Date: Sun, 29 Mar 2026 14:34:18 -0700 Subject: [PATCH 195/495] fix(zero-client): ignore rows from unknown tables (#5714) Fixes https://bugs.rocicorp.dev/p/zero/issue/246645 Reproduced locally in zbugs, verified fix manually. The api server can now query tables unknown by the zero client's schema, without causing errors on the zero client. The client simply discards patch operations for tables that are not in its schema. --- .../src/client/zero-poke-handler.test.ts | 121 ++++++++++++++++++ .../src/client/zero-poke-handler.ts | 20 ++- packages/zero-schema/src/name-mapper.test.ts | 22 ++++ packages/zero-types/src/name-mapper.ts | 4 + 4 files changed, 162 insertions(+), 5 deletions(-) diff --git a/packages/zero-client/src/client/zero-poke-handler.test.ts b/packages/zero-client/src/client/zero-poke-handler.test.ts index d99922cf40..1cc9a4f11a 100644 --- a/packages/zero-client/src/client/zero-poke-handler.test.ts +++ b/packages/zero-client/src/client/zero-poke-handler.test.ts @@ -1599,6 +1599,127 @@ describe('poke handler', () => { }); }); + test('mergePokes skips rows for tables not in client schema', () => { + const result = mergePokes( + [ + { + pokeStart: { + pokeID: 'poke1', + baseCookie: '1', + }, + parts: [ + { + pokeID: 'poke1', + lastMutationIDChanges: {c1: 1}, + rowsPatch: [ + { + op: 'put', + tableName: 'issues', + value: {['issue_id']: 'issue1', title: 'foo1'}, + }, + { + op: 'put', + tableName: 'unknownTable', + value: {id: 'u1', data: 'should be skipped'}, + }, + { + op: 'put', + tableName: 'issues', + value: {['issue_id']: 'issue2', title: 'bar1'}, + }, + ], + }, + ], + pokeEnd: { + pokeID: 'poke1', + cookie: '2', + }, + }, + ], + schema, + serverToClient(schema.tables), + ); + + expect(result).toEqual({ + baseCookie: '1', + pullResponse: { + cookie: '2', + lastMutationIDChanges: {c1: 1}, + patch: [ + { + op: 'put', + key: 'e/issue/issue1', + value: {id: 'issue1', title: 'foo1'}, + }, + { + op: 'put', + key: 'e/issue/issue2', + value: {id: 'issue2', title: 'bar1'}, + }, + ], + }, + }); + }); + + test('mergePokes skips del and update ops for tables not in client schema', () => { + const result = mergePokes( + [ + { + pokeStart: { + pokeID: 'poke1', + baseCookie: '1', + }, + parts: [ + { + pokeID: 'poke1', + lastMutationIDChanges: {c1: 1}, + rowsPatch: [ + { + op: 'put', + tableName: 'issues', + value: {['issue_id']: 'issue1', title: 'foo1'}, + }, + { + op: 'del', + tableName: 'unknownTable', + id: {id: 'u1'}, + }, + { + op: 'update', + tableName: 'unknownTable', + id: {id: 'u2'}, + merge: {id: 'u2', data: 'updated'}, + constrain: ['id'], + }, + ], + }, + ], + pokeEnd: { + pokeID: 'poke1', + cookie: '2', + }, + }, + ], + schema, + serverToClient(schema.tables), + ); + + expect(result).toEqual({ + baseCookie: '1', + pullResponse: { + cookie: '2', + lastMutationIDChanges: {c1: 1}, + patch: [ + { + op: 'put', + key: 'e/issue/issue1', + value: {id: 'issue1', title: 'foo1'}, + }, + ], + }, + }); + }); + test('mergePokes throws error on cookie gaps', () => { expect(() => { mergePokes( diff --git a/packages/zero-client/src/client/zero-poke-handler.ts b/packages/zero-client/src/client/zero-poke-handler.ts index b41c2e37cd..a136e2d17c 100644 --- a/packages/zero-client/src/client/zero-poke-handler.ts +++ b/packages/zero-client/src/client/zero-poke-handler.ts @@ -7,7 +7,6 @@ import type { import type {PatchOperation} from '../../../replicache/src/patch-operation.ts'; import type {ClientID} from '../../../replicache/src/sync/ids.ts'; import {unreachable} from '../../../shared/src/asserts.ts'; -import type {JSONValue} from '../../../shared/src/json.ts'; import type {MutationPatch} from '../../../zero-protocol/src/mutations-patch.ts'; import type { PokeEndBody, @@ -273,9 +272,14 @@ export function mergePokes( } if (pokePart.rowsPatch) { for (const p of pokePart.rowsPatch) { - mergedPatch.push( - rowsPatchOpToReplicachePatchOp(p, schema, serverToClient), + const patchOp = rowsPatchOpToReplicachePatchOp( + p, + schema, + serverToClient, ); + if (patchOp) { + mergedPatch.push(patchOp); + } } } if (pokePart.mutationsPatch) { @@ -348,11 +352,17 @@ function rowsPatchOpToReplicachePatchOp( op: RowPatchOp, schema: Schema, serverToClient: NameMapper, -): PatchOperationInternal { +): PatchOperationInternal | undefined { if (op.op === 'clear') { return op; } - const tableName = serverToClient.tableName(op.tableName, op as JSONValue); + // Skip rows for tables not in the client schema. This can happen when + // the server-side query AST references tables (e.g. issueNotifications) + // that are not yet part of the client schema definition. + const tableName = serverToClient.tableNameIfKnown(op.tableName); + if (!tableName) { + return undefined; + } switch (op.op) { case 'del': return { diff --git a/packages/zero-schema/src/name-mapper.test.ts b/packages/zero-schema/src/name-mapper.test.ts index 96637192e8..50f421e5ca 100644 --- a/packages/zero-schema/src/name-mapper.test.ts +++ b/packages/zero-schema/src/name-mapper.test.ts @@ -125,3 +125,25 @@ test('name mapping to client', () => { const uncopiedColumns = ['id', 'description']; expect(map.columns('noMappings', uncopiedColumns)).toBe(uncopiedColumns); }); + +test('tableNameIfKnown returns mapped name for known tables', () => { + const stcMap = serverToClient(schema.tables); + expect(stcMap.tableNameIfKnown('issues')).toBe('issue'); + expect(stcMap.tableNameIfKnown('comments')).toBe('comment'); + expect(stcMap.tableNameIfKnown('noMappings')).toBe('noMappings'); + + const ctsMap = clientToServer(schema.tables); + expect(ctsMap.tableNameIfKnown('issue')).toBe('issues'); + expect(ctsMap.tableNameIfKnown('comment')).toBe('comments'); + expect(ctsMap.tableNameIfKnown('noMappings')).toBe('noMappings'); +}); + +test('tableNameIfKnown returns undefined for unknown tables', () => { + const stcMap = serverToClient(schema.tables); + expect(stcMap.tableNameIfKnown('unknown')).toBeUndefined(); + expect(stcMap.tableNameIfKnown('issueNotifications')).toBeUndefined(); + + const ctsMap = clientToServer(schema.tables); + expect(ctsMap.tableNameIfKnown('unknown')).toBeUndefined(); + expect(ctsMap.tableNameIfKnown('issueNotifications')).toBeUndefined(); +}); diff --git a/packages/zero-types/src/name-mapper.ts b/packages/zero-types/src/name-mapper.ts index 8457c35e4d..c93ca4a204 100644 --- a/packages/zero-types/src/name-mapper.ts +++ b/packages/zero-types/src/name-mapper.ts @@ -33,6 +33,10 @@ export class NameMapper { return this.#getTable(src, context).tableName; } + tableNameIfKnown(src: string): string | undefined { + return this.#tables.get(src)?.tableName; + } + columnName(table: string, src: string, ctx?: JSONValue): string { const dst = this.#getTable(table, ctx).columns[src]; if (!dst) { From 27014b49702df1f3f432da1130fd2ed48bc6daf5 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Mon, 30 Mar 2026 02:39:47 -1000 Subject: [PATCH 196/495] fix(zero-cache): Custom push URL not used for cleanup messages. (#5716) This would have been silently failing and accumulating garbage in most implementations. This was introduced in https://github.com/rocicorp/mono/pull/5382 Customer report: https://discord.com/channels/830183651022471199/1488141429971877949/1488150144204673195 --- .../src/services/mutagen/pusher.test.ts | 42 +++++++++++++++++++ .../zero-cache/src/services/mutagen/pusher.ts | 12 ++++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/packages/zero-cache/src/services/mutagen/pusher.test.ts b/packages/zero-cache/src/services/mutagen/pusher.test.ts index cf440db66b..4b21bb92ec 100644 --- a/packages/zero-cache/src/services/mutagen/pusher.test.ts +++ b/packages/zero-cache/src/services/mutagen/pusher.test.ts @@ -675,6 +675,48 @@ describe('pusher service', () => { // No fetch call should be made expect(fetch).not.toHaveBeenCalled(); }); + + test('ack mutation responses uses custom URL from initConnection', async () => { + const fetch = (global.fetch = vi.fn()); + fetch.mockResolvedValue({ + ok: true, + json: () => Promise.resolve({mutations: []}), + }); + + const pusher = new PusherService( + config, + { + url: ['http://default.com', 'http://custom.com/push'], + apiKey: 'api-key', + forwardCookies: false, + }, + lc, + 'cgid', + ); + void pusher.run(); + + // Initialize connection with custom URL + pusher.initConnection( + clientID, + wsID, + 'http://custom.com/push?tenant=foo', + undefined, + ); + + await pusher.ackMutationResponses({ + clientID: 'test-client', + id: 42, + }); + + await pusher.stop(); + + expect(fetch).toHaveBeenCalledTimes(1); + const [url] = fetch.mock.calls[0]; + // Should use the custom URL with query params, not the default URL + expect(url).toBe( + 'http://custom.com/push?tenant=foo&schema=zero_0&appID=zero', + ); + }); }); describe('initConnection', () => { diff --git a/packages/zero-cache/src/services/mutagen/pusher.ts b/packages/zero-cache/src/services/mutagen/pusher.ts index 2f4f1d70bb..2edfec4520 100644 --- a/packages/zero-cache/src/services/mutagen/pusher.ts +++ b/packages/zero-cache/src/services/mutagen/pusher.ts @@ -101,7 +101,7 @@ export class PusherService implements Service, Pusher { } get pushURL(): string | undefined { - return this.#pusher.pushURL[0]; + return this.#pusher.pushURLs[0]; } initConnection( @@ -138,7 +138,7 @@ export class PusherService implements Service, Pusher { } async ackMutationResponses(upToID: MutationID) { - const url = this.#pushConfig.url[0]; + const url = this.#pusher.effectivePushURL; if (!url) { // No push URL configured, skip cleanup return; @@ -190,7 +190,7 @@ export class PusherService implements Service, Pusher { if (clientIDs.length === 0) { return; } - const url = this.#pushConfig.url[0]; + const url = this.#pusher.effectivePushURL; if (!url) { // No push URL configured, skip cleanup return; @@ -330,10 +330,14 @@ class PushWorker { this.#clients = new Map(); } - get pushURL() { + get pushURLs() { return this.#pushURLs; } + get effectivePushURL(): string | undefined { + return this.#userPushURL ?? this.#pushURLs[0]; + } + /** * Returns a new downstream stream if the clientID,wsID pair has not been seen before. * If a clientID already exists with a different wsID, that client's downstream is cancelled. From 1c74faaae7fee6afc2fdc9c67a0bd7f090243619 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Mon, 30 Mar 2026 22:16:49 +0200 Subject: [PATCH 197/495] fix(zql): Check limit before asserting partition key (#5715) `#initialFetch` in both Take and Cap asserted `constraintMatchesPartitionKey` before checking `limit === 0`. When a query like `.limit(0).related('child')` was used, pushing data for the related source triggered a fetch through Join with a join-correlation constraint that didn't match the partition key, hitting the assertion before the early return. Move the `limit === 0` check before the assertion in both operators. Fixes https://bugs.rocicorp.dev/p/zero/issue/246643 --- packages/zql/src/ivm/cap.push.test.ts | 52 ++++++++++++-- packages/zql/src/ivm/cap.ts | 8 +-- packages/zql/src/ivm/take.push.test.ts | 98 +++++++++++++++++++++++--- packages/zql/src/ivm/take.ts | 9 +-- 4 files changed, 146 insertions(+), 21 deletions(-) diff --git a/packages/zql/src/ivm/cap.push.test.ts b/packages/zql/src/ivm/cap.push.test.ts index aebb6ac92c..2360732c95 100644 --- a/packages/zql/src/ivm/cap.push.test.ts +++ b/packages/zql/src/ivm/cap.push.test.ts @@ -1,13 +1,20 @@ -import {expect, suite, test} from 'vitest'; +import {describe, expect, test} from 'vitest'; +import {testLogConfig} from '../../../otel/src/test-log-config.ts'; +import {createSilentLogContext} from '../../../shared/src/logging-test-utils.ts'; +import type {AST} from '../../../zero-protocol/src/ast.ts'; +import {Cap} from './cap.ts'; +import {Catch} from './catch.ts'; +import {MemoryStorage} from './memory-storage.ts'; +import {consume} from './stream.ts'; import { runPushTest, type SourceContents, type Sources, } from './test/fetch-and-push-tests.ts'; +import {createSource} from './test/source-factory.ts'; import type {Format} from './view.ts'; -import type {AST} from '../../../zero-protocol/src/ast.ts'; -suite('Cap push - basic behavior', () => { +describe('Cap push - basic behavior', () => { const sources: Sources = { issue: { columns: { @@ -566,7 +573,7 @@ suite('Cap push - basic behavior', () => { }); }); -suite('Cap push - unordered overlay in join', () => { +describe('Cap push - unordered overlay in join', () => { const sources: Sources = { parent: { columns: { @@ -790,3 +797,40 @@ suite('Cap push - unordered overlay in join', () => { `); }); }); + +describe('Cap limit 0', () => { + // Reproduces the bug where Cap#initialFetch asserted + // "Constraint should match partition key" before checking limit === 0. + // When Cap has limit=0 and receives a fetch with a constraint that + // doesn't match the (undefined) partition key, the assertion should + // not fire — the limit=0 check should return early first. + const lc = createSilentLogContext(); + + test.for([ + {name: 'no partition key', partitionKey: undefined}, + {name: 'with partition key', partitionKey: ['group'] as const}, + ])( + 'fetch with constraint and $name does not trigger assert', + ({partitionKey}) => { + const source = createSource( + lc, + testLogConfig, + 'table', + {id: {type: 'string'}, group: {type: 'string'}}, + ['id'], + ); + consume(source.push({type: 'add', row: {id: '1', group: 'g1'}})); + + const storage = new MemoryStorage(); + const cap = new Cap( + source.connect([['id', 'asc']]), + storage, + 0, + partitionKey, + ); + const c = new Catch(cap); + const result = c.fetch({constraint: {group: 'g1'}}); + expect(result).toEqual([]); + }, + ); +}); diff --git a/packages/zql/src/ivm/cap.ts b/packages/zql/src/ivm/cap.ts index 84ccfb325e..8a11e7c71c 100644 --- a/packages/zql/src/ivm/cap.ts +++ b/packages/zql/src/ivm/cap.ts @@ -141,15 +141,15 @@ export class Cap implements Operator { } *#initialFetch(req: FetchRequest): Stream { + if (this.#limit === 0) { + return; + } + assert( constraintMatchesPartitionKey(req.constraint, this.#partitionKey), 'Constraint should match partition key', ); - if (this.#limit === 0) { - return; - } - const capStateKey = getCapStateKey(this.#partitionKey, req.constraint); assert( this.#storage.get(capStateKey) === undefined, diff --git a/packages/zql/src/ivm/take.push.test.ts b/packages/zql/src/ivm/take.push.test.ts index ee2393c581..0208c1b706 100644 --- a/packages/zql/src/ivm/take.push.test.ts +++ b/packages/zql/src/ivm/take.push.test.ts @@ -1,11 +1,11 @@ -import {describe, expect, suite, test} from 'vitest'; +import {describe, expect, test} from 'vitest'; import type {AST} from '../../../zero-protocol/src/ast.ts'; import type {Row} from '../../../zero-protocol/src/data.ts'; import type {SourceChange} from './source.ts'; import {runPushTest, type Sources} from './test/fetch-and-push-tests.ts'; -suite('take with no partition', () => { - suite('add', () => { +describe('take with no partition', () => { + describe('add', () => { test('limit 0', () => { const {data, messages, storage, pushes} = takeNoPartitionTest({ sourceRows: [ @@ -779,7 +779,7 @@ suite('take with no partition', () => { }); }); - suite('remove', () => { + describe('remove', () => { test('limit 0', () => { const {data, messages, storage, pushes} = takeNoPartitionTest({ sourceRows: [ @@ -2054,7 +2054,7 @@ suite('take with no partition', () => { }); }); - suite('edit', () => { + describe('edit', () => { const base = { sourceRows: [ {id: 'i1', created: 100, text: 'a'}, @@ -3517,8 +3517,8 @@ suite('take with no partition', () => { }); }); -suite('take with partition', () => { - suite('add', () => { +describe('take with partition', () => { + describe('add', () => { test('limit 0', () => { const {data, messages, storage, pushes} = takeTestWithPartition({ sourceRows: [ @@ -4257,7 +4257,7 @@ suite('take with partition', () => { }); }); - suite('remove', () => { + describe('remove', () => { test('limit 0', () => { const {data, messages, storage, pushes} = takeTestWithPartition({ sourceRows: [ @@ -4622,7 +4622,7 @@ suite('take with partition', () => { }); }); - suite('edit', () => { + describe('edit', () => { const base = { sourceRows: [ {id: 'c1', issueID: 'i1', created: 100, text: 'a'}, @@ -7946,6 +7946,86 @@ suite('take with partition', () => { }); }); +describe('take limit 0 with related query', () => { + // Reproduces the bug where Take#initialFetch asserted + // "Constraint should match partition key" before checking limit === 0. + // When a query has limit(0).related('child'), pushing data for the + // child source triggers Join#pushChildChange which fetches from + // Take(limit=0) with a join-correlation constraint. Before the fix, + // the assertion fired before the limit check. + const sources: Sources = { + issue: { + columns: { + id: {type: 'string'}, + ownerId: {type: 'string'}, + }, + primaryKeys: ['id'], + }, + owner: { + columns: { + id: {type: 'string'}, + name: {type: 'string'}, + }, + primaryKeys: ['id'], + }, + }; + + const ast: AST = { + table: 'issue', + orderBy: [['id', 'asc']], + limit: 0, + related: [ + { + system: 'client', + correlation: {parentField: ['ownerId'], childField: ['id']}, + subquery: { + table: 'owner', + alias: 'owner', + orderBy: [['id', 'asc']], + }, + }, + ], + }; + + const format = { + singular: false, + relationships: { + owner: {singular: true, relationships: {}}, + }, + }; + + test.for([ + { + name: 'single issue', + issues: [{id: 'i1', ownerId: 'o1'}], + }, + { + name: 'multiple issues', + issues: [ + {id: 'i1', ownerId: 'o1'}, + {id: 'i2', ownerId: 'o1'}, + ], + }, + ])( + 'push to related source with $name does not trigger assert', + ({issues}) => { + const {data, pushes} = runPushTest({ + sources, + sourceContents: { + issue: issues, + owner: [], + }, + ast, + format, + pushes: [['owner', {type: 'add', row: {id: 'o1', name: 'Alice'}}]], + }); + + expect(data).toEqual([]); + expect(pushes).toEqual([]); + }, + ); +}); + type TakeTest = { sourceRows: readonly Row[]; limit: number; diff --git a/packages/zql/src/ivm/take.ts b/packages/zql/src/ivm/take.ts index 7531c4bff2..d104ca967d 100644 --- a/packages/zql/src/ivm/take.ts +++ b/packages/zql/src/ivm/take.ts @@ -151,15 +151,16 @@ export class Take implements Operator { *#initialFetch(req: FetchRequest): Stream { assert(req.start === undefined, 'Start should be undefined'); assert(!req.reverse, 'Reverse should be false'); - assert( - constraintMatchesPartitionKey(req.constraint, this.#partitionKey), - 'Constraint should match partition key', - ); if (this.#limit === 0) { return; } + assert( + constraintMatchesPartitionKey(req.constraint, this.#partitionKey), + 'Constraint should match partition key', + ); + const takeStateKey = getTakeStateKey(this.#partitionKey, req.constraint); assert( this.#storage.get(takeStateKey) === undefined, From 4bba06ef8a8d419dfe41e4a8def93a8490482123 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 30 Mar 2026 14:28:26 -0700 Subject: [PATCH 198/495] chore(zero-cache): fix message and log-level for intentional shutdowns (#5718) --- .../change-streamer/change-streamer.ts | 17 +++++++++++++++ .../replicator/incremental-sync.test.ts | 18 ++++++++++++++++ .../services/replicator/incremental-sync.ts | 21 ++++++++++++++++--- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer.ts b/packages/zero-cache/src/services/change-streamer/change-streamer.ts index 02e662f1f0..9e79cda9a6 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer.ts @@ -1,3 +1,4 @@ +import type {Enum} from '../../../../shared/src/enum.ts'; import * as v from '../../../../shared/src/valita.ts'; import type {Source} from '../../types/streams.ts'; import {type Change} from '../change-source/protocol/current/data.ts'; @@ -5,6 +6,9 @@ import {changeStreamDataSchema} from '../change-source/protocol/current/downstre import type {ReplicatorMode} from '../replicator/replicator.ts'; import {changeSourceTimingsSchema} from '../replicator/reporter/report-schema.ts'; import type {Service} from '../service.ts'; +import * as ErrorType from './error-type-enum.ts'; + +type ErrorType = Enum; /** * The ChangeStreamer is the component between replicators ("subscribers") @@ -176,6 +180,19 @@ export const downstreamSchema = v.union( export type Error = v.Infer; +export function errorTypeToReadableName(val: ErrorType) { + switch (val) { + case ErrorType.WrongReplicaVersion: + return 'WrongReplicaVersion'; + case ErrorType.WatermarkTooOld: + return 'WatermarkTooOld'; + case ErrorType.Unknown: + return 'Unknown'; + default: + return 'Unknown'; + } +} + /** * A stream of transactions, each starting with a {@link Begin} message, * containing one or more {@link Data} messages, and ending with a diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index 0b48d33fed..35f130a1d5 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -10,6 +10,7 @@ import { type MockedFunction, } from 'vitest'; import type {JSONObject} from '../../../../shared/src/bigint-json.ts'; +import type {Enum} from '../../../../shared/src/enum.ts'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; import type {ZeroEvent} from '../../../../zero-events/src/index.ts'; import type {Database} from '../../../../zqlite/src/db.ts'; @@ -22,6 +23,7 @@ import { type Downstream, type SubscriberContext, } from '../change-streamer/change-streamer.ts'; +import * as ErrorType from '../change-streamer/error-type-enum.ts'; import {IncrementalSyncer} from './incremental-sync.ts'; import {ReplicationStatusPublisher} from './replication-status.ts'; import { @@ -31,6 +33,8 @@ import { import {ReplicationMessages} from './test-utils.ts'; import {ThreadWriteWorkerClient} from './write-worker-client.ts'; +type ErrorType = Enum; + const TASK_ID = 'task-id'; const REPLICA_ID = 'incremental_sync_test_id'; @@ -769,4 +773,18 @@ describe('replicator/incremental-sync', () => { syncer.stop(lc); void localSyncing.catch(() => {}); }); + + test('shut down on change-streamer error message', async () => { + initReplicationState(mainDb, ['zero_data'], '02', {}, false); + + const syncing = syncer.run(); + + downstream.push([ + 'error', + {type: ErrorType.WrongReplicaVersion, message: 'restart yo'}, + ]); + + // Should stop / resolve + await syncing; + }); }); diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.ts b/packages/zero-cache/src/services/replicator/incremental-sync.ts index 6b97915407..810b5c6396 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.ts @@ -1,13 +1,17 @@ import type {LogContext} from '@rocicorp/logger'; +import {AbortError} from '../../../../shared/src/abort-error.ts'; +import type {Enum} from '../../../../shared/src/enum.ts'; import {getOrCreateCounter} from '../../observability/metrics.ts'; import type {Source} from '../../types/streams.ts'; import type {DownloadStatus} from '../change-source/protocol/current.ts'; import type {ChangeStreamData} from '../change-source/protocol/current/downstream.ts'; import { + errorTypeToReadableName, PROTOCOL_VERSION, type ChangeStreamer, type Downstream, } from '../change-streamer/change-streamer.ts'; +import type * as ErrorType from '../change-streamer/error-type-enum.ts'; import {RunningState} from '../running-state.ts'; import type {CommitResult} from './change-processor.ts'; import {Notifier} from './notifier.ts'; @@ -17,6 +21,8 @@ import {ReplicationReportRecorder} from './reporter/recorder.ts'; import type {ReplicationReport} from './reporter/report-schema.ts'; import type {WriteWorkerClient} from './write-worker-client.ts'; +type ErrorType = Enum; + /** * The {@link IncrementalSyncer} manages a logical replication stream from upstream, * handling application lifecycle events (start, stop) and retrying the @@ -120,10 +126,19 @@ export class IncrementalSyncer { } break; } - case 'error': - // Unrecoverable error. Stop the service. - this.stop(lc, message[1]); + case 'error': { + // Signal from the replication-manager that the view-syncer must + // shut down and restore a new backup from litestream. + const {type, message: msg} = message[1]; + this.stop( + lc, + // Note: The AbortError indicates a clean / intentional shutdown. + new AbortError( + `${errorTypeToReadableName(type as ErrorType)}: ${msg}`, + ), + ); break; + } default: { const msg = message[1]; if (msg.tag === 'backfill' && msg.status) { From ddb3844dbba6f7b669bb01df0a925b8416e98d0d Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Tue, 31 Mar 2026 11:19:22 -0400 Subject: [PATCH 199/495] fix(z2s): fatal with fractional timestamps (#5703) If someone used a fractional value in a timestamp position, we would fatal in z2s. for timestamp without time zone columns, the output path sends full double precision values to clients. PostgreSQL's now() has microsecond precision, so a typical value would be something like 1712358878901.234. When the client sends that back in a WHERE clause, the old ::bigint cast would blow up. This was found by recent fuzzer additions. No user reports. --------- Co-authored-by: Erik Arvidsson --- packages/z2s/src/compiler.output.test.ts | 8 ++--- packages/z2s/src/sql.pg.test.ts | 43 ++++++++++++++++++++++++ packages/z2s/src/sql.test.ts | 40 +++++++++++----------- packages/z2s/src/sql.ts | 2 +- 4 files changed, 68 insertions(+), 25 deletions(-) diff --git a/packages/z2s/src/compiler.output.test.ts b/packages/z2s/src/compiler.output.test.ts index b91e7d045a..4f2f69d410 100644 --- a/packages/z2s/src/compiler.output.test.ts +++ b/packages/z2s/src/compiler.output.test.ts @@ -398,7 +398,7 @@ test('compile with timestamp (with timezone)', () => { COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" FROM (SELECT "timestampsTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000)::bigint + 86400000) % 86400000 as "timestampWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" FROM "timestampsTable" AS "timestampsTable_0" - WHERE "timestampsTable_0"."timestampWithTz" = to_timestamp($1::text::bigint / 1000.0) + WHERE "timestampsTable_0"."timestampWithTz" = to_timestamp($1::text::numeric / 1000.0) ORDER BY "timestampsTable_0"."id" ASC NULLS FIRST ) "zql_root"", @@ -430,7 +430,7 @@ test('compile with timestamp array (with timezone)', () => { FROM (SELECT "timestampsTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000)::bigint + 86400000) % 86400000 as "timestampWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" FROM "timestampsTable" AS "timestampsTable_0" WHERE "timestampsTable_0"."timestampWithTzArray" = ARRAY( - SELECT to_timestamp(value::text::bigint / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) + SELECT to_timestamp(value::text::numeric / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) ) ORDER BY "timestampsTable_0"."id" ASC NULLS FIRST @@ -462,7 +462,7 @@ test('compile with timestamp (without timezone)', () => { COALESCE(json_agg(row_to_json("zql_root")), '[]'::json)::text AS "zql_result" FROM (SELECT "timestampsTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000)::bigint + 86400000) % 86400000 as "timestampWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" FROM "timestampsTable" AS "timestampsTable_0" - WHERE "timestampsTable_0"."timestampWithoutTz" = to_timestamp($1::text::bigint / 1000.0) AT TIME ZONE 'UTC' + WHERE "timestampsTable_0"."timestampWithoutTz" = to_timestamp($1::text::numeric / 1000.0) AT TIME ZONE 'UTC' ORDER BY "timestampsTable_0"."id" ASC NULLS FIRST ) "zql_root"", @@ -494,7 +494,7 @@ test('compile with timestamp (without timezone) array', () => { FROM (SELECT "timestampsTable_0"."id" as "id",((EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithTz") * 1000)::bigint + 86400000) % 86400000 as "timestampWithTz",ARRAY(SELECT ((EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithTzArray")) * 1000)::bigint + 86400000) % 86400000) as "timestampWithTzArray",EXTRACT(EPOCH FROM "timestampsTable_0"."timestampWithoutTz") * 1000 as "timestampWithoutTz",ARRAY(SELECT EXTRACT(EPOCH FROM unnest("timestampsTable_0"."timestampWithoutTzArray")) * 1000) as "timestampWithoutTzArray" FROM "timestampsTable" AS "timestampsTable_0" WHERE "timestampsTable_0"."timestampWithoutTzArray" = ARRAY( - SELECT to_timestamp(value::text::bigint / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) + SELECT to_timestamp(value::text::numeric / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) ) ORDER BY "timestampsTable_0"."id" ASC NULLS FIRST diff --git a/packages/z2s/src/sql.pg.test.ts b/packages/z2s/src/sql.pg.test.ts index ed5139b4ef..f834208e36 100644 --- a/packages/z2s/src/sql.pg.test.ts +++ b/packages/z2s/src/sql.pg.test.ts @@ -161,6 +161,49 @@ describe('SQL builder with PostgreSQL', () => { }, ); + test.each([ + {type: 'timestamp', value: 1712345678901.5}, + {type: 'timestamptz', value: 1712345678901.5}, + ] as const)( + 'numeric $type with fractional milliseconds round-trips correctly', + async ({type, value}) => { + await using pg = await testDBs.create( + `${DB_NAME}_${type}_frac`, + undefined, + {}, + ); + + const table = `round_trip_${type}_frac`; + await pg.unsafe(` + SET TIME ZONE 'UTC'; + DROP TABLE IF EXISTS "${table}"; + CREATE TABLE "${table}" ( + value ${type.toUpperCase()} NOT NULL + ); + `); + + // Insert a fractional-millisecond timestamp. + // With the old ::bigint cast this would fail: + // "invalid input syntax for type bigint: 1712345678901.5" + const insertStmt = formatPgInternalConvert(sql` + INSERT INTO ${sql.ident(table)} (value) + VALUES (${sqlConvertArg(type, value)}) + `); + await pg.unsafe(insertStmt.text, insertStmt.values as JSONValue[]); + + // Query it back using the same fractional value as a filter. + const selectStmt = formatPgInternalConvert(sql` + SELECT value FROM ${sql.ident(table)} + WHERE value = ${sqlConvertArg(type, value, singularComparison)} + `); + const result = await pg.unsafe( + selectStmt.text, + selectStmt.values as JSONValue[], + ); + expect(result).toHaveLength(1); + }, + ); + test.each([ {type: 'time', value: 32887654}, {type: 'timetz', value: 32887654}, diff --git a/packages/z2s/src/sql.test.ts b/packages/z2s/src/sql.test.ts index fb3706c230..5b922d77b8 100644 --- a/packages/z2s/src/sql.test.ts +++ b/packages/z2s/src/sql.test.ts @@ -258,13 +258,13 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "timestamp" = to_timestamp($1::text::bigint / 1000.0) AT TIME ZONE 'UTC'", - "values": [ - "1712345678901", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "timestamp" = to_timestamp($1::text::numeric / 1000.0) AT TIME ZONE 'UTC'", + "values": [ + "1712345678901", + ], + } + `); }); test('timestamptz type', () => { @@ -282,13 +282,13 @@ describe('string arg packing', () => { )}`, ), ).toMatchInlineSnapshot(` - { - "text": "SELECT * FROM "foo" WHERE "timestampz" = to_timestamp($1::text::bigint / 1000.0)", - "values": [ - "1712345678901", - ], - } - `); + { + "text": "SELECT * FROM "foo" WHERE "timestampz" = to_timestamp($1::text::numeric / 1000.0)", + "values": [ + "1712345678901", + ], + } + `); }); test('jsonb[] type', () => { @@ -467,7 +467,7 @@ describe('string arg packing', () => { ).toMatchInlineSnapshot(` { "text": "SELECT * FROM "foo" WHERE "timestamp" = ARRAY( - SELECT to_timestamp(value::text::bigint / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) + SELECT to_timestamp(value::text::numeric / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) )", "values": [ "[1712345678901,1712345678902]", @@ -493,7 +493,7 @@ describe('string arg packing', () => { ).toMatchInlineSnapshot(` { "text": "SELECT * FROM "foo" WHERE "timestampz" = ARRAY( - SELECT to_timestamp(value::text::bigint / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) + SELECT to_timestamp(value::text::numeric / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) )", "values": [ "[1712345678901,1712345678902]", @@ -863,7 +863,7 @@ describe('string arg packing', () => { ), ).toMatchInlineSnapshot(` { - "text": "INSERT INTO "foo" VALUES (to_timestamp($1::text::bigint / 1000.0) AT TIME ZONE 'UTC')", + "text": "INSERT INTO "foo" VALUES (to_timestamp($1::text::numeric / 1000.0) AT TIME ZONE 'UTC')", "values": [ "1712345678901", ], @@ -884,7 +884,7 @@ describe('string arg packing', () => { ).toMatchInlineSnapshot(` { "text": "INSERT INTO "foo" VALUES (ARRAY( - SELECT to_timestamp(value::text::bigint / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) + SELECT to_timestamp(value::text::numeric / 1000.0) AT TIME ZONE 'UTC' FROM jsonb_array_elements_text($1::text::jsonb) ))", "values": [ "[1712345678901,1712345678902]", @@ -905,7 +905,7 @@ describe('string arg packing', () => { ), ).toMatchInlineSnapshot(` { - "text": "INSERT INTO "foo" VALUES (to_timestamp($1::text::bigint / 1000.0))", + "text": "INSERT INTO "foo" VALUES (to_timestamp($1::text::numeric / 1000.0))", "values": [ "1712345678901", ], @@ -926,7 +926,7 @@ describe('string arg packing', () => { ).toMatchInlineSnapshot(` { "text": "INSERT INTO "foo" VALUES (ARRAY( - SELECT to_timestamp(value::text::bigint / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) + SELECT to_timestamp(value::text::numeric / 1000.0) FROM jsonb_array_elements_text($1::text::jsonb) ))", "values": [ "[1712345678901,1712345678902]", diff --git a/packages/z2s/src/sql.ts b/packages/z2s/src/sql.ts index 8e80311f03..a11ebdd90a 100644 --- a/packages/z2s/src/sql.ts +++ b/packages/z2s/src/sql.ts @@ -207,7 +207,7 @@ function formatCommonToSingularAndPlural( case 'date': case 'timestamp': case 'timestamp without time zone': - return `to_timestamp(${valuePlaceholder}::text::bigint / 1000.0)${atTimeZone}`; + return `to_timestamp(${valuePlaceholder}::text::numeric / 1000.0)${atTimeZone}`; case 'timetz': // @ts-expect-error Fallthrough intended From 1eb69b4d818069fbb6a427af308461925920522a Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Tue, 31 Mar 2026 21:24:27 +0200 Subject: [PATCH 200/495] chore: upgrade actions/checkout to v6 (#5719) We were getting warning about deprecation --- .github/workflows/sst-gigabugs-deploy.yml | 2 +- .github/workflows/sst-prod-deploy.yml | 2 +- .github/workflows/sst-sandbox-deploy.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sst-gigabugs-deploy.yml b/.github/workflows/sst-gigabugs-deploy.yml index 822027e1f5..d7ea655550 100644 --- a/.github/workflows/sst-gigabugs-deploy.yml +++ b/.github/workflows/sst-gigabugs-deploy.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Set up Node.js uses: actions/setup-node@v6 diff --git a/.github/workflows/sst-prod-deploy.yml b/.github/workflows/sst-prod-deploy.yml index 0f818fce39..4968281bbc 100644 --- a/.github/workflows/sst-prod-deploy.yml +++ b/.github/workflows/sst-prod-deploy.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Set up Node.js uses: actions/setup-node@v6 diff --git a/.github/workflows/sst-sandbox-deploy.yml b/.github/workflows/sst-sandbox-deploy.yml index 3e0c38dcee..2bddf96808 100644 --- a/.github/workflows/sst-sandbox-deploy.yml +++ b/.github/workflows/sst-sandbox-deploy.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Set up Node.js uses: actions/setup-node@v6 From 159cf327e704e03325ef5b573ecb256f67424168 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 31 Mar 2026 15:14:00 -0700 Subject: [PATCH 201/495] fix(zero-cache): remove legacy change-log cleanup signals (#5724) --- .../change-streamer/change-streamer-service.pg.test.ts | 4 ++++ .../src/services/change-streamer/change-streamer-service.ts | 6 +----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts index 5f3029b0df..8840d4ea3d 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.pg.test.ts @@ -829,6 +829,10 @@ describe('change-streamer/service', () => { await sql`SELECT watermark FROM "zoro_3/cdc"."changeLog"`.values(), ).toEqual([['01'], ['01'], ['03'], ['04'], ['05'], ['06'], ['07'], ['08']]); + // schedule a cleanups at 04 and 06 + streamer.scheduleCleanup('06'); + streamer.scheduleCleanup('04'); + expect(setTimeoutFn).toHaveBeenCalledTimes(1); expect(setTimeoutFn.mock.calls[0][1]).toBe(30000); diff --git a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts index 587d44ed69..fdcffe9e5d 100644 --- a/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts +++ b/packages/zero-cache/src/services/change-streamer/change-streamer-service.ts @@ -492,7 +492,7 @@ class ChangeStreamerImpl implements ChangeStreamerService { } subscribe(ctx: SubscriberContext): Promise> { - const {protocolVersion, id, mode, replicaVersion, watermark, initial} = ctx; + const {protocolVersion, id, mode, replicaVersion, watermark} = ctx; if (mode === 'serving') { this.#serving.resolve(); } @@ -521,10 +521,6 @@ class ChangeStreamerImpl implements ChangeStreamerService { this.#forwarder.add(subscriber); this.#storer.catchup(subscriber, mode); - - if (initial) { - this.scheduleCleanup(watermark); - } } return Promise.resolve(downstream); } From 417704add165bb38eb32e4462812df2aa7f113f3 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Tue, 31 Mar 2026 18:25:41 -0700 Subject: [PATCH 202/495] fix(zero-cache): catch errors in transaction preamble (#5727) --- packages/zero-cache/src/db/run-transaction.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/zero-cache/src/db/run-transaction.ts b/packages/zero-cache/src/db/run-transaction.ts index f1b194ef39..8d08c73834 100644 --- a/packages/zero-cache/src/db/run-transaction.ts +++ b/packages/zero-cache/src/db/run-transaction.ts @@ -44,7 +44,7 @@ export function runTx( // application logic; for potentially long-running operations like // migrations and background cleanup, the statement timeout should be // disabled to prevent these operations from timing out. - void sql`SET LOCAL statement_timeout = 0;`.execute(); + void sql`SET LOCAL statement_timeout = 0;`.execute().catch(() => {}); // Set an idle_in_transaction_session_timeout to limit the blast radius of // orphaned transactions. The zero-cache does not keep transactions open @@ -54,7 +54,8 @@ export function runTx( .unsafe( /*sql*/ `SET LOCAL idle_in_transaction_session_timeout = ${IDLE_IN_TRANSACTION_SESSION_TIMEOUT_MS}`, ) - .execute(); + .execute() + .catch(() => {}); return fn(sql); }); From 5844d8314471eec5d7aa1065a59638b7bcb232ec Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 1 Apr 2026 10:06:00 +0200 Subject: [PATCH 203/495] chore(zql): add in-memory IVM benchmarks (#5721) Add memory benchmarks that require no PostgreSQL/Docker, enabling easy regression testing of IVM hot-path performance: ``` cd packages/zql-benchmarks nr bench ivm-memory ``` Co-authored-by: Claude --- packages/zql-benchmarks/package.json | 4 +- .../zql-benchmarks/src/ivm-memory.bench.ts | 322 ++++++++++++++++++ 2 files changed, 323 insertions(+), 3 deletions(-) create mode 100644 packages/zql-benchmarks/src/ivm-memory.bench.ts diff --git a/packages/zql-benchmarks/package.json b/packages/zql-benchmarks/package.json index 694bd97dd2..7da3ba99d5 100644 --- a/packages/zql-benchmarks/package.json +++ b/packages/zql-benchmarks/package.json @@ -21,6 +21,7 @@ }, "devDependencies": { "@types/tmp": "^0.2.6", + "mitata": "^1.0.34", "otel": "0.0.0", "shared": "0.0.0", "typescript": "~5.9.3", @@ -31,8 +32,5 @@ "zero-schema": "0.0.0", "zqlite": "0.0.0", "zql-integration-tests": "0.0.0" - }, - "dependencies": { - "mitata": "^1.0.34" } } diff --git a/packages/zql-benchmarks/src/ivm-memory.bench.ts b/packages/zql-benchmarks/src/ivm-memory.bench.ts new file mode 100644 index 0000000000..8883af17d7 --- /dev/null +++ b/packages/zql-benchmarks/src/ivm-memory.bench.ts @@ -0,0 +1,322 @@ +/** + * Standalone IVM benchmarks that run entirely in-memory (no PostgreSQL needed). + * + * These benchmarks exercise the hot paths of the IVM pipeline: + * - Hydration (initial fetch) + * - Push (incremental update) + * + * Run with: + * npm --workspace=zql-benchmarks run bench:memory + */ + +import {bench, describe} from '../../shared/src/bench.ts'; +import type {Row} from '../../zero-protocol/src/data.ts'; +import {MemorySource} from '../../zql/src/ivm/memory-source.ts'; +import {QueryDelegateImpl} from '../../zql/src/query/test/query-delegate.ts'; +import {builder, schema} from './schema.ts'; + +// ---- Data sizes ------------------------------------------------------------- +// Keep small to run fast; increase for more stable results. + +const NUM_USERS = 50; +const NUM_ISSUES = 500; +const NUM_COMMENTS = 1000; +const NUM_LABELS = 10; +const NUM_ISSUE_LABELS = 500; + +// ---- Data generation -------------------------------------------------------- + +function makeSources() { + const {tables} = schema; + + const sources: Record = {}; + for (const [name, tableSchema] of Object.entries(tables)) { + sources[name] = new MemorySource( + tableSchema.name, + tableSchema.columns, + tableSchema.primaryKey, + ); + } + + function add(tableName: string, row: Row) { + for (const _ of sources[tableName].push({type: 'add', row})) { + /* consume */ + } + } + + // Users + for (let i = 0; i < NUM_USERS; i++) { + add('user', { + id: `user-${i}`, + login: `user${i}`, + name: `User ${i}`, + avatar: `avatar${i}`, + role: i % 10 === 0 ? 'crew' : 'user', + }); + } + + // Projects + add('project', { + id: 'proj-0', + name: 'Project Zero', + lowerCaseName: 'project zero', + }); + add('project', { + id: 'proj-1', + name: 'Project One', + lowerCaseName: 'project one', + }); + + // Issues + const issues: Row[] = []; + for (let i = 0; i < NUM_ISSUES; i++) { + const row: Row = { + id: `issue-${i}`, + shortID: i, + title: `Issue ${i}: Some bug or feature request`, + open: i % 3 !== 0, + modified: 1_700_000_000_000 - i * 1000, + created: 1_700_000_000_000 - i * 2000, + projectID: `proj-${i % 2}`, + creatorID: `user-${i % NUM_USERS}`, + assigneeID: i % 4 === 0 ? undefined : `user-${(i + 1) % NUM_USERS}`, + description: `Description for issue ${i}`, + visibility: i % 5 === 0 ? 'internal' : 'public', + }; + issues.push(row); + add('issue', row); + } + + // Comments + for (let i = 0; i < NUM_COMMENTS; i++) { + add('comment', { + id: `comment-${i}`, + issueID: `issue-${i % NUM_ISSUES}`, + created: 1_700_000_000_000 - i * 500, + body: `Comment body ${i}`, + creatorID: `user-${i % NUM_USERS}`, + }); + } + + // Labels + for (let i = 0; i < NUM_LABELS; i++) { + add('label', { + id: `label-${i}`, + name: `label-${i}`, + projectID: `proj-${i % 2}`, + }); + } + + // Issue labels (unique pairs) + const seen = new Set(); + let il = 0; + for (let i = 0; il < NUM_ISSUE_LABELS; i++) { + const issueID = `issue-${i % NUM_ISSUES}`; + const labelID = `label-${i % NUM_LABELS}`; + const key = `${issueID}|${labelID}`; + if (!seen.has(key)) { + seen.add(key); + add('issueLabel', { + issueID, + labelID, + projectID: `proj-${i % 2}`, + }); + il++; + } + } + + return {sources, issues}; +} + +// Build dataset once +const {sources, issues} = makeSources(); + +// ---- Hydration benchmarks --------------------------------------------------- + +describe('hydration', () => { + bench('hydrate: issues only', async () => { + const delegate = new QueryDelegateImpl({sources}); + await delegate.run(builder.issue); + }); + + bench('hydrate: issues with creator', async () => { + const delegate = new QueryDelegateImpl({sources}); + await delegate.run(builder.issue.related('creator')); + }); + + bench('hydrate: issues with creator + comments', async () => { + const delegate = new QueryDelegateImpl({sources}); + await delegate.run(builder.issue.related('creator').related('comments')); + }); + + bench('hydrate: issues filtered open', async () => { + const delegate = new QueryDelegateImpl({sources}); + await delegate.run(builder.issue.where('open', true)); + }); + + bench('hydrate: issues limit 50', async () => { + const delegate = new QueryDelegateImpl({sources}); + await delegate.run(builder.issue.limit(50)); + }); +}); + +// ---- Push benchmarks -------------------------------------------------------- + +describe('push', () => { + let pushCount = 0; + + bench('push: add issue (no join)', function* () { + const delegate = new QueryDelegateImpl({sources}); + const view = delegate.materialize(builder.issue); + + yield () => { + const row: Row = { + id: `push-issue-${pushCount++}`, + shortID: NUM_ISSUES + pushCount, + title: `Push Issue ${pushCount}`, + open: true, + modified: Date.now(), + created: Date.now(), + projectID: 'proj-0', + creatorID: 'user-0', + assigneeID: undefined, + description: 'Pushed issue', + visibility: 'public', + }; + for (const _ of sources['issue'].push({type: 'add', row})) { + /* consume */ + } + }; + + view.destroy(); + }); + + bench('push: add issue (with creator join)', function* () { + const delegate = new QueryDelegateImpl({sources}); + const view = delegate.materialize(builder.issue.related('creator')); + + yield () => { + const row: Row = { + id: `push-issue-j-${pushCount++}`, + shortID: NUM_ISSUES + pushCount, + title: `Push Issue ${pushCount}`, + open: true, + modified: Date.now(), + created: Date.now(), + projectID: 'proj-0', + creatorID: 'user-0', + assigneeID: undefined, + description: 'Pushed issue', + visibility: 'public', + }; + for (const _ of sources['issue'].push({type: 'add', row})) { + /* consume */ + } + }; + + view.destroy(); + }); + + bench('push: edit issue title', function* () { + const delegate = new QueryDelegateImpl({sources}); + const view = delegate.materialize(builder.issue); + let editCount = 0; + + yield () => { + const idx = editCount % NUM_ISSUES; + const oldRow = issues[idx]; + const newRow = {...oldRow, title: `Edited ${editCount++}`}; + for (const _ of sources['issue'].push({ + type: 'edit', + oldRow: oldRow as Row, + row: newRow, + })) { + /* consume */ + } + // restore + for (const _ of sources['issue'].push({ + type: 'edit', + oldRow: newRow, + row: oldRow as Row, + })) { + /* consume */ + } + }; + + view.destroy(); + }); + + bench('push: add comment (child relation)', function* () { + const delegate = new QueryDelegateImpl({sources}); + const view = delegate.materialize(builder.issue.related('comments')); + + yield () => { + const row: Row = { + id: `push-comment-${pushCount++}`, + issueID: `issue-${pushCount % NUM_ISSUES}`, + created: Date.now(), + body: 'A new comment', + creatorID: 'user-0', + }; + for (const _ of sources['comment'].push({type: 'add', row})) { + /* consume */ + } + }; + + view.destroy(); + }); + + bench('push: add issue inside limit(50)', function* () { + const delegate = new QueryDelegateImpl({sources}); + const view = delegate.materialize(builder.issue.limit(50)); + + yield () => { + // Very low ID ensures insertion at front (inside limit) + const row: Row = { + id: `aaa-${String(pushCount++).padStart(12, '0')}`, + shortID: -pushCount, + title: `Front issue ${pushCount}`, + open: true, + modified: Date.now(), + created: Date.now(), + projectID: 'proj-0', + creatorID: 'user-0', + assigneeID: undefined, + description: 'Front of list', + visibility: 'public', + }; + for (const _ of sources['issue'].push({type: 'add', row})) { + /* consume */ + } + }; + + view.destroy(); + }); + + bench('push: add issue outside limit(50)', function* () { + const delegate = new QueryDelegateImpl({sources}); + const view = delegate.materialize(builder.issue.limit(50)); + + yield () => { + // Very high ID ensures insertion past limit + const row: Row = { + id: `zzz-${pushCount++}`, + shortID: NUM_ISSUES + pushCount, + title: `Back issue ${pushCount}`, + open: true, + modified: Date.now(), + created: Date.now(), + projectID: 'proj-0', + creatorID: 'user-0', + assigneeID: undefined, + description: 'End of list', + visibility: 'public', + }; + for (const _ of sources['issue'].push({type: 'add', row})) { + /* consume */ + } + }; + + view.destroy(); + }); +}); From c049cdcd8ed5d2df5e583ac9f3fa3b8a033cf351 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 1 Apr 2026 10:10:53 +0200 Subject: [PATCH 204/495] chore: Change bencher to use delta_iqr (#5729) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch both main and PR Bencher runs to use the `delta_iqr` threshold test for the `throughput` measure, with a lower-bound-only model and bounded sample sizes. `delta_iqr` uses the interquartile range of percentage changes between runs (ΔIQR) instead of raw values, so it learns the normal jitter of a flaky benchmark and only alerts when a new value represents a significantly larger-than-normal drop in throughput. --- .github/workflows/reusable-benchmark.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/reusable-benchmark.yml b/.github/workflows/reusable-benchmark.yml index da86ae052b..fc13bc5333 100644 --- a/.github/workflows/reusable-benchmark.yml +++ b/.github/workflows/reusable-benchmark.yml @@ -62,7 +62,9 @@ jobs: working-directory: ${{ inputs.working_directory }} run: npm run --silent bench:bmf:silent > output.json - - name: Upload benchmarks results to bencher.dev (main) + # If too many alerts, increase threshold-lower-boundary to 2.5 + # If not enough alerts, decrease threshold-lower-boundary to 1.5 + - name: Upload benchmark results (main) if: ${{ !inputs.is_pr }} working-directory: ${{ inputs.working_directory }} run: | @@ -76,13 +78,13 @@ jobs: --github-actions '${{ github.token }}' \ --start-point main \ --threshold-measure throughput \ - --threshold-test t_test \ - --threshold-lower-boundary 0.99 \ - --threshold-min-sample-size 20 \ - --threshold-max-sample-size 60 \ + --threshold-test delta_iqr \ + --threshold-lower-boundary 2 \ + --threshold-min-sample-size 5 \ + --threshold-max-sample-size 50 \ --err - - name: Upload PR benchmarks results to bencher.dev + - name: Upload benchmark results (PR) if: ${{ inputs.is_pr }} working-directory: ${{ inputs.working_directory }} run: | @@ -100,8 +102,8 @@ jobs: --start-point-clone-thresholds \ --start-point-reset \ --threshold-measure throughput \ - --threshold-test t_test \ - --threshold-lower-boundary 0.99 \ - --threshold-min-sample-size 20 \ - --threshold-max-sample-size 60 \ + --threshold-test delta_iqr \ + --threshold-lower-boundary 2 \ + --threshold-min-sample-size 5 \ + --threshold-max-sample-size 50 \ --err From 4a2d6f7542312c9f84df395414b0b00b7cc81528 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 1 Apr 2026 10:20:20 +0200 Subject: [PATCH 205/495] chore: Update lint rules (#5728) and auto fix some lint issues. --- apps/zbugs/scripts/generate-synthetic.ts | 3 ++- oxlint.base.ts | 3 ++- packages/replicache/src/watch.test.ts | 2 +- packages/shared/src/bench-format.ts | 24 +++++++++++-------- packages/shared/src/bigint-json.ts | 3 ++- packages/shared/src/btree-set.ts | 12 ++++++---- packages/z2s/src/sql.ts | 3 ++- .../zero-cache/src/auth/load-permissions.ts | 4 ++-- .../src/server/anonymous-otel-start.ts | 12 ++++++---- .../common/change-stream-multiplexer.test.ts | 2 +- .../change-source/pg/schema/ddl.pg.test.ts | 4 ++-- .../change-streamer/forwarder.test.ts | 2 +- .../src/services/life-cycle.test.ts | 2 +- .../zero-cache/src/services/mutagen/pusher.ts | 6 ++--- .../replicator/schema/column-metadata.ts | 4 ++-- .../services/view-syncer/pipeline-driver.ts | 4 ++-- .../src/services/view-syncer/snapshotter.ts | 2 +- packages/zero-cache/src/types/streams.test.ts | 2 +- packages/zero-cache/src/workers/connection.ts | 2 +- .../zero-cache/src/workers/replicator.test.ts | 2 +- .../zero-protocol/src/application-error.ts | 5 +--- .../src/helpers/planner-exec.ts | 4 ++-- packages/zql/src/ivm/memory-source.ts | 2 +- packages/zql/src/planner/planner-debug.ts | 5 +--- packages/zql/src/query/expression.ts | 4 ++-- 25 files changed, 64 insertions(+), 54 deletions(-) diff --git a/apps/zbugs/scripts/generate-synthetic.ts b/apps/zbugs/scripts/generate-synthetic.ts index fea81dea1b..b4e2aedd20 100644 --- a/apps/zbugs/scripts/generate-synthetic.ts +++ b/apps/zbugs/scripts/generate-synthetic.ts @@ -619,8 +619,9 @@ async function main() { const descTemplate = cat.descriptionTemplates[(i * 3) % cat.descriptionTemplates.length]; let description = fillTemplate(descTemplate, project.components); - if (description.length > 10240) + if (description.length > 10240) { description = description.slice(0, 10237) + '...'; + } // Timestamps - use faker for realistic date spread const created = faker.date diff --git a/oxlint.base.ts b/oxlint.base.ts index aea205ab69..b07730ae7f 100644 --- a/oxlint.base.ts +++ b/oxlint.base.ts @@ -1,4 +1,4 @@ -import type { OxlintConfig } from 'oxlint'; +import type {OxlintConfig} from 'oxlint'; /** * Shared oxlint configuration for all packages in the monorepo. @@ -26,6 +26,7 @@ export const baseConfig = { 'no-unsafe-optional-chaining': 'off', 'no-console': 'error', + 'curly': ['error', 'multi-line'], 'eqeqeq': 'error', 'arrow-body-style': 'error', diff --git a/packages/replicache/src/watch.test.ts b/packages/replicache/src/watch.test.ts index acc69538f4..a2f8c91d28 100644 --- a/packages/replicache/src/watch.test.ts +++ b/packages/replicache/src/watch.test.ts @@ -537,7 +537,7 @@ describe('watch with initial values', () => { const unwatch = rep.experimentalWatch( diff => { - void q.enqueue(diff); + q.enqueue(diff); }, {initialValuesInFirstDiff: true, prefix}, ); diff --git a/packages/shared/src/bench-format.ts b/packages/shared/src/bench-format.ts index 1c3da9d94f..05da1a3a9a 100644 --- a/packages/shared/src/bench-format.ts +++ b/packages/shared/src/bench-format.ts @@ -106,8 +106,9 @@ function histogramBins(stats: Stats, size: number, percentile: number): Bins { min = 0; bins[clamp(0, Math.round((stats.avg - min) / step), size - 1)] = 1; } else { - for (let o = 0; o <= offset; o++) + for (let o = 0; o <= offset; o++) { bins[Math.round((stats.samples[o] - min) / step)]++; + } } return { @@ -137,9 +138,9 @@ function histogramAscii( if (colors) l += ansi.cyan; for (let o = 0; o < avg; o++) { const b = bins[o]; - if (y === 0) + if (y === 0) { l += symbols[clamp(0, Math.round(b * scale), symbols.length - 1)]; - else { + } else { const lo = y * symbols.length; const hi = (y + 1) * symbols.length; const offset = Math.round(b * scale) | 0; @@ -154,9 +155,9 @@ function histogramAscii( { if (colors) l += ansi.yellow; const b = bins[avg]; - if (y === 0) + if (y === 0) { l += symbols[clamp(0, Math.round(b * scale), symbols.length - 1)]; - else { + } else { const lo = y * symbols.length; const hi = (y + 1) * symbols.length; const offset = Math.round(b * scale) | 0; @@ -171,9 +172,9 @@ function histogramAscii( if (colors) l += ansi.magenta; for (let o = 1 + avg; o < bins.length; o++) { const b = bins[o]; - if (y === 0) + if (y === 0) { l += symbols[clamp(0, Math.round(b * scale), symbols.length - 1)]; - else { + } else { const lo = y * symbols.length; const hi = (y + 1) * symbols.length; const offset = Math.round(b * scale) | 0; @@ -222,7 +223,7 @@ export function printBenchResult( const histogram = histogramAscii(histBins, histHeight, colors); if (!colors) l += avg + '/iter' + ' ' + p75 + ' ' + histogram[0]; - else + else { l += ansi.bold + ansi.yellow + @@ -237,6 +238,7 @@ export function printBenchResult( ansi.reset + ' ' + histogram[0]; + } print(l); l = ''; @@ -247,7 +249,7 @@ export function printBenchResult( l += ' '.repeat(diff + nameWidth - 8); if (!colors) l += '(' + min + ' … ' + max + ')'; - else + else { l += ansi.gray + '(' + @@ -264,6 +266,7 @@ export function printBenchResult( ansi.gray + ')' + ansi.reset; + } l += ' '; if (!colors) l += p99 + ' ' + histogram[1]; else l += ansi.gray + p99 + ansi.reset + ' ' + histogram[1]; @@ -276,7 +279,7 @@ export function printBenchResult( const ha = fmtBytes(stats.heap.avg).padStart(9); if (!colors) l += '(' + hm + ' … ' + hx + ') ' + ha + ' ' + histogram[2]; - else + else { l += ansi.gray + '(' + @@ -298,6 +301,7 @@ export function printBenchResult( ansi.reset + ' ' + histogram[2]; + } print(l); } } diff --git a/packages/shared/src/bigint-json.ts b/packages/shared/src/bigint-json.ts index 0541a4123e..9933ac7c0d 100644 --- a/packages/shared/src/bigint-json.ts +++ b/packages/shared/src/bigint-json.ts @@ -12,8 +12,9 @@ import * as v from './valita.ts'; function numberParser(_: unknown, v: string) { const n = +v; if (n >= Number.MIN_SAFE_INTEGER && n <= Number.MAX_SAFE_INTEGER) return n; - if (v.indexOf('.') !== -1 || v.indexOf('e') !== -1 || v.indexOf('E') !== -1) + if (v.indexOf('.') !== -1 || v.indexOf('e') !== -1 || v.indexOf('E') !== -1) { return n; + } return BigInt(v); } diff --git a/packages/shared/src/btree-set.ts b/packages/shared/src/btree-set.ts index 38eceec6bf..ba9108f3b0 100644 --- a/packages/shared/src/btree-set.ts +++ b/packages/shared/src/btree-set.ts @@ -194,8 +194,9 @@ function valuesFromReversed( ): IterableIterator { if (highestKey === undefined) { highestKey = maxKey; - if (highestKey === undefined) - return iterator(() => ({done: true, value: undefined})); // collection is empty + if (highestKey === undefined) { + return iterator(() => ({done: true, value: undefined})); + } // collection is empty } let [nodeQueue, nodeIndex, leaf] = findPath(highestKey, root, comparator) || @@ -570,9 +571,12 @@ class BNodeInternal extends BNode { const {children} = this; if (i >= 0 && i + 1 < children.length) { if (children[i].keys.length + children[i + 1].keys.length <= maxSize) { - if (children[i].isShared) - // cloned already UNLESS i is outside scan range + if ( + children[i].isShared + ) // cloned already UNLESS i is outside scan range + { children[i] = children[i].clone(); + } children[i].mergeSibling(children[i + 1], maxSize); children.splice(i + 1, 1); this.keys.splice(i + 1, 1); diff --git a/packages/z2s/src/sql.ts b/packages/z2s/src/sql.ts index a11ebdd90a..e0fc9a73dd 100644 --- a/packages/z2s/src/sql.ts +++ b/packages/z2s/src/sql.ts @@ -325,8 +325,9 @@ function formatFn( .map((name): string => { if (typeof name === 'string') return escapeIdentifier(name); - if (!localIdentifiers.has(name)) + if (!localIdentifiers.has(name)) { localIdentifiers.set(name, `__local_${localIdentifiers.size}__`); + } return escapeIdentifier(localIdentifiers.get(name)!); }) diff --git a/packages/zero-cache/src/auth/load-permissions.ts b/packages/zero-cache/src/auth/load-permissions.ts index 2c274efe38..11ae29a291 100644 --- a/packages/zero-cache/src/auth/load-permissions.ts +++ b/packages/zero-cache/src/auth/load-permissions.ts @@ -21,7 +21,7 @@ export function loadPermissions( lc: LogContext, replica: StatementRunner, appID: string, - config?: ZeroConfig | undefined, + config?: ZeroConfig, ): LoadedPermissions { const {permissions, hash} = replica.get( `SELECT permissions, hash FROM "${appID}.permissions"`, @@ -66,7 +66,7 @@ export function reloadPermissionsIfChanged( replica: StatementRunner, appID: string, current: LoadedPermissions | null, - config?: ZeroConfig | undefined, + config?: ZeroConfig, ): {permissions: LoadedPermissions; changed: boolean} { if (current === null) { return { diff --git a/packages/zero-cache/src/server/anonymous-otel-start.ts b/packages/zero-cache/src/server/anonymous-otel-start.ts index 441c43cf6d..471e53497d 100644 --- a/packages/zero-cache/src/server/anonymous-otel-start.ts +++ b/packages/zero-cache/src/server/anonymous-otel-start.ts @@ -383,19 +383,23 @@ class AnonymousTelemetryManager { process.env.ECS_CONTAINER_METADATA_URI_V4 || process.env.ECS_CONTAINER_METADATA_URI || process.env.AWS_EXECUTION_ENV - ) + ) { return 'aws'; - if (process.env.RAILWAY_ENV || process.env.RAILWAY_STATIC_URL) + } + if (process.env.RAILWAY_ENV || process.env.RAILWAY_STATIC_URL) { return 'railway'; + } if (process.env.RENDER || process.env.RENDER_SERVICE_ID) return 'render'; if ( process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT - ) + ) { return 'gcp'; - if (process.env.COOLIFY_URL || process.env.COOLIFY_CONTAINER_NAME) + } + if (process.env.COOLIFY_URL || process.env.COOLIFY_CONTAINER_NAME) { return 'coolify'; + } if (process.env.CONTAINER_APP_REVISION) return 'azure'; if (process.env.FLIGHTCONTROL || process.env.FC_URL) return 'flightcontrol'; return 'unknown'; diff --git a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts index 55103fba04..b89cdacab2 100644 --- a/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts +++ b/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.test.ts @@ -119,7 +119,7 @@ describe('change-stream-multiplexer', () => { {ack: false}, {watermark: '124'}, ]; - void stream.pushStatus(status); + stream.pushStatus(status); expect(listenFn1).toHaveBeenNthCalledWith(3, status); expect(listenFn2).toHaveBeenNthCalledWith(3, status); }); diff --git a/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts index e1de063b42..5222a6ed84 100644 --- a/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/schema/ddl.pg.test.ts @@ -1424,8 +1424,8 @@ describe('change-source/tables/ddl', () => { [ `CREATE TABLE IF NOT EXISTS pub.foo(id TEXT PRIMARY KEY, name TEXT UNIQUE, description TEXT);`, [ - /relation \"foo\" already exists, skipping/, - /ignoring CREATE TABLE .*\"object_identity\":null/, + /relation "foo" already exists, skipping/, + /ignoring CREATE TABLE .*"object_identity":null/, ], ], ] satisfies [string, RegExp[]][])( diff --git a/packages/zero-cache/src/services/change-streamer/forwarder.test.ts b/packages/zero-cache/src/services/change-streamer/forwarder.test.ts index 7d2a1e4f27..58411f8870 100644 --- a/packages/zero-cache/src/services/change-streamer/forwarder.test.ts +++ b/packages/zero-cache/src/services/change-streamer/forwarder.test.ts @@ -161,7 +161,7 @@ describe('change-streamer/forwarder', () => { const [sub4, stream4] = createSubscriber('00', true); forwarder.add(sub1); - void forwarder.forward([ + forwarder.forward([ '11', ['begin', messages.begin(), {commitWatermark: '14'}], ]); diff --git a/packages/zero-cache/src/services/life-cycle.test.ts b/packages/zero-cache/src/services/life-cycle.test.ts index 283802c68b..03150fecc0 100644 --- a/packages/zero-cache/src/services/life-cycle.test.ts +++ b/packages/zero-cache/src/services/life-cycle.test.ts @@ -218,7 +218,7 @@ describe('shutdown', () => { ['stop supporting', 'stop supporting', 'stop user-facing'], ], ])('forceful shutdown: %s', async (_name, fn, expectedEvents) => { - void fn(); + fn(); await Promise.allSettled(all.map(w => w.stopped.promise)); diff --git a/packages/zero-cache/src/services/mutagen/pusher.ts b/packages/zero-cache/src/services/mutagen/pusher.ts index 2edfec4520..8f381990ad 100644 --- a/packages/zero-cache/src/services/mutagen/pusher.ts +++ b/packages/zero-cache/src/services/mutagen/pusher.ts @@ -38,7 +38,7 @@ export interface Pusher extends RefCountedService { wsID: string, userPushURL: string | undefined, userPushHeaders: Record | undefined, - onAuthFailure?: (() => void) | undefined, + onAuthFailure?: () => void, ): Source; enqueuePush( clientID: string, @@ -109,7 +109,7 @@ export class PusherService implements Service, Pusher { wsID: string, userPushURL: string | undefined, userPushHeaders: Record | undefined, - onAuthFailure?: (() => void) | undefined, + onAuthFailure?: () => void, ) { return this.#pusher.initConnection( clientID, @@ -347,7 +347,7 @@ class PushWorker { wsID: string, userPushURL: string | undefined, userPushHeaders: Record | undefined, - onAuthFailure?: (() => void) | undefined, + onAuthFailure?: () => void, ) { const existing = this.#clients.get(clientID); if (existing && existing.wsID === wsID) { diff --git a/packages/zero-cache/src/services/replicator/schema/column-metadata.ts b/packages/zero-cache/src/services/replicator/schema/column-metadata.ts index 540ab13418..364600e6cb 100644 --- a/packages/zero-cache/src/services/replicator/schema/column-metadata.ts +++ b/packages/zero-cache/src/services/replicator/schema/column-metadata.ts @@ -165,7 +165,7 @@ export class ColumnMetadataStore { tableName: string, columnName: string, spec: ColumnSpec, - backfill?: BackfillID | undefined, + backfill?: BackfillID, ): void { const metadata = pgColumnSpecToMetadata(spec); this.#insertMetadata(tableName, columnName, metadata, backfill); @@ -175,7 +175,7 @@ export class ColumnMetadataStore { tableName: string, columnName: string, metadata: Omit, - backfill?: BackfillID | undefined, + backfill?: BackfillID, ): void { this.#insertStmt.run( tableName, diff --git a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts index 6cea66a09f..57ab9207e4 100644 --- a/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts +++ b/packages/zero-cache/src/services/view-syncer/pipeline-driver.ts @@ -171,8 +171,8 @@ export class PipelineDriver { clientGroupID: string, inspectorDelegate: InspectorDelegate, yieldThresholdMs: () => number, - enablePlanner?: boolean | undefined, - config?: ZeroConfig | undefined, + enablePlanner?: boolean, + config?: ZeroConfig, ) { this.#lc = lc.withContext('clientGroupID', clientGroupID); this.#snapshotter = snapshotter; diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.ts index 86067d10d8..1173df26ab 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.ts @@ -100,7 +100,7 @@ export class Snapshotter { lc: LogContext, dbFile: string, {appID}: AppID, - pageCacheSizeKib?: number | undefined, + pageCacheSizeKib?: number, ) { this.#lc = lc; this.#dbFile = dbFile; diff --git a/packages/zero-cache/src/types/streams.test.ts b/packages/zero-cache/src/types/streams.test.ts index d5cfbca075..a42ca570b8 100644 --- a/packages/zero-cache/src/types/streams.test.ts +++ b/packages/zero-cache/src/types/streams.test.ts @@ -57,7 +57,7 @@ describe('streams with flow control', () => { ws, messageSchema, ); - void serverRequests.enqueue({serverIn: instream, serverOut: outstream}); + serverRequests.enqueue({serverIn: instream, serverOut: outstream}); }); const url = await server.listen({port: 0}); lc.info?.(`server running on ${url}`); diff --git a/packages/zero-cache/src/workers/connection.ts b/packages/zero-cache/src/workers/connection.ts index 4fd7797d0f..8572a6b0e5 100644 --- a/packages/zero-cache/src/workers/connection.ts +++ b/packages/zero-cache/src/workers/connection.ts @@ -243,7 +243,7 @@ export class Connection { } case 'transient': { for (const error of result.errors) { - void this.sendError(error); + this.sendError(error); } } } diff --git a/packages/zero-cache/src/workers/replicator.test.ts b/packages/zero-cache/src/workers/replicator.test.ts index 8317e47146..0fb04a583b 100644 --- a/packages/zero-cache/src/workers/replicator.test.ts +++ b/packages/zero-cache/src/workers/replicator.test.ts @@ -22,7 +22,7 @@ describe('workers/replicator', () => { const [parent, child] = inProcChannel(); - void setUpMessageHandlers(lc, replicator, parent); + setUpMessageHandlers(lc, replicator, parent); originalSub.push({state: 'version-ready', testSeqNum: 1}); originalSub.push({state: 'version-ready', testSeqNum: 2}); diff --git a/packages/zero-protocol/src/application-error.ts b/packages/zero-protocol/src/application-error.ts index 6471eadd54..98692db37d 100644 --- a/packages/zero-protocol/src/application-error.ts +++ b/packages/zero-protocol/src/application-error.ts @@ -29,10 +29,7 @@ export class ApplicationError< */ readonly #details: T; - constructor( - message: string, - options?: ApplicationErrorOptions | undefined, - ) { + constructor(message: string, options?: ApplicationErrorOptions) { super(message, {cause: options?.cause}); this.name = 'ApplicationError'; this.#details = options?.details ?? (undefined as T); diff --git a/packages/zql-integration-tests/src/helpers/planner-exec.ts b/packages/zql-integration-tests/src/helpers/planner-exec.ts index 63b8785bff..e749bbc89b 100644 --- a/packages/zql-integration-tests/src/helpers/planner-exec.ts +++ b/packages/zql-integration-tests/src/helpers/planner-exec.ts @@ -392,7 +392,7 @@ export type PlannerInfrastructure = { // eslint-disable-next-line @typescript-eslint/no-explicit-any query: any, useIndexedDb?: boolean, - maxEstimatedCost?: number | undefined, + maxEstimatedCost?: number, ) => PlanAttemptResult[]; }; @@ -500,7 +500,7 @@ export async function createPlannerInfrastructure(config: { // eslint-disable-next-line @typescript-eslint/no-explicit-any query: any, useIndexedDb = false, - maxEstimatedCost?: number | undefined, + maxEstimatedCost?: number, ): PlanAttemptResult[] { // Get the query AST const ast = mapAST( diff --git a/packages/zql/src/ivm/memory-source.ts b/packages/zql/src/ivm/memory-source.ts index 769a3c927a..ebb145d79b 100644 --- a/packages/zql/src/ivm/memory-source.ts +++ b/packages/zql/src/ivm/memory-source.ts @@ -775,7 +775,7 @@ export function* generateWithOverlayUnordered( overlay: Overlay | undefined, lastPushedEpoch: number, primaryKey: PrimaryKey, - filterPredicate?: ((row: Row) => boolean) | undefined, + filterPredicate?: (row: Row) => boolean, ) { let overlayToApply: Overlay | undefined = undefined; if (overlay && lastPushedEpoch >= overlay.epoch) { diff --git a/packages/zql/src/planner/planner-debug.ts b/packages/zql/src/planner/planner-debug.ts index 073fcc742f..1bfcdf6ca7 100644 --- a/packages/zql/src/planner/planner-debug.ts +++ b/packages/zql/src/planner/planner-debug.ts @@ -271,10 +271,7 @@ function formatAttemptSummary( | NodeCostEvent | Extract )[] = []; - const connectionConstraintEvents: ( - | NodeConstraintEvent - | Extract - )[] = []; + const connectionConstraintEvents: NodeConstraintEvent[] = []; for (const event of events) { if (event.type === 'node-cost' && event.nodeType === 'connection') { diff --git a/packages/zql/src/query/expression.ts b/packages/zql/src/query/expression.ts index d2d7988a2d..e08f5f6964 100644 --- a/packages/zql/src/query/expression.ts +++ b/packages/zql/src/query/expression.ts @@ -93,7 +93,7 @@ export class ExpressionBuilder< cmp( field: string, opOrValue: SimpleOperator | ParameterReference | LiteralValue | undefined, - value?: ParameterReference | LiteralValue | undefined, + value?: ParameterReference | LiteralValue, ): Condition { if (arguments.length === 2) { return cmp(field, opOrValue); @@ -192,7 +192,7 @@ export function not(expression: Condition): Condition { export function cmp( field: string, opOrValue: SimpleOperator | ParameterReference | LiteralValue | undefined, - value?: ParameterReference | LiteralValue | undefined, + value?: ParameterReference | LiteralValue, ): Condition { let op: SimpleOperator; let actualValue: ParameterReference | LiteralValue | undefined; From a53b9749db9ccafd8e2ea15702596788362220f5 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 1 Apr 2026 18:06:30 +0200 Subject: [PATCH 206/495] fix(benchmark): adjust threshold boundaries and sample sizes (#5732) To make tests less flaky --- .github/workflows/reusable-benchmark.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/reusable-benchmark.yml b/.github/workflows/reusable-benchmark.yml index fc13bc5333..34a62b1206 100644 --- a/.github/workflows/reusable-benchmark.yml +++ b/.github/workflows/reusable-benchmark.yml @@ -79,9 +79,9 @@ jobs: --start-point main \ --threshold-measure throughput \ --threshold-test delta_iqr \ - --threshold-lower-boundary 2 \ + --threshold-lower-boundary 2.5 \ --threshold-min-sample-size 5 \ - --threshold-max-sample-size 50 \ + --threshold-max-sample-size 20 \ --err - name: Upload benchmark results (PR) @@ -103,7 +103,7 @@ jobs: --start-point-reset \ --threshold-measure throughput \ --threshold-test delta_iqr \ - --threshold-lower-boundary 2 \ + --threshold-lower-boundary 2.5 \ --threshold-min-sample-size 5 \ - --threshold-max-sample-size 50 \ + --threshold-max-sample-size 20 \ --err From 97aaac750c9730b628b85b9906dbe9d2050f9c55 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Wed, 1 Apr 2026 09:24:15 -1000 Subject: [PATCH 207/495] fix(zero-cache): downgrade TTL clock update failure to warn (#5733) TTL clock updates are fire-and-forget operations that only affect garbage collection timing. If they fail transiently (e.g., connection pool saturation), it shouldn't wake anyone up. Real CVR connection problems will surface as errors on the critical path (load/flushed). --- packages/zero-cache/src/services/view-syncer/view-syncer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.ts index ae1d2a6e72..1838f3db54 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.ts @@ -910,7 +910,7 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { lc.debug?.('Synced ttlClock', rid, `in ${Date.now() - start} ms`); }) .catch(e => { - lc.error?.( + lc.warn?.( 'failed to update TTL clock', rid, `after ${Date.now() - start} ms`, From ab606989d5ea7218fdab2b896166431aa1dcddc7 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 1 Apr 2026 23:31:20 +0200 Subject: [PATCH 208/495] perf(zql): reuse comparators when possible (#5736) Instead of allocating closures on each fetch(indexComparator) on every invocation even in the common non-reversed case. Change to reuse the existing comparator directly when req.reverse is false, and only allocate a negating closure when actually reversing. Co-authored-by: Claude --- packages/zql/src/ivm/memory-source.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/zql/src/ivm/memory-source.ts b/packages/zql/src/ivm/memory-source.ts index ebb145d79b..3e4e5ba24f 100644 --- a/packages/zql/src/ivm/memory-source.ts +++ b/packages/zql/src/ivm/memory-source.ts @@ -1,8 +1,8 @@ import {assert, unreachable} from '../../../shared/src/asserts.ts'; import {BTreeSet} from '../../../shared/src/btree-set.ts'; import {hasOwn} from '../../../shared/src/has-own.ts'; -import {must} from '../../../shared/src/must.ts'; import {once} from '../../../shared/src/iterables.ts'; +import {must} from '../../../shared/src/must.ts'; import type { Condition, Ordering, @@ -257,8 +257,10 @@ export class MemorySource implements Source { *#fetch(req: FetchRequest, conn: Connection): Stream { const requestedSort = must(conn.sort); const {compareRows} = conn; - const connectionComparator = (r1: Row, r2: Row) => - compareRows(r1, r2) * (req.reverse ? -1 : 1); + // Avoid allocating a new closure when not reversing (the common case). + const connectionComparator: Comparator = req.reverse + ? (r1, r2) => compareRows(r2, r1) + : compareRows; const pkConstraint = primaryKeyConstraintFromFilters( conn.filters?.condition, @@ -289,8 +291,10 @@ export class MemorySource implements Source { const index = this.#getOrCreateIndex(indexSort, conn); const {data, comparator: compare} = index; - const indexComparator = (r1: Row, r2: Row) => - compare(r1, r2) * (req.reverse ? -1 : 1); + // Avoid allocating a new closure when not reversing (the common case). + const indexComparator: Comparator = req.reverse + ? (r1, r2) => compare(r2, r1) + : compare; const startAt = req.start?.row; From 0cd34701a9e39e9888d818ccb3987a501cbfee3c Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 1 Apr 2026 17:48:34 -0700 Subject: [PATCH 209/495] chore(zero-cache): latest litestream fixes zero@v0.0.9 (#5738) Bump litestream to include fixes: * correctly handle s3 download part retries * improve logging when a parallel download fails * include the `cmd` attribute in logs output --- packages/zero/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/zero/Dockerfile b/packages/zero/Dockerfile index 26fea0383e..716b03a266 100644 --- a/packages/zero/Dockerfile +++ b/packages/zero/Dockerfile @@ -1,10 +1,10 @@ FROM golang:1.23 AS litestream WORKDIR /src/ -RUN git clone --depth 1 --branch zero@v0.0.8 https://github.com/rocicorp/litestream.git +RUN git clone --depth 1 --branch zero@v0.0.9 https://github.com/rocicorp/litestream.git WORKDIR /src/litestream/ -ARG LITESTREAM_VERSION=0.3.13+z0.0.8 # upstream version + zero version +ARG LITESTREAM_VERSION=0.3.13+z0.0.9 # upstream version + zero version RUN --mount=type=cache,target=/root/.cache/go-build \ --mount=type=cache,target=/go/pkg \ From f8a84eb5674ca44dd6765cdfb26f9cbc2ab9fbe2 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Wed, 1 Apr 2026 19:28:59 -0700 Subject: [PATCH 210/495] chore(zero-cache): log unhandled exceptions/rejections with the LogContext (#5739) --- packages/zero-cache/src/server/logging.ts | 14 +++++++++----- packages/zero-cache/src/services/life-cycle.ts | 12 ++++++++++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/zero-cache/src/server/logging.ts b/packages/zero-cache/src/server/logging.ts index c68a35078c..861b8f96ee 100644 --- a/packages/zero-cache/src/server/logging.ts +++ b/packages/zero-cache/src/server/logging.ts @@ -6,6 +6,7 @@ import { getLogSink, type LogConfig, } from '../../../shared/src/logging.ts'; +import {UNHANDLED_EXCEPTION_ERROR_CODE} from '../services/life-cycle.ts'; import {OtelLogSink} from './otel-log-sink.ts'; export function createLogContext( @@ -13,11 +14,14 @@ export function createLogContext( context: {worker: string}, includeOtel = true, ): LogContext { - return createLogContextShared( - {log}, - context, - createLogSink(log, includeOtel), - ); + const logSink = createLogSink(log, includeOtel); + const lc = createLogContextShared({log}, context, logSink); + process.on('uncaughtException', async (err, origin) => { + lc.error?.(origin, err); + await logSink.flush?.(); + process.exit(UNHANDLED_EXCEPTION_ERROR_CODE); + }); + return lc; } function createLogSink(config: LogConfig, includeOtel: boolean): LogSink { diff --git a/packages/zero-cache/src/services/life-cycle.ts b/packages/zero-cache/src/services/life-cycle.ts index b7a7431268..3948dab7cc 100644 --- a/packages/zero-cache/src/services/life-cycle.ts +++ b/packages/zero-cache/src/services/life-cycle.ts @@ -28,6 +28,11 @@ export type WorkerType = 'user-facing' | 'supporting'; export const GRACEFUL_SHUTDOWN = ['SIGTERM', 'SIGINT'] as const; export const FORCEFUL_SHUTDOWN = ['SIGQUIT'] as const; +// An internal error code used to indicate that a message has already been +// logged at level ERRROR. When a process exits with this error code, the +// parent process logs the exit at level WARN instead of ERROR. +export const UNHANDLED_EXCEPTION_ERROR_CODE = 13; + /** * Handles readiness, termination signals, and coordination of graceful * shutdown. @@ -175,10 +180,13 @@ export class ProcessManager { // Non-zero exits are warnings (not errors) since they're often transient issues. const log = code === 0 && this.#userFacing.size === 0 ? 'info' : 'warn'; this.#lc[log]?.(`${name} (${pid}) exited with code (${code})`, err ?? ''); - return this.#exit(log === 'info' ? code : -1); + return this.#exit(log === 'info' || code !== 0 ? code : -1); } - const log = this.#drainStart === 0 ? 'error' : 'warn'; + const log = + this.#drainStart > 0 || code === UNHANDLED_EXCEPTION_ERROR_CODE + ? 'warn' + : 'error'; if (sig) { this.#lc[log]?.(`${name} (${pid}) killed with (${sig})`, err ?? ''); } else if (code !== 0) { From 54d10a2cba6fc6c3dafe5a1356ac07c93eacec16 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Apr 2026 08:00:32 +0200 Subject: [PATCH 211/495] fix(benchmark): Change bencher threshould to percent (#5737) This changes bencher.dev's threshould to use percent instead. All the fancy models are failing me. Now, it is a regression if the throughput changed by 15%. --- .github/workflows/reusable-benchmark.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/reusable-benchmark.yml b/.github/workflows/reusable-benchmark.yml index 34a62b1206..52653d468f 100644 --- a/.github/workflows/reusable-benchmark.yml +++ b/.github/workflows/reusable-benchmark.yml @@ -62,8 +62,6 @@ jobs: working-directory: ${{ inputs.working_directory }} run: npm run --silent bench:bmf:silent > output.json - # If too many alerts, increase threshold-lower-boundary to 2.5 - # If not enough alerts, decrease threshold-lower-boundary to 1.5 - name: Upload benchmark results (main) if: ${{ !inputs.is_pr }} working-directory: ${{ inputs.working_directory }} @@ -78,10 +76,10 @@ jobs: --github-actions '${{ github.token }}' \ --start-point main \ --threshold-measure throughput \ - --threshold-test delta_iqr \ - --threshold-lower-boundary 2.5 \ - --threshold-min-sample-size 5 \ - --threshold-max-sample-size 20 \ + --threshold-test percentage \ + --threshold-lower-boundary 0.15 \ + --threshold-min-sample-size 10 \ + --threshold-max-sample-size 30 \ --err - name: Upload benchmark results (PR) @@ -102,8 +100,8 @@ jobs: --start-point-clone-thresholds \ --start-point-reset \ --threshold-measure throughput \ - --threshold-test delta_iqr \ - --threshold-lower-boundary 2.5 \ - --threshold-min-sample-size 5 \ - --threshold-max-sample-size 20 \ + --threshold-test percentage \ + --threshold-lower-boundary 0.15 \ + --threshold-min-sample-size 10 \ + --threshold-max-sample-size 30 \ --err From 4f6f06cea46e93304a5bf2be4f0c38af8721a10c Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 14:27:04 +0200 Subject: [PATCH 212/495] fix(zero-server): prevent 57P01 unhandled error flake in adapters.pg.test.ts teardown (#5740) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The per-test DB was being dropped while node-postgres clients/pools still had open connections. Postgres would then force-kill those connections, causing `pg` to emit an async `error` event that Vitest caught as an unhandled error — surfacing as a flaky failure on the last test (`types - implicit schema generic`). ## Teardown fixes (`afterEach`) - **Remove incorrect `await` on `PoolClient.release()`** — it's synchronous; awaiting it gave false sequencing guarantees - **Reorder cleanup**: Prisma (owns its own internal pool) → `Client.end()` → `Pool.end()` → `testDBs.drop()` - **Wrap each step in `try/catch`** so partial setup failures don't leak connections - **`try/finally` around all cleanup** so `testDBs.drop()` always runs, but only after all clients are closed ## Hardening (`beforeEach`) - Attach narrowly-scoped `error` handlers on `nodePgPool` and `nodePgClient` that suppress only `code === '57P01'` and re-throw everything else, eliminating the race where a connection-kill during teardown still reaches Vitest as unhandled: ```ts nodePgPool.on('error', (e: Error & {code?: string}) => { if (e.code === '57P01') return; throw e; }); ```
Original prompt Fix CI flake in PG adapter tests where Vitest reports an unhandled node-postgres error `terminating connection due to administrator command` (Postgres code 57P01) during teardown. Context: - Failing job logs (Actions run 23896566436, job 69682873903) show Vitest caught an unhandled error originating while running `packages/zero-server/src/adapters/adapters.pg.test.ts`, last test `types - implicit schema generic`. - The error indicates the Postgres server terminated an existing connection (likely because the per-test DB was dropped while a client was still connected). Relevant files: - `packages/zero-server/src/adapters/adapters.pg.test.ts` (test uses postgres-js, node-postgres Pool/Client, and Prisma client; drops DB in `afterEach`). Requested changes: 1) Make teardown deterministic and resilient: - Ensure all node-postgres clients/pools and Prisma are fully disconnected before dropping the per-test database. - Remove incorrect `await` on `PoolClient.release()` (release is synchronous) and guard teardown with try/catch so partial setup failures don’t leak connections. - Reorder cleanup so Prisma disconnect occurs before DB drop, and ensure pool is ended after releasing clients. - Use `try/finally` so `testDBs.drop(postgresJsClient)` always runs, but only after closing clients. 2) Optional hardening (only if still needed after teardown changes): - Add narrowly scoped error handlers on node-postgres connections/pool to ignore `57P01` during shutdown so it doesn’t surface as an unhandled Vitest error, without hiding other errors. Acceptance: - `pnpm`/`npm` test suite for PG mode should pass reliably on CI. - No unhandled errors in Vitest. Notes: - Keep changes minimal and localized to the failing test file unless you find a better place in the test DB harness. The following is the prior conversation context from the user's chat exploration (may be truncated): User: Please find a solution for this failing job. Use the logs, job definition, and any referenced files where the failure occurred. Keep your response focused on the solution and include code suggestions when appropriate. Assistant: The job is failing due to a **Vitest “unhandled error”** coming from **node-postgres**: - Error: `terminating connection due to administrator command` (Postgres code `57P01`) - Vitest reports it as an **uncaught exception** during `packages/zero-server/src/adapters/adapters.pg.test.ts`, last test: **“types - implicit schema generic”** - This almost always happens when the test runner (or your test DB harness) drops/tears down the database while there are still open connections, and the `pg` client then emits an async error event that Vitest treats as unhandled. ### Why this is happening here In `adapters.pg.test.ts` you create multiple `pg` clients in `beforeEach`: - `nodePgPool` + `nodePgPoolClient` - `nodePgClient` - `prismaClient` (which can also maintain its own pool) Then in `afterEach` you attempt to close them and drop the per-test database: ```ts await nodePgPoolClient.release(); await nodePgClient.end(); await nodePgPool.end(); await prismaClient?.$disconnect(); await testDBs.drop(postgresJsClient); ``` Two problems commonly lead to the exact failure you’re seeing: 1. **You’re not awaiting `release()`** (it’s not async). Not harmful by itself, but it can give a false sense of sequencing and can hide the fact that there may be other in-flight pool activity. 2. **Prisma disconnect happens after pool end**, and Prisma can still have active sessions or queries finishing up; DB drop can still race with those sessions. When the DB gets dropped, Postgres kills connections → node-postgres emits the fatal error asynchronously → Vitest flags it as unhandled. Also note: the “types - implicit schema generic” test is synchronous, so the error is likely emitted **after** that test finishes, during teardown. --- ## Fix (recommended): make teardown resilient and close everything deterministically before dropping DB Update `afterEach` to: - release the pool client synchronously - **end the pool before dropping the DB** - disconnect prisma earlier (and safely) - add defensive `try/finally` so that partial setup doesn’t leave connections open - optionally swallow the specific “admin command” termination error during shutdown (since it’s a teardown artifact, not product behavior) ### Concrete code change In `packages/zero-server/src/adapters/adapters.pg.test.ts`, replace `afterEach` with something like: ```ts afterEach(async () => { // Make teardown idempotent / resilient if setup failed halfway try { // release() is sync; don't await try { nodePgPoolClient?.release(); } catch { // ignore } // Disconnect prisma early; it may own its own pool try { await prismaClient?.$disconnect(); } catch { // ignore } // Close direct client try { await nodePgClient?.end(); } catch { // ignore } // Close pool last (a...
*This pull request was created from Copilot chat.* > --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arv <45845+arv@users.noreply.github.com> --- .../src/adapters/adapters.pg.test.ts | 52 ++++++++++++++++--- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/zero-server/src/adapters/adapters.pg.test.ts b/packages/zero-server/src/adapters/adapters.pg.test.ts index cc67a906d8..c07dbf0eff 100644 --- a/packages/zero-server/src/adapters/adapters.pg.test.ts +++ b/packages/zero-server/src/adapters/adapters.pg.test.ts @@ -32,6 +32,13 @@ beforeEach(async () => { nodePgPool = new Pool({ connectionString: getConnectionURI(postgresJsClient), }); + // Suppress 57P01 ("terminating connection due to administrator command") on the + // pool itself so that connection-level errors emitted during DB teardown don't + // surface as unhandled Vitest errors. + nodePgPool.on('error', (e: Error & {code?: string}) => { + if (e.code === '57P01') return; + throw e; + }); nodePgPoolClient = await nodePgPool.connect(); nodePgClient = new Client({ connectionString: getConnectionURI(postgresJsClient), @@ -44,6 +51,11 @@ beforeEach(async () => { }); await nodePgClient.connect(); + // Suppress 57P01 on the direct client as well. + nodePgClient.on('error', (e: Error & {code?: string}) => { + if (e.code === '57P01') return; + throw e; + }); await postgresJsClient.unsafe(` CREATE TABLE IF NOT EXISTS "user" ( @@ -55,14 +67,38 @@ beforeEach(async () => { }); afterEach(async () => { - // Ensure all node-postgres clients are closed before dropping the DB - await nodePgPoolClient.release(); - await nodePgClient.end(); - await nodePgPool.end(); - await prismaClient?.$disconnect(); - - // Drop the per-test database to avoid global teardown force-terminating connections - await testDBs.drop(postgresJsClient); + try { + // release() is synchronous — do not await + try { + nodePgPoolClient?.release(); + } catch { + // ignore + } + + // Disconnect Prisma early; it maintains its own connection pool + try { + await prismaClient?.$disconnect(); + } catch { + // ignore + } + + // Close the direct client before ending the pool + try { + await nodePgClient?.end(); + } catch { + // ignore + } + + // End the pool last, after all clients have been released/closed + try { + await nodePgPool?.end(); + } catch { + // ignore + } + } finally { + // Drop the per-test database only after all clients are fully closed + await testDBs.drop(postgresJsClient); + } }); type UserStatus = 'active' | 'inactive'; From f9419717e759434640dc1a51a547301a5b5813fc Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Apr 2026 14:27:21 +0200 Subject: [PATCH 213/495] chore(zero-cache): add retry logic for test execution based on CI environment (#5742) --- packages/zero-cache/vitest.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/zero-cache/vitest.config.ts b/packages/zero-cache/vitest.config.ts index a6b513d0ba..e83236da35 100644 --- a/packages/zero-cache/vitest.config.ts +++ b/packages/zero-cache/vitest.config.ts @@ -20,6 +20,7 @@ export function configForVersion(version: number, url: string) { reporter: [['html'], ['clover', {file: 'coverage.xml'}]], include: ['src/**'], }, + retry: CI ? 2 : 0, testTimeout: TIMEOUT, hookTimeout: TIMEOUT, slowTestThreshold: TIMEOUT / 10, From 19a5c716460ef5906bb204ea5d55b2d33aad274f Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Apr 2026 14:28:39 +0200 Subject: [PATCH 214/495] chore: update compare-utf8 to v0.2.0 (#5730) To pick up perf improvements --- package-lock.json | 83 +++++--------------------------- packages/replicache/package.json | 2 +- packages/shared/package.json | 2 +- packages/zero-cache/package.json | 2 +- packages/zero/package.json | 2 +- packages/zql/package.json | 2 +- 6 files changed, 18 insertions(+), 75 deletions(-) diff --git a/package-lock.json b/package-lock.json index 60c3dad1ee..f0db1e8dfa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1032,7 +1032,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.49.2", "@algolia/requester-browser-xhr": "5.49.2", @@ -2056,7 +2055,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -3965,7 +3963,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -3988,7 +3985,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -6562,7 +6558,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6903,7 +6898,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7458,8 +7452,7 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz", "integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.20", @@ -9723,7 +9716,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -9854,7 +9846,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10051,7 +10042,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10148,7 +10138,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -13015,7 +13004,6 @@ "integrity": "sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.5.0" }, @@ -14933,7 +14921,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15071,7 +15058,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", - "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.23" }, @@ -15089,7 +15075,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -15197,7 +15182,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15764,7 +15748,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15841,7 +15824,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -16361,7 +16343,6 @@ "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.2", @@ -16385,7 +16366,6 @@ "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.1.2", "@vitest/mocker": "4.1.2", @@ -16811,7 +16791,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16897,7 +16876,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -16958,7 +16936,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.15.2", "@algolia/client-abtesting": "5.49.2", @@ -18183,7 +18160,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -19079,9 +19055,9 @@ } }, "node_modules/compare-utf8": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/compare-utf8/-/compare-utf8-0.1.1.tgz", - "integrity": "sha512-bND8Irz+KrF96w4Tkm1m8u5q8iE2fnvP196sHGy7XNrGNXlhyl07VnsCRYrXgEhhf/lM7hyCKRnMeh8Icis4Sw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/compare-utf8/-/compare-utf8-0.2.0.tgz", + "integrity": "sha512-5BjVs4Be9AwMm4le3Qb3crp44OAn+uuJhvrjPWA8Es/DfVPq5lSc8JaRg/clrrHOMCU+CdDfv/9eBSPh6OOiUQ==", "license": "Apache-2.0" }, "node_modules/compress-commons": { @@ -20139,7 +20115,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -21246,7 +21221,6 @@ "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -22869,7 +22843,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -23740,7 +23713,6 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10.x" } @@ -24144,7 +24116,6 @@ "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -25358,7 +25329,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -26171,7 +26141,6 @@ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", @@ -28727,6 +28696,7 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/mitata/-/mitata-1.0.34.tgz", "integrity": "sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA==", + "dev": true, "license": "MIT" }, "node_modules/mitt": { @@ -28885,8 +28855,7 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", @@ -28931,7 +28900,6 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -29253,7 +29221,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -29609,7 +29576,6 @@ "integrity": "sha512-4F/NXJiK2KnK4LQiULUPXRzVq0LOfextGvwCVRW1VKQbF5epI3MDMEGVAl5XjAGL6IFc7xBc/eVA95wczPeEQg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -30082,7 +30048,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", @@ -30446,7 +30411,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31660,7 +31624,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -31921,7 +31884,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "7.5.0", "@prisma/dev": "0.20.0", @@ -32352,7 +32314,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32365,7 +32326,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32440,7 +32400,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -32506,7 +32465,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -33753,7 +33711,6 @@ "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -34319,7 +34276,6 @@ "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", @@ -35111,7 +35067,6 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35306,7 +35261,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -35790,8 +35744,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", @@ -36057,7 +36010,6 @@ "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 18" }, @@ -36103,7 +36055,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -36467,7 +36418,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -36779,7 +36729,6 @@ "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", @@ -36929,7 +36878,6 @@ "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.1.2", "@vitest/mocker": "4.1.2", @@ -37049,7 +36997,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -37833,7 +37780,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -37943,7 +37889,6 @@ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "devOptional": true, "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -38288,7 +38233,7 @@ "@vitest/runner": "4.1.2", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", + "compare-utf8": "^0.2.0", "esbuild": "^0.27.4", "expo-sqlite": ">=15", "playwright": "^1.53.2", @@ -38773,7 +38718,7 @@ "@types/semver": "^7.5.1", "@types/strip-ansi": "^3.0.0", "@vitest/runner": "4.1.2", - "compare-utf8": "^0.1.1", + "compare-utf8": "^0.2.0", "fast-check": "^3.18.0", "package-up": "^5.0.0", "playwright": "^1.53.2", @@ -38851,7 +38796,7 @@ "cloudevents": "^10.0.0", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", + "compare-utf8": "^0.2.0", "defu": "^6.1.4", "eventemitter3": "^5.0.1", "fastify": "^5.0.0", @@ -38945,7 +38890,7 @@ "basic-auth": "^2.0.1", "chalk": "^5.3.0", "cloudevents": "^10.0.0", - "compare-utf8": "^0.1.1", + "compare-utf8": "^0.2.0", "defu": "^6.1.4", "eventemitter3": "^5.0.1", "fastify": "^5.0.0", @@ -39535,7 +39480,7 @@ "version": "0.0.0", "dependencies": { "@rocicorp/resolver": "^1.0.2", - "compare-utf8": "^0.1.1" + "compare-utf8": "^0.2.0" }, "devDependencies": { "@faker-js/faker": "^9.6.0", @@ -39551,11 +39496,9 @@ }, "packages/zql-benchmarks": { "version": "0.0.0", - "dependencies": { - "mitata": "^1.0.34" - }, "devDependencies": { "@types/tmp": "^0.2.6", + "mitata": "^1.0.34", "otel": "0.0.0", "shared": "0.0.0", "typescript": "~5.9.3", diff --git a/packages/replicache/package.json b/packages/replicache/package.json index ee0d04fc72..641d56b628 100644 --- a/packages/replicache/package.json +++ b/packages/replicache/package.json @@ -49,7 +49,7 @@ "@vitest/runner": "4.1.2", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", + "compare-utf8": "^0.2.0", "esbuild": "^0.27.4", "expo-sqlite": ">=15", "playwright": "^1.53.2", diff --git a/packages/shared/package.json b/packages/shared/package.json index dc07237831..da374508fa 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -38,7 +38,7 @@ "@types/semver": "^7.5.1", "@types/strip-ansi": "^3.0.0", "@vitest/runner": "4.1.2", - "compare-utf8": "^0.1.1", + "compare-utf8": "^0.2.0", "fast-check": "^3.18.0", "package-up": "^5.0.0", "playwright": "^1.53.2", diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index 15a3308250..a221759361 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -52,7 +52,7 @@ "basic-auth": "^2.0.1", "chalk": "^5.3.0", "cloudevents": "^10.0.0", - "compare-utf8": "^0.1.1", + "compare-utf8": "^0.2.0", "defu": "^6.1.4", "eventemitter3": "^5.0.1", "fastify": "^5.0.0", diff --git a/packages/zero/package.json b/packages/zero/package.json index b4392c07b8..0703382501 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -57,7 +57,7 @@ "cloudevents": "^10.0.0", "command-line-args": "^6.0.1", "command-line-usage": "^7.0.3", - "compare-utf8": "^0.1.1", + "compare-utf8": "^0.2.0", "defu": "^6.1.4", "eventemitter3": "^5.0.1", "fastify": "^5.0.0", diff --git a/packages/zql/package.json b/packages/zql/package.json index 8bb61fd766..f2238744ad 100644 --- a/packages/zql/package.json +++ b/packages/zql/package.json @@ -26,6 +26,6 @@ }, "dependencies": { "@rocicorp/resolver": "^1.0.2", - "compare-utf8": "^0.1.1" + "compare-utf8": "^0.2.0" } } From 3278e7e5957e3a986ec4ef36b0d0ddc7fc12286e Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Apr 2026 14:29:09 +0200 Subject: [PATCH 215/495] perf(shared): replace closure-based BTree iterators with class instances (#5731) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # perf(shared): replace closure-based BTree iterators with class instances ## Problem `BTreeSet`'s forward and reverse iterators were implemented as closures — each call to `valuesFrom` / `valuesReversed` / etc. returned an object created by `iterator()` capturing local variables. While readable, closures produce ad-hoc hidden classes that V8 cannot speculate on as effectively as named classes with known shapes. ## Solution Replace the closure-based iterators with two dedicated classes — `BTreeForwardIterator` and `BTreeReverseIterator` — each holding their traversal state in private fields (`#nodeQueue`, `#nodeIndex`, `#leaf`, `#i`). The public API of `BTreeSet` is unchanged. ## Performance Benchmarked on Node.js with a 1 000-entry tree (see `btree-set.bench.ts`): | Benchmark | `main` | this PR | Δ | |---|---|---|---| | `values()` full scan | 2.58 µs | 2.02 µs | **−22%** | | `valuesFrom()` from mid | 1.25 µs | 845 ns | **−32%** | | `valuesReversed()` full scan | 2.31 µs | 1.65 µs | **−29%** | | `valuesFromReversed()` from mid | 1.27 µs | 871 ns | **−31%** | | `[Symbol.iterator]()` full scan | 2.36 µs | 1.73 µs | **−27%** | | forward `next()` isolated | 2.35 µs | 1.98 µs | **−16%** | | forward `next()` from mid | 1.25 µs | 1.01 µs | **−19%** | | reverse `next()` isolated | 2.46 µs | 1.96 µs | **−20%** | | reverse `next()` from mid | 1.26 µs | 993 ns | **−21%** | This is fork of #5607 by @Karavil --------- Co-authored-by: Alp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/shared/src/btree-set.bench.ts | 107 +++++++++++++++++ packages/shared/src/btree-set.test.ts | 55 ++++++++- packages/shared/src/btree-set.ts | 158 ++++++++++++++++--------- 3 files changed, 262 insertions(+), 58 deletions(-) create mode 100644 packages/shared/src/btree-set.bench.ts diff --git a/packages/shared/src/btree-set.bench.ts b/packages/shared/src/btree-set.bench.ts new file mode 100644 index 0000000000..a901fe8c11 --- /dev/null +++ b/packages/shared/src/btree-set.bench.ts @@ -0,0 +1,107 @@ +import {bench, describe, use} from './bench.ts'; +import {BTreeSet} from './btree-set.ts'; + +const NUM_ENTRIES = 1000; + +const numericComparator = (a: number, b: number) => a - b; + +function makeNumericTree(size: number): BTreeSet { + const tree = new BTreeSet(numericComparator); + for (let i = 0; i < size; i++) { + tree.add(i); + } + return tree; +} + +const tree = makeNumericTree(NUM_ENTRIES); +const midKey = NUM_ENTRIES / 2; + +describe('BTreeSet iterators', () => { + bench('values() full scan', () => { + let sum = 0; + for (const v of tree.values()) { + sum += v; + } + use(sum); + }); + + bench('valuesFrom() from mid', () => { + let sum = 0; + for (const v of tree.valuesFrom(midKey)) { + sum += v; + } + use(sum); + }); + + bench('valuesReversed() full scan', () => { + let sum = 0; + for (const v of tree.valuesReversed()) { + sum += v; + } + use(sum); + }); + + bench('valuesFromReversed() from mid', () => { + let sum = 0; + for (const v of tree.valuesFromReversed(midKey)) { + sum += v; + } + use(sum); + }); + + bench('[Symbol.iterator]() full scan', () => { + let sum = 0; + for (const v of tree) { + sum += v; + } + use(sum); + }); +}); + +// Isolate just the iterator step cost by calling next() directly, +// with no work in the "loop body" beyond consuming the value. +describe('BTreeSet iterator next() in isolation', () => { + bench('forward iterator next()', () => { + const iter = tree.values(); + let result = iter.next(); + let sum = 0; + while (!result.done) { + sum += result.value; + result = iter.next(); + } + use(sum); + }); + + bench('forward iterator next() from mid', () => { + const iter = tree.valuesFrom(midKey); + let result = iter.next(); + let sum = 0; + while (!result.done) { + sum += result.value; + result = iter.next(); + } + use(sum); + }); + + bench('reverse iterator next()', () => { + const iter = tree.valuesReversed(); + let result = iter.next(); + let sum = 0; + while (!result.done) { + sum += result.value; + result = iter.next(); + } + use(sum); + }); + + bench('reverse iterator next() from mid', () => { + const iter = tree.valuesFromReversed(midKey); + let result = iter.next(); + let sum = 0; + while (!result.done) { + sum += result.value; + result = iter.next(); + } + use(sum); + }); +}); diff --git a/packages/shared/src/btree-set.test.ts b/packages/shared/src/btree-set.test.ts index f75ba7ead0..0e400496cd 100644 --- a/packages/shared/src/btree-set.test.ts +++ b/packages/shared/src/btree-set.test.ts @@ -1,6 +1,6 @@ import {compareUTF8} from 'compare-utf8'; import fc, {assert, property} from 'fast-check'; -import {expect, suite, test} from 'vitest'; +import {describe, expect, test} from 'vitest'; import {BTreeSet} from './btree-set.ts'; test('delete', () => { @@ -56,7 +56,7 @@ test('clone', () => { } }); -suite('iterators', () => { +describe('iterators', () => { const t = new BTreeSet((a, b) => a - b); t.add(10); t.add(5); @@ -102,7 +102,7 @@ suite('iterators', () => { }); }); -suite('get', () => { +describe('get', () => { test('number', () => { const t = new BTreeSet((a, b) => a - b); t.add(10); @@ -132,7 +132,7 @@ suite('get', () => { }); }); -suite('has', () => { +describe('has', () => { test('number', () => { const t = new BTreeSet((a, b) => a - b); t.add(10); @@ -182,7 +182,52 @@ test('add should allow replacing equal entry', () => { ]); }); -suite('fast-check', () => { +describe('class-based iterators', () => { + test('forward iterator produces same results as spread', () => { + const t = new BTreeSet((a, b) => a - b); + for (let i = 0; i < 100; i++) { + t.add(i); + } + const forward = [...t.valuesFrom()]; + expect(forward).toEqual(Array.from({length: 100}, (_, i) => i)); + }); + + test('reverse iterator produces same results as spread', () => { + const t = new BTreeSet((a, b) => a - b); + for (let i = 0; i < 100; i++) { + t.add(i); + } + const reversed = [...t.valuesReversed()]; + expect(reversed).toEqual(Array.from({length: 100}, (_, i) => 99 - i)); + }); + + test('empty tree iterator returns done immediately', () => { + const t = new BTreeSet((a, b) => a - b); + const fwd = t.values(); + expect(fwd.next()).toEqual({done: true, value: undefined}); + const rev = t.valuesReversed(); + expect(rev.next()).toEqual({done: true, value: undefined}); + }); + + test('single element tree works', () => { + const t = new BTreeSet((a, b) => a - b); + t.add(42); + expect([...t.values()]).toEqual([42]); + expect([...t.valuesReversed()]).toEqual([42]); + }); + + test('iterator protocol: [Symbol.iterator] returns self', () => { + const t = new BTreeSet((a, b) => a - b); + t.add(1); + t.add(2); + const fwd = t.values(); + expect(fwd[Symbol.iterator]()).toBe(fwd); + const rev = t.valuesReversed(); + expect(rev[Symbol.iterator]()).toBe(rev); + }); +}); + +describe('fast-check', () => { test('OrderedSet Property-based Tests (large)', () => { assert( property( diff --git a/packages/shared/src/btree-set.ts b/packages/shared/src/btree-set.ts index ba9108f3b0..aa866e3082 100644 --- a/packages/shared/src/btree-set.ts +++ b/packages/shared/src/btree-set.ts @@ -3,6 +3,7 @@ import {assert} from './asserts.ts'; const MAX_NODE_SIZE = 32; type Comparator = (a: K, b: K) => number; + export class BTreeSet { #root: BNode = emptyLeaf as BNode; size: number = 0; @@ -132,6 +133,105 @@ export class BTreeSet { } } +class BTreeForwardIterator implements IterableIterator { + readonly #nodeQueue: BNode[][]; + readonly #nodeIndex: number[]; + #leaf: BNode; + #i: number; + + constructor( + nodeQueue: BNode[][], + nodeIndex: number[], + leaf: BNode, + startI: number, + ) { + this.#nodeQueue = nodeQueue; + this.#nodeIndex = nodeIndex; + this.#leaf = leaf; + this.#i = startI; + } + + next(): IteratorResult { + for (;;) { + if (++this.#i < this.#leaf.keys.length) { + return {done: false, value: this.#leaf.keys[this.#i]}; + } + + let level = -1; + for (;;) { + if (++level >= this.#nodeQueue.length) { + return {done: true, value: undefined as unknown as K}; + } + if (++this.#nodeIndex[level] < this.#nodeQueue[level].length) { + break; + } + } + for (; level > 0; level--) { + this.#nodeQueue[level - 1] = ( + this.#nodeQueue[level][this.#nodeIndex[level]] as BNodeInternal + ).children; + this.#nodeIndex[level - 1] = 0; + } + this.#leaf = this.#nodeQueue[0][this.#nodeIndex[0]]; + this.#i = -1; + } + } + + [Symbol.iterator]() { + return this; + } +} + +class BTreeReverseIterator implements IterableIterator { + readonly #nodeQueue: BNode[][]; + readonly #nodeIndex: number[]; + #leaf: BNode; + #i: number; + + constructor( + nodeQueue: BNode[][], + nodeIndex: number[], + leaf: BNode, + startI: number, + ) { + this.#nodeQueue = nodeQueue; + this.#nodeIndex = nodeIndex; + this.#leaf = leaf; + this.#i = startI; + } + + next(): IteratorResult { + for (;;) { + if (--this.#i >= 0) { + return {done: false, value: this.#leaf.keys[this.#i]}; + } + + let level; + // Advance to the next leaf node + for (level = -1; ; ) { + if (++level >= this.#nodeQueue.length) { + return {done: true, value: undefined as unknown as K}; + } + if (--this.#nodeIndex[level] >= 0) { + break; + } + } + for (; level > 0; level--) { + this.#nodeQueue[level - 1] = ( + this.#nodeQueue[level][this.#nodeIndex[level]] as BNodeInternal + ).children; + this.#nodeIndex[level - 1] = this.#nodeQueue[level - 1].length - 1; + } + this.#leaf = this.#nodeQueue[0][this.#nodeIndex[0]]; + this.#i = this.#leaf.keys.length; + } + } + + [Symbol.iterator]() { + return this; + } +} + function valuesFrom( root: BNode, comparator: Comparator, @@ -151,38 +251,15 @@ function valuesFrom( if ( !inclusive && - i < leaf.keys.length && + lowestKey !== undefined && // +1 because we did -1 above. - comparator(leaf.keys[i + 1], lowestKey!) === 0 + i + 1 < leaf.keys.length && + comparator(leaf.keys[i + 1], lowestKey) === 0 ) { i++; } - return iterator(() => { - for (;;) { - if (++i < leaf.keys.length) { - return {done: false, value: leaf.keys[i]}; - } - - let level = -1; - for (;;) { - if (++level >= nodeQueue.length) { - return {done: true, value: undefined}; - } - if (++nodeIndex[level] < nodeQueue[level].length) { - break; - } - } - for (; level > 0; level--) { - nodeQueue[level - 1] = ( - nodeQueue[level][nodeIndex[level]] as BNodeInternal - ).children; - nodeIndex[level - 1] = 0; - } - leaf = nodeQueue[0][nodeIndex[0]]; - i = -1; - } - }); + return new BTreeForwardIterator(nodeQueue, nodeIndex, leaf, i); } function valuesFromReversed( @@ -214,32 +291,7 @@ function valuesFromReversed( i++; } - return iterator(() => { - for (;;) { - if (--i >= 0) { - return {done: false, value: leaf.keys[i]}; - } - - let level; - // Advance to the next leaf node - for (level = -1; ; ) { - if (++level >= nodeQueue.length) { - return {done: true, value: undefined}; - } - if (--nodeIndex[level] >= 0) { - break; - } - } - for (; level > 0; level--) { - nodeQueue[level - 1] = ( - nodeQueue[level][nodeIndex[level]] as BNodeInternal - ).children; - nodeIndex[level - 1] = nodeQueue[level - 1].length - 1; - } - leaf = nodeQueue[0][nodeIndex[0]]; - i = leaf.keys.length; - } - }); + return new BTreeReverseIterator(nodeQueue, nodeIndex, leaf, i); } function findPath( From 2d7abc3337747db7dd7a3903276d3585c469e58f Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Apr 2026 14:55:24 +0200 Subject: [PATCH 216/495] perf(zql): use smi for binarySearch result allocations (#5735) binarySearch was returning a new `{pos, found}` object on every call, contributing ~18% of CPU samples and ~18% GC overhead in profiles. Switch to Java-style integer encoding: returns the `index` >= 0 when found, or `~index` (`< 0`, i.e. the bitwise complement) for the insertion point when not found. All callers updated. Co-authored-by: Claude --- packages/zql/src/ivm/view-apply-change.ts | 57 ++++++++++++++--------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/packages/zql/src/ivm/view-apply-change.ts b/packages/zql/src/ivm/view-apply-change.ts index d88dbbe68d..19b4607c4a 100644 --- a/packages/zql/src/ivm/view-apply-change.ts +++ b/packages/zql/src/ivm/view-apply-change.ts @@ -142,7 +142,7 @@ export function applyChange( (parentEntry as Writable)[relationship] = newEntry; } } else { - newEntry = add( + newEntry = addToView( change.node.row, getChildEntryList(parentEntry, relationship), schema, @@ -204,13 +204,13 @@ export function applyChange( existing = getSingularEntry(parentEntry, relationship); } else { const view = getChildEntryList(parentEntry, relationship); - const {pos, found} = binarySearch( + const bsResult = binarySearch( view, change.node.row, schema.compareRows, ); - assert(found, 'node does not exist'); - existing = view[pos]; + assert(bsResult >= 0, 'node does not exist'); + existing = view[bsResult]; } const childSchema = must( @@ -238,18 +238,21 @@ export function applyChange( const view = getChildEntryList(parentEntry, relationship); // The position of the row in the list may have changed due to the edit. if (schema.compareRows(change.oldNode.row, change.node.row) !== 0) { - const {pos: oldPos, found: oldFound} = binarySearch( + const oldBsResult = binarySearch( view, change.oldNode.row, schema.compareRows, ); - assert(oldFound, 'old node does not exist'); + assert(oldBsResult >= 0, 'old node does not exist'); + const oldPos = oldBsResult; const oldEntry = view[oldPos]; - const {pos, found} = binarySearch( + const newBsResult = binarySearch( view, change.node.row, schema.compareRows, ); + const found = newBsResult >= 0; + const pos = found ? newBsResult : ~newBsResult; // A special case: // when refCount is 1 (so the row is being moved // without leaving a placeholder behind), and the new pos is @@ -294,13 +297,13 @@ export function applyChange( } } else { // Position could not have changed, so simply edit in place. - const {pos, found} = binarySearch( + const bsResult = binarySearch( view, change.oldNode.row, schema.compareRows, ); - assert(found, 'node does not exist'); - applyEdit(view[pos], change, schema, withIDs); + assert(bsResult >= 0, 'node does not exist'); + applyEdit(view[bsResult], change, schema, withIDs); } } @@ -323,18 +326,19 @@ function applyEdit( } } -function add( +function addToView( row: Row, view: MetaEntryList, schema: SourceSchema, withIDs: boolean, ): MetaEntry | undefined { - const {pos, found} = binarySearch(view, row, schema.compareRows); + const bsResult = binarySearch(view, row, schema.compareRows); - if (found) { - view[pos][refCountSymbol]++; + if (bsResult >= 0) { + view[bsResult][refCountSymbol]++; return undefined; } + const pos = ~bsResult; const newEntry = makeNewMetaEntry(row, schema, withIDs, 1); view.splice(pos, 0, newEntry); return newEntry; @@ -345,24 +349,33 @@ function removeAndUpdateRefCount( row: Row, compareRows: Comparator, ): MetaEntry { - const {pos, found} = binarySearch(view, row, compareRows); - assert(found, 'node does not exist'); - const oldEntry = view[pos]; + const bsResult = binarySearch(view, row, compareRows); + assert(bsResult >= 0, 'node does not exist'); + const oldEntry = view[bsResult]; const rc = oldEntry[refCountSymbol]; if (rc === 1) { - view.splice(pos, 1); + view.splice(bsResult, 1); } oldEntry[refCountSymbol]--; return oldEntry; } -// TODO: Do not return an object. It puts unnecessary pressure on the GC. +/** + * Binary search a sorted view. + * + * Returns the index of `target` if found (a non-negative integer), or + * `~insertionIndex` if not found (always negative, following Java's + * `Arrays.binarySearch` convention). To get the insertion index when + * not found use the bitwise NOT: `~result`. + * + * This avoids allocating a `{pos, found}` result object on every call. + */ function binarySearch( view: MetaEntryList, target: Row, comparator: Comparator, -) { +): number { let low = 0; let high = view.length - 1; while (low <= high) { @@ -373,10 +386,10 @@ function binarySearch( } else if (comparison > 0) { high = mid - 1; } else { - return {pos: mid, found: true}; + return mid; // found } } - return {pos: low, found: false}; + return ~low; // not found; use ~result to get insertion index } function getChildEntryList( From 409d46ba2efab6bd0fdcff1fe2c710b404e34ea3 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 15:39:04 +0200 Subject: [PATCH 217/495] =?UTF-8?q?fix(zero-cache):=20sharedSnapshot=20?= =?UTF-8?q?=E2=80=94=20only=20exporter=20worker=20flips=20firstWorkerDone?= =?UTF-8?q?=20(#5743)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `sharedSnapshot()` had a race where any worker's `cleanup` could flip `firstWorkerDone = true`, causing subsequently spawned workers to skip `SET TRANSACTION SNAPSHOT` and read a newer DB view. ## Root cause `cleanup` ran for every worker unconditionally. In a multi-worker pool, a non-exporter worker finishing early would set `firstWorkerDone = true` while new workers were still being spawned — those workers would then bypass snapshot isolation. ## Fix Track the exporting worker by storing its `lc` reference on first `init` call. Gate `firstWorkerDone` on identity: ```ts let exporterLc: LogContext | undefined; init: (tx, lc) => { if (!firstWorkerRun) { firstWorkerRun = true; exporterLc = lc; // pin the exporter's identity // ...export snapshot... } // ... }, cleanup: (_tx, lc) => { if (lc === exporterLc) { // only the exporter's cleanup disables snapshot-setting firstWorkerDone = true; } return []; }, ``` Each worker gets a unique `LogContext` instance via `this.#lc.withContext('tx', id)`, so reference equality is a reliable per-worker identity — no changes to `Task` signatures or `TransactionPool` internals required. ## Regression test Added `sharedSnapshot - non-exporter cleanup does not disable snapshot for new workers` in `transaction-pool.pg.test.ts`. The test deterministically triggers the race condition: 1. Pool with `initialWorkers=1` (exporter) and `maxWorkers=2`, with a 20ms idle timeout for extra workers 2. Two blocking tasks are queued — worker 1 (exporter) handles one, the pool expands to spawn worker 2 (non-exporter) for the other 3. Worker 2's task is released; it finishes, idles out after 20ms, and runs `cleanup` 4. After a 100ms sleep to guarantee cleanup has run, a third task is queued while worker 1 is still blocking — this causes the pool to spawn worker 3 5. All results must equal `[1, 2, 3]` (rows inserted before the snapshot), not the `[4, 5, 6]` inserted after Before the fix, step 3's cleanup set `firstWorkerDone = true`, so worker 3 skipped `SET TRANSACTION SNAPSHOT` and read all 6 rows. After the fix, only the exporter's cleanup flips the flag, so worker 3 correctly imports the snapshot.
Original prompt Create a pull request in `rocicorp/mono` to fix the flaky/failing Postgres test `packages/zero-cache/src/db/transaction-pool.pg.test.ts` (`sharedSnapshot`). ## Context GitHub Actions run/job: - Run: https://github.com/rocicorp/mono/actions/runs/23898640681 - Job: https://github.com/rocicorp/mono/actions/runs/23898640681/job/69689619009 - Failing test: `zero-cache/pg-15 src/db/transaction-pool.pg.test.ts > db/transaction-pool > sharedSnapshot` ## Suspected root cause `sharedSnapshot()` in `packages/zero-cache/src/db/transaction-pool.ts` uses module-local booleans `firstWorkerRun` and `firstWorkerDone`. `TransactionPool` runs the pool `cleanup` task for **every** worker when that worker is finishing. Today `sharedSnapshot().cleanup` sets `firstWorkerDone = true` unconditionally. In a pool with multiple workers, a non-exporter worker can finish early and call `cleanup`, flipping `firstWorkerDone` while there is still outstanding work and/or new workers may still be spawned. After that, newly spawned workers skip `SET TRANSACTION SNAPSHOT ...` and read a newer view, violating the test’s expectation that all workers share the same snapshot. ## Requirements 1. Fix `sharedSnapshot()` so that the "done" flag that disables snapshot-setting is only flipped when it is actually safe (i.e., when the snapshot-exporting transaction is done / snapshot no longer needed), and not when any worker happens to finish. 2. Keep semantics for other snapshot helpers (`synchronizedSnapshots`, `importSnapshot`) intact. 3. Add/adjust tests if needed to prevent regression. The existing `sharedSnapshot` test should pass deterministically on CI. 4. Prefer a robust fix over a heuristic one. If you need per-worker identity, thread a worker id through the Task/ReadTask runner plumbing (or otherwise reliably identify the exporter worker) and use it to ensure only the exporter worker’s cleanup flips the flag. 5. Ensure types remain correct and changes are minimal and well-justified. ## Files likely involved - `packages/zero-cache/src/db/transaction-pool.ts` - `packages/zero-cache/src/db/transaction-pool.pg.test.ts` ## Acceptance - `npm test` (or the repo’s CI test command) passes. - The failing CI job no longer reports `sharedSnapshot` failures. The following is the prior conversation context from the user's chat exploration (may be truncated): User: Please find a solution for this failing job. Use the logs, job definition, and any referenced files where the failure occurred. Keep your response focused on the solution and include code suggestions when appropriate. Assistant: The failing job is from workflow `.github/workflows/js.yml` at ref `828184520266a886610a5fd44c7d800d2b881934`, in the **PG test matrix** (log shows `zero-cache/pg-15`) and it fails exactly one test: - **Failing test:** `packages/zero-cache/src/db/transaction-pool.pg.test.ts > db/transaction-pool > sharedSnapshot` (see log snippet: `FAIL zero-cache/pg-15 src/db/transaction-pool.pg.test.ts > db/transaction-pool > sharedSnapshot`). ## Root cause `sharedSnapshot()` in `packages/zero-cache/src/db/transaction-pool.ts` uses two module-local booleans: - `firstWorkerRun` (who exports the snapshot) - `firstWorkerDone` (used to decide whether newly spawned workers should still `SET TRANSACTION SNAPSHOT ...`) Relevant code (ref `828184...`): - `sharedSnapshot().cleanup` sets `firstWorkerDone = true` unconditionally (`transaction-pool.ts` lines ~615-618). - `sharedSnapshot().init` skips `SET TRANSACTION SNAPSHOT` if `firstWorkerDone` is true (`transaction-pool.ts` lines ~606-613). In `TransactionPool`, **cleanup runs for every worker** (not just the “first” one) in the worker `finally` block (`transaction-pool.ts` lines ~213-218). That means a *non-first* worker can finish and run `cleanup()` early, flipping `firstWorkerDone = true` while the pool is still actively processing/adding workers. After that, any newly spawned worker will skip setting the snapshot and will see a newer DB state—exactly what the `sharedSnapshot` test is designed to catch (it expands the pool by queuing multiple read tasks after writes). So this is a concurrency bug in `sharedSnapshot()`’s “done” signaling: it’s currently “any worker finished” rather than “the exporting transaction is done / snapshot no longer needed”. ## Fix (code change) Make `firstWorkerDone` only flip to true when the **exporting worker’s** transaction is cleaning up (i.e., the one that set `firstWorkerRun = true`). The minimal safe change is to track which worker exported, and only let that worker’s cleanup disable snapshot-setting. Patch suggestion for `packages/zero-cache/src/db/transaction-pool.ts` (ref `828184520266a886610a5fd44c7d800d2b881934`), inside `sharedSnapshot()`: ```ts export function sharedSnapshot(): { init: Task; cleanup: Task; snapshotID: Promise; } { const { promise: snapshotExported, resolve: exportSnapshot, reject: failExport } = resolver(); let firstWorkerRun = fal...
*This pull request was created from Copilot chat.* > --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arv <45845+arv@users.noreply.github.com> Co-authored-by: Erik Arvidsson --- .../src/db/transaction-pool.pg.test.ts | 82 +++++++++++++++++++ .../zero-cache/src/db/transaction-pool.ts | 22 +++-- 2 files changed, 99 insertions(+), 5 deletions(-) diff --git a/packages/zero-cache/src/db/transaction-pool.pg.test.ts b/packages/zero-cache/src/db/transaction-pool.pg.test.ts index f469ce641f..f9b020bafe 100644 --- a/packages/zero-cache/src/db/transaction-pool.pg.test.ts +++ b/packages/zero-cache/src/db/transaction-pool.pg.test.ts @@ -889,6 +889,88 @@ describe('db/transaction-pool', () => { }); }); + // Regression test for the race condition where a non-exporter worker's cleanup + // ran before new workers were spawned, setting firstWorkerDone=true and causing + // those new workers to skip SET TRANSACTION SNAPSHOT. + test('sharedSnapshot - non-exporter cleanup does not disable snapshot for new workers', async () => { + await db` + INSERT INTO foo (id) VALUES (1); + INSERT INTO foo (id) VALUES (2); + INSERT INTO foo (id) VALUES (3); + `.simple(); + + const processing = new Queue(); + const canProceed = new Queue(); + + const {init, cleanup} = sharedSnapshot(); + // initialWorkers=1 (worker 1 is the exporter), maxWorkers=2. + // Extra workers (worker 2+) exit after a very short idle timeout so that + // we can deterministically observe their cleanup running before a new worker + // is spawned. + const pool = newTransactionPool(Mode.READONLY, init, cleanup, 1, 2, { + forInitialWorkers: TIMEOUT_TASKS.forInitialWorkers, + forExtraWorkers: {timeoutMs: 20, task: 'done' as const}, + }); + pool.run(db); + + const readTask = () => async (tx: postgres.TransactionSql) => { + processing.enqueue(true); + await canProceed.dequeue(); + return (await tx<{id: number}[]>`SELECT id FROM foo;`.values()).flat(); + }; + + // Queue 2 tasks immediately. Worker 1 (exporter, initial) handles the first; + // the pool expands to spawn Worker 2 (non-exporter, extra) for the second. + const batch1: Promise[] = []; + batch1.push(pool.processReadTask(readTask())); // task A → worker 1 + batch1.push(pool.processReadTask(readTask())); // task B → worker 2 + + // Wait for both workers to start their tasks. + await processing.dequeue(); + await processing.dequeue(); + + // Insert rows outside the snapshot. These must not be visible. + await db` + INSERT INTO foo (id) VALUES (4); + INSERT INTO foo (id) VALUES (5); + INSERT INTO foo (id) VALUES (6); + `.simple(); + + // Let task B (worker 2, non-exporter) finish while task A (worker 1) is + // still blocking. Worker 2 becomes idle and exits after its 20ms idle timeout, + // running its cleanup task. + canProceed.enqueue(true); + + // Give worker 2 time to hit the idle timeout and fully run its cleanup. + // With a 20ms timeout and ~100ms sleep this is a comfortable margin. + await sleep(100); + + // Worker 2 has now exited (#numWorkers decremented to 1). + // Queue task C while worker 1 is still blocking (#numWorking=1), so that + // the pool expands again and spawns Worker 3. + const batch2: Promise[] = []; + batch2.push(pool.processReadTask(readTask())); // task C → worker 3 + + // Wait for worker 3 to start. + await processing.dequeue(); + + // Release the remaining blocked tasks. + canProceed.enqueue(true); // worker 3 (task C) + canProceed.enqueue(true); // worker 1 (task A) + + const results = await Promise.all([...batch1, ...batch2]); + for (const result of results) { + // Before the fix, worker 2's cleanup set firstWorkerDone=true, causing + // worker 3 to skip SET TRANSACTION SNAPSHOT and see rows 4,5,6. + // After the fix, only the exporter (worker 1) flips firstWorkerDone, + // so worker 3 correctly imports the snapshot and sees only [1,2,3]. + expect(result).toEqual([1, 2, 3]); + } + + pool.setDone(); + await pool.done(); + }); + test('externally shared snapshot', async () => { const processing = new Queue(); const readTask = () => async (tx: postgres.TransactionSql) => { diff --git a/packages/zero-cache/src/db/transaction-pool.ts b/packages/zero-cache/src/db/transaction-pool.ts index ce8ad28d7f..dc7c06660b 100644 --- a/packages/zero-cache/src/db/transaction-pool.ts +++ b/packages/zero-cache/src/db/transaction-pool.ts @@ -589,15 +589,21 @@ export function sharedSnapshot(): { // exporting the snapshot. let firstWorkerRun = false; - // Set when any worker is done, signalling that all non-sentinel Tasks have been - // dequeued, and thus any subsequently spawned workers should skip their initTask - // since the snapshot is no longer needed (and soon to become invalid). + // The LogContext of the exporting worker, used to identify its cleanup call. + // Each worker receives a unique lc instance (via withContext('tx', id)), so + // reference equality reliably identifies the exporting worker. + let exporterLc: LogContext | undefined; + + // Set when the exporting worker's cleanup runs, signalling that the snapshot + // is no longer needed and any subsequently spawned workers should skip their + // initTask. let firstWorkerDone = false; return { init: (tx, lc) => { if (!firstWorkerRun) { firstWorkerRun = true; + exporterLc = lc; // Remember which worker is the exporter. const stmt = tx`SELECT pg_export_snapshot() AS snapshot;`.simple(); // Intercept the promise to propagate the information to `snapshotExported`. stmt.then(result => exportSnapshot(result[0].snapshot), failExport); @@ -612,8 +618,14 @@ export function sharedSnapshot(): { return []; }, - cleanup: () => { - firstWorkerDone = true; + cleanup: (_tx, lc) => { + // Only the exporting worker's cleanup should disable snapshot-setting. + // Non-exporter workers may finish early; letting them flip this flag + // would cause subsequently spawned workers to skip SET TRANSACTION SNAPSHOT + // and read a newer database view, violating snapshot isolation. + if (lc === exporterLc) { + firstWorkerDone = true; + } return []; }, From 8bd16099f1cb357f97b896cc06f0d0b933207673 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Apr 2026 15:40:46 +0200 Subject: [PATCH 218/495] fix(zero-cache): Fix timestamp handling for BC dates, large years (#5720) The old timestamp parser used string index manipulation (lastIndexOf, indexOf) to split the timezone offset from the timestamp. This broke on BC dates like "0044-03-15 12:00:00 BC" because the parser couldn't reliably find the timezone delimiter among the year's hyphens. It also couldn't handle years outside 0-9999. Replace ad-hoc string splitting with a single regexp for timestamp parsing, with proper BC year conversion and ISO 8601 expanded year format for years outside 0-9999 Fixes https://bugs.rocicorp.dev/p/zero/issue/246638 --------- Co-authored-by: Matt Wonlaw --- packages/z2s/src/sql.pg.test.ts | 43 ++++++++++++++++++ packages/zero-cache/src/types/pg.test.ts | 54 +++++++++++++++++++++- packages/zero-cache/src/types/pg.ts | 58 +++++++++++++++--------- 3 files changed, 133 insertions(+), 22 deletions(-) diff --git a/packages/z2s/src/sql.pg.test.ts b/packages/z2s/src/sql.pg.test.ts index f834208e36..425ed57d0e 100644 --- a/packages/z2s/src/sql.pg.test.ts +++ b/packages/z2s/src/sql.pg.test.ts @@ -204,6 +204,49 @@ describe('SQL builder with PostgreSQL', () => { }, ); + test.each([ + // 0001-01-01 00:00:00 BC (year 0 in proleptic Gregorian / JS) + {type: 'timestamp', value: -62167219200000}, + {type: 'timestamptz', value: -62167219200000}, + // 0044-03-15 00:00:00 BC (44 BC, year -43 in JS) + {type: 'timestamp', value: -63492537600000}, + {type: 'timestamptz', value: -63492537600000}, + ] as const)( + 'numeric $type with BC date ($value) round-trips correctly', + async ({type, value}) => { + await using pg = await testDBs.create( + `${DB_NAME}_${type}_bc`, + undefined, + {}, + ); + + const table = `round_trip_${type}_bc`; + await pg.unsafe(` + SET TIME ZONE 'UTC'; + DROP TABLE IF EXISTS "${table}"; + CREATE TABLE "${table}" ( + value ${type.toUpperCase()} NOT NULL + ); + `); + + const insertStmt = formatPgInternalConvert(sql` + INSERT INTO ${sql.ident(table)} (value) + VALUES (${sqlConvertArg(type, value)}) + `); + await pg.unsafe(insertStmt.text, insertStmt.values as JSONValue[]); + + const selectStmt = formatPgInternalConvert(sql` + SELECT value FROM ${sql.ident(table)} + WHERE value = ${sqlConvertArg(type, value, singularComparison)} + `); + const result = await pg.unsafe( + selectStmt.text, + selectStmt.values as JSONValue[], + ); + expect(result).toHaveLength(1); + }, + ); + test.each([ {type: 'time', value: 32887654}, {type: 'timetz', value: 32887654}, diff --git a/packages/zero-cache/src/types/pg.test.ts b/packages/zero-cache/src/types/pg.test.ts index 9726f3bde5..b6911abf8c 100644 --- a/packages/zero-cache/src/types/pg.test.ts +++ b/packages/zero-cache/src/types/pg.test.ts @@ -22,9 +22,61 @@ describe('timestampToFpMillis', () => { ['2024-12-05 16:38:21.907-05', 1733434701907], ['2024-12-05 16:38:21.907-05:30', 1733436501907], ])('parse timestamp: %s', (timestamp, result) => { - // expect(new PreciseDate(timestamp).getTime()).toBe(Math.floor(result)); expect(timestampToFpMillis(timestamp)).toBe(result); }); + + test.each([ + // No fractional seconds + ['2024-01-15 12:00:00', 1705320000000], + ['2024-01-15 12:00:00+00', 1705320000000], + + // Whole milliseconds only + ['2024-01-15 12:00:00.5', 1705320000500], + ['2024-01-15 12:00:00.123', 1705320000123], + ])('parse timestamp without microseconds: %s', (timestamp, result) => { + expect(timestampToFpMillis(timestamp)).toBe(result); + }); + + test.each([ + // 1 BC = year 0 in JS + ['0001-06-15 12:00:00 BC', new Date('0000-06-15T12:00:00Z').getTime()], + // 2 BC = year -1 + ['0002-06-15 12:00:00 BC', new Date('-000001-06-15T12:00:00Z').getTime()], + // BC with timezone + ['0001-01-01 00:00:00+00 BC', new Date('0000-01-01T00:00:00Z').getTime()], + ])('parse BC timestamp: %s', (timestamp, result) => { + expect(timestampToFpMillis(timestamp)).toBe(result); + }); + + test.each([ + // Year > 9999 uses expanded year format + ['10000-01-01 00:00:00', new Date('+010000-01-01T00:00:00Z').getTime()], + ['99999-06-15 12:00:00', new Date('+099999-06-15T12:00:00Z').getTime()], + ])('parse large year timestamp: %s', (timestamp, result) => { + expect(timestampToFpMillis(timestamp)).toBe(result); + }); + + test.each([ + // Negative timezone offsets + ['2024-01-15 12:00:00-05', 1705338000000], + ['2024-01-15 12:00:00-05:30', 1705339800000], + // Positive timezone offsets + ['2024-01-15 12:00:00+05', 1705302000000], + ['2024-01-15 12:00:00+05:30', 1705300200000], + // Single digit tz hour + ['2024-01-15 12:00:00+5', 1705302000000], + ['2024-01-15 12:00:00-5', 1705338000000], + ])('parse timestamp with timezone offset: %s', (timestamp, result) => { + expect(timestampToFpMillis(timestamp)).toBe(result); + }); + + test('throws on invalid timestamp', () => { + expect(() => timestampToFpMillis('not a timestamp')).toThrow( + 'Error parsing not a timestamp', + ); + expect(() => timestampToFpMillis('')).toThrow('Error parsing '); + expect(() => timestampToFpMillis('2024-13-40 99:99:99')).toThrow(); + }); }); describe('millisecondsToPostgresTime', () => { diff --git a/packages/zero-cache/src/types/pg.ts b/packages/zero-cache/src/types/pg.ts index ffcfeafd1d..e2d2a7f8b0 100644 --- a/packages/zero-cache/src/types/pg.ts +++ b/packages/zero-cache/src/types/pg.ts @@ -15,38 +15,54 @@ import { TIMETZ, } from './pg-types.ts'; +// Matches: YEAR-MM-DD HH:MM:SS[.fraction][+-TZ[:MM]][ BC] +const pgTimestampRe = + /^(\d+)-(\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}(?:\.\d+)?)([+-]\d{1,2}(?::\d{2})?)?(?: BC)?$/; + // exported for testing. export function timestampToFpMillis(timestamp: string): number { - // Convert from PG's time string, e.g. "1999-01-08 12:05:06+00" to "Z" - // format expected by PreciseDate. - timestamp = timestamp.replace(' ', 'T'); - const positiveOffset = timestamp.includes('+'); - const tzSplitIndex = positiveOffset - ? timestamp.lastIndexOf('+') - : timestamp.indexOf('-', timestamp.indexOf('T')); - const timezoneOffset = - tzSplitIndex === -1 ? undefined : timestamp.substring(tzSplitIndex); - const tsWithoutTimezone = - (tzSplitIndex === -1 ? timestamp : timestamp.substring(0, tzSplitIndex)) + - 'Z'; + const match = timestamp.match(pgTimestampRe); + if (!match) { + throw new Error(`Error parsing ${timestamp}`); + } + + const [, yearStr, monthDay, time, tz] = match; + const bc = timestamp.endsWith(' BC'); + + let year = Number(yearStr); + if (bc) { + // Postgres: 1 BC = JS year 0, 2 BC = JS year -1, N BC = -(N-1) + year = -(year - 1); + } + + // Format year as ISO 8601 expanded year if needed. + // https://tc39.es/ecma262/#sec-expanded-years + let isoYear: string; + if (year >= 0 && year <= 9999) { + isoYear = String(year).padStart(4, '0'); + } else if (year >= 0) { + isoYear = '+' + String(year).padStart(6, '0'); + } else { + isoYear = '-' + String(Math.abs(year)).padStart(6, '0'); + } + + // Build a UTC ISO string so PreciseDate returns microsecond precision. + const utcString = `${isoYear}-${monthDay}T${time}Z`; try { - // PreciseDate does not return microsecond precision unless the provided - // timestamp is in UTC time so we need to add the timezone offset back in. - const fullTime = new PreciseDate(tsWithoutTimezone).getFullTime(); + const fullTime = new PreciseDate(utcString).getFullTime(); const millis = Number(fullTime / 1_000_000n); const nanos = Number(fullTime % 1_000_000n); const ret = millis + nanos * 1e-6; // floating point milliseconds - // add back in the timezone offset - if (timezoneOffset) { - const [hours, minutes] = timezoneOffset.split(':'); + // Add back in the timezone offset. We passed local time as UTC, + // so a positive offset means we need to subtract, and vice versa. + if (tz) { + const positiveOffset = tz.startsWith('+'); + const [hours, minutes] = tz.split(':'); const offset = Math.abs(Number(hours)) * 60 + (minutes ? Number(minutes) : 0); const offsetMillis = offset * 60 * 1_000; - // If it is a positive offset, we subtract the offset from the UTC - // because we passed in the "local time" as if it was UTC. - // The opposite is true for negative offsets. return positiveOffset ? ret - offsetMillis : ret + offsetMillis; } return ret; From 3de28a8070f7444a6669d6c99c6ed086f149bb87 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Apr 2026 22:09:24 +0200 Subject: [PATCH 219/495] chore(tooling): replace prettier with oxfmt (#5745) Migrates all formatting tooling from prettier to oxfmt (the oxc project formatter), which is a drop-in prettier-compatible replacement written in Rust that is 30x faster. - Generate .oxfmtrc.json from .prettierrc via `oxfmt --migrate prettier` - Remove .prettierrc and inline prettier config from prod/package.json - Update all package.json format/check-format scripts to use oxfmt - Replace prettier devDependency with oxfmt in root and workspace packages - Update packages/ast-to-zql/src/format.ts to use oxfmt programmatic API - Reformat all files with oxfmt --------- Co-authored-by: Claude --- .github/workflows/js.yml | 15 +- .oxfmtrc.json | 30 ++ .prettierrc | 7 - .vscode/extensions.json | 3 + AGENTS.md | 2 +- CLAUDE.md | 2 +- CODE_OF_CONDUCT.md | 22 +- apps/otel-proxy/package.json | 4 +- apps/zbugs/package.json | 5 +- apps/zql-viz/index.html | 22 +- apps/zql-viz/tsdoc-metadata.json | 22 +- oxlint.config.ts | 6 +- package-lock.json | 373 +++++++++++++++++- package.json | 6 +- packages/analyze-query/package.json | 4 +- packages/ast-to-zql/package.json | 6 +- packages/ast-to-zql/src/format.ts | 9 +- packages/datadog/package.json | 4 +- packages/datadog/src/datadog-log-sink.test.ts | 10 +- packages/otel/package.json | 4 +- packages/replicache-doc/docs/howto/launch.md | 1 - packages/replicache-perf/package.json | 4 +- packages/replicache/package.json | 4 +- packages/shared/package.json | 4 +- packages/z2s/package.json | 4 +- packages/zero-cache/package.json | 4 +- .../src/auth/write-authorizer.test.ts | 6 +- .../src/integration/integration.pg.test.ts | 72 ++-- .../custom/change-source.test.ts | 2 +- .../change-source/pg/change-source.pg.test.ts | 5 +- .../change-source/pg/change-source.ts | 5 +- .../change-source/pg/initial-sync.pg.test.ts | 74 ++-- .../change-source/pg/sync-schema.pg.test.ts | 2 +- .../src/services/change-streamer/storer.ts | 5 +- .../replicator/change-processor.test.ts | 58 +-- .../replicator/incremental-sync.test.ts | 2 +- .../services/view-syncer/snapshotter.test.ts | 14 +- packages/zero-client/package.json | 4 +- packages/zero-events/package.json | 4 +- packages/zero-pg/package.json | 4 +- packages/zero-protocol/package.json | 4 +- packages/zero-react-native/package.json | 4 +- packages/zero-react/package.json | 4 +- packages/zero-schema/package.json | 4 +- packages/zero-server/package.json | 4 +- packages/zero-solid/package.json | 4 +- packages/zero-types/package.json | 4 +- packages/zero/package.json | 5 +- packages/zql-benchmarks/package.json | 4 +- packages/zql-integration-tests/package.json | 4 +- packages/zql/package.json | 4 +- packages/zql/src/query/query.ts | 3 +- packages/zqlite-zql-test/package.json | 4 +- packages/zqlite/package.json | 4 +- prod/functions/package.json | 4 +- prod/package.json | 26 +- prod/sst/package.json | 4 +- tools/client-simulator/package.json | 4 +- tools/load-generator/package.json | 4 +- tools/process-tracker/package.json | 4 +- tools/sqlite-io-yield-simulator/package.json | 4 +- tools/verify-package-deps/package.json | 4 +- turbo.json | 7 - 63 files changed, 633 insertions(+), 318 deletions(-) create mode 100644 .oxfmtrc.json delete mode 100644 .prettierrc create mode 100644 .vscode/extensions.json diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index 4ecb9480d9..9ebca1ef0f 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -37,7 +37,7 @@ jobs: - run: npm run verify-deps format: - name: Prettier + name: Oxfmt runs-on: ubuntu-latest needs: [syncpack, verify-deps] env: @@ -49,11 +49,7 @@ jobs: with: node-version: 24.x cache: 'npm' - - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - run: bun install - - run: bun run check-format + - run: npx oxfmt --check lint: name: Lint @@ -68,11 +64,8 @@ jobs: with: node-version: 24.x cache: 'npm' - - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - run: bun install - - run: bun run lint + - run: npm ci + - run: npm run lint check-types: name: Check Types diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000000..c471262215 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,30 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "arrowParens": "avoid", + "bracketSpacing": false, + "quoteProps": "consistent", + "printWidth": 80, + "sortPackageJson": false, + "ignorePatterns": [ + "node_modules", + "dist", + "lib", + "*.log", + "packages/replicache/out", + "packages/replicache/doc/build/", + "packages/replicache/doc/docs/api", + "packages/replicache/doc/.docusaurus/", + "**/.next", + "**/.vercel", + "*.tsbuildinfo", + "renderer", + "vendor", + "!/renderer/src/constants.ts", + "**/bot-recordings.ts", + ".sst", + "prod/sst/sst-env.d.ts", + "apps/zbugs/public/um.js", + "apps/zbugs/db/migrations/" + ] +} diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 8eefecaa40..0000000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "arrowParens": "avoid", - "bracketSpacing": false, - "quoteProps": "consistent" -} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..99e2f7ddf7 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["oxc.oxc-vscode"] +} diff --git a/AGENTS.md b/AGENTS.md index df243ae629..38757a6555 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -43,7 +43,7 @@ npm run test:watch # Watch mode # Type checking and linting npm run check-types # TypeScript across all packages npm run lint # oxlint with type-awareness -npm run format # Prettier formatting +npm run format # oxfmt formatting ``` **Always run `lint`, `format` and `check-types` after every change.** diff --git a/CLAUDE.md b/CLAUDE.md index eef4bd20cf..43c994c2d3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1 +1 @@ -@AGENTS.md \ No newline at end of file +@AGENTS.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index e1c56c7d5f..d36b5b8333 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -17,23 +17,23 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the +- Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or +- The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities @@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an +standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within diff --git a/apps/otel-proxy/package.json b/apps/otel-proxy/package.json index 06b97b1616..cd1329e5e5 100644 --- a/apps/otel-proxy/package.json +++ b/apps/otel-proxy/package.json @@ -9,8 +9,8 @@ "test": "vitest run", "test:watch": "vitest", "lint": "oxlint --type-aware .", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc --noEmit" }, "dependencies": { diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index ce824a05d3..fa817f1ebd 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -17,8 +17,8 @@ "generate-synthetic": "NODE_OPTIONS='--max-old-space-size=8192' tsx scripts/generate-synthetic.ts", "db-seed-synthetic": "ZERO_SEED_DATA_DIR=db/seed-data/synthetic tsx scripts/seed.ts", "clean": "cd docker && docker compose down && docker volume rm docker_zbugs_pgdata_sync && docker volume rm docker_zbugs_pgdata_upstream && rm -rf /tmp/zbugs-sync-replica.db*", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt --config ../../.oxfmtrc.json .", + "check-format": "oxfmt --config ../../.oxfmtrc.json --check .", "lint": "oxlint --quiet -c ../../oxlint.config.ts src/", "preview": "vite preview", "zero": "tsx --trace-warnings ../../packages/zero-cache/src/server/runner/main.ts", @@ -84,7 +84,6 @@ "drizzle-kit": "^0.31.10", "drizzle-orm": "^0.45.1", "postcss-preset-env": "^7.4.3", - "prettier": "^3.8.1", "rehype-video": "^2.3.0", "shared": "0.0.0", "tailwindcss": "^3.0.23", diff --git a/apps/zql-viz/index.html b/apps/zql-viz/index.html index d5fc485613..417144bb82 100644 --- a/apps/zql-viz/index.html +++ b/apps/zql-viz/index.html @@ -1,15 +1,13 @@ + + + + ZQL Viz + - - - - ZQL Viz - - - -
- - - - \ No newline at end of file + +
+ + + diff --git a/apps/zql-viz/tsdoc-metadata.json b/apps/zql-viz/tsdoc-metadata.json index 4a2607d3b9..d95757eac5 100644 --- a/apps/zql-viz/tsdoc-metadata.json +++ b/apps/zql-viz/tsdoc-metadata.json @@ -1,11 +1,11 @@ -// This file is read by tools that parse documentation comments conforming to the TSDoc standard. -// It should be published with your NPM package. It should not be tracked by Git. -{ - "tsdocVersion": "0.12", - "toolPackages": [ - { - "packageName": "@microsoft/api-extractor", - "packageVersion": "7.52.13" - } - ] -} +// This file is read by tools that parse documentation comments conforming to the TSDoc standard. +// It should be published with your NPM package. It should not be tracked by Git. +{ + "tsdocVersion": "0.12", + "toolPackages": [ + { + "packageName": "@microsoft/api-extractor", + "packageVersion": "7.52.13" + } + ] +} diff --git a/oxlint.config.ts b/oxlint.config.ts index 9eab6c1867..afd9582eae 100644 --- a/oxlint.config.ts +++ b/oxlint.config.ts @@ -1,10 +1,10 @@ -import { defineConfig } from 'oxlint'; -import { baseConfig } from './oxlint.base.ts'; +import {defineConfig} from 'oxlint'; +import {baseConfig} from './oxlint.base.ts'; export default defineConfig({ ...baseConfig, options: { reportUnusedDisableDirectives: 'error', - typeAware: true + typeAware: true, }, }); diff --git a/package-lock.json b/package-lock.json index f0db1e8dfa..52c69215da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,9 +18,9 @@ "@vitest/coverage-v8": "4.1.2", "@vitest/runner": "4.1.2", "baseline-browser-mapping": "^2.10.11", + "oxfmt": "^0.43.0", "oxlint": "^1.57.0", "oxlint-tsgolint": "^0.17.4", - "prettier": "^3.8.1", "syncpack": "^14.2.1", "tsx": "^4.21.0", "turbo": "^2.4.4", @@ -94,7 +94,6 @@ "drizzle-kit": "^0.31.10", "drizzle-orm": "^0.45.1", "postcss-preset-env": "^7.4.3", - "prettier": "^3.8.1", "rehype-video": "^2.3.0", "shared": "0.0.0", "tailwindcss": "^3.0.23", @@ -12282,6 +12281,310 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.43.0.tgz", + "integrity": "sha512-CgU2s+/9hHZgo0IxVxrbMPrMj+tJ6VM3mD7Mr/4oiz4FNTISLoCvRmB5nk4wAAle045RtRjd86m673jwPyb1OQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.43.0.tgz", + "integrity": "sha512-T9OfRwjA/EdYxAqbvR7TtqLv5nIrwPXuCtTwOHtS7aR9uXyn74ZYgzgTo6/ZwvTq9DY4W+DsV09hB2EXgn9EbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.43.0.tgz", + "integrity": "sha512-o3i49ZUSJWANzXMAAVY1wnqb65hn4JVzwlRQ5qfcwhRzIA8lGVaud31Q3by5ALHPrksp5QEaKCQF9aAS3TXpZA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.43.0.tgz", + "integrity": "sha512-vWECzzCFkb0kK6jaHjbtC5sC3adiNWtqawFCxhpvsWlzVeKmv5bNvkB4nux+o4JKWTpHCM57NDK/MeXt44txmA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.43.0.tgz", + "integrity": "sha512-rgz8JpkKiI/umOf7fl9gwKyQasC8bs5SYHy6g7e4SunfLBY3+8ATcD5caIg8KLGEtKFm5ujKaH8EfjcmnhzTLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.43.0.tgz", + "integrity": "sha512-nWYnF3vIFzT4OM1qL/HSf1Yuj96aBuKWSaObXHSWliwAk2rcj7AWd6Lf7jowEBQMo4wCZVnueIGw/7C4u0KTBQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.43.0.tgz", + "integrity": "sha512-sFg+NWJbLfupYTF4WELHAPSnLPOn1jiDZ33Z1jfDnTaA+cC3iB35x0FMMZTFdFOz3icRIArncwCcemJFGXu6TQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.43.0.tgz", + "integrity": "sha512-MelWqv68tX6wZEILDrTc9yewiGXe7im62+5x0bNXlCYFOZdA+VnYiJfAihbROsZ5fm90p9C3haFrqjj43XnlAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.43.0.tgz", + "integrity": "sha512-ROaWfYh+6BSJ1Arwy5ujijTlwnZetxDxzBpDc1oBR4d7rfrPBqzeyjd5WOudowzQUgyavl2wEpzn1hw3jWcqLA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.43.0.tgz", + "integrity": "sha512-PJRs/uNxmFipJJ8+SyKHh7Y7VZIKQicqrrBzvfyM5CtKi8D7yZKTwUOZV3ffxmiC2e7l1SDJpkBEOyue5NAFsg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.43.0.tgz", + "integrity": "sha512-j6biGAgzIhj+EtHXlbNumvwG7XqOIdiU4KgIWRXAEj/iUbHKukKW8eXa4MIwpQwW1YkxovduKtzEAPnjlnAhVQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.43.0.tgz", + "integrity": "sha512-RYWxAcslKxvy7yri24Xm9cmD0RiANaiEPs007EFG6l9h1ChM69Q5SOzACaCoz4Z9dEplnhhneeBaTWMEdpgIbA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.43.0.tgz", + "integrity": "sha512-DT6Q8zfQQy3jxpezAsBACEHNUUixKSYTwdXeXojNHe4DQOoxjPdjr3Szu6BRNjxLykZM/xMNmp9ElOIyDppwtw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.43.0.tgz", + "integrity": "sha512-R8Yk7iYcuZORXmCfFZClqbDxRZgZ9/HEidUuBNdoX8Ptx07cMePnMVJ/woB84lFIDjh2ROHVaOP40Ds3rBXFqg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.43.0.tgz", + "integrity": "sha512-F2YYqyvnQNvi320RWZNAvsaWEHwmW3k4OwNJ1hZxRKXupY63expbBaNp6jAgvYs7y/g546vuQnGHQuCBhslhLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.43.0.tgz", + "integrity": "sha512-OE6TdietLXV3F6c7pNIhx/9YC1/2YFwjU9DPc/fbjxIX19hNIaP1rS0cFjCGJlGX+cVJwIKWe8Mos+LdQ1yAJw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.43.0.tgz", + "integrity": "sha512-0nWK6a7pGkbdoypfVicmV9k/N1FwjPZENoqhlTU+5HhZnAhpIO3za30nEE33u6l6tuy9OVfpdXUqxUgZ+4lbZw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.43.0.tgz", + "integrity": "sha512-9aokTR4Ft+tRdvgN/pKzSkVy2ksc4/dCpDm9L/xFrbIw0yhLtASLbvoG/5WOTUh/BRPPnfGTsWznEqv0dlOmhA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.43.0.tgz", + "integrity": "sha512-4bPgdQux2ZLWn3bf2TTXXMHcJB4lenmuxrLqygPmvCJ104Yqzj1UctxSRzR31TiJ4MLaG22RK8dUsVpJtrCz5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@oxlint-tsgolint/darwin-arm64": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.17.4.tgz", @@ -29525,6 +29828,54 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/oxfmt": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.43.0.tgz", + "integrity": "sha512-KTYNG5ISfHSdmeZ25Xzb3qgz9EmQvkaGAxgBY/p38+ZiAet3uZeu7FnMwcSQJg152Qwl0wnYAxDc+Z/H6cvrwA==", + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.43.0", + "@oxfmt/binding-android-arm64": "0.43.0", + "@oxfmt/binding-darwin-arm64": "0.43.0", + "@oxfmt/binding-darwin-x64": "0.43.0", + "@oxfmt/binding-freebsd-x64": "0.43.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.43.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.43.0", + "@oxfmt/binding-linux-arm64-gnu": "0.43.0", + "@oxfmt/binding-linux-arm64-musl": "0.43.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.43.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.43.0", + "@oxfmt/binding-linux-riscv64-musl": "0.43.0", + "@oxfmt/binding-linux-s390x-gnu": "0.43.0", + "@oxfmt/binding-linux-x64-gnu": "0.43.0", + "@oxfmt/binding-linux-x64-musl": "0.43.0", + "@oxfmt/binding-openharmony-arm64": "0.43.0", + "@oxfmt/binding-win32-arm64-msvc": "0.43.0", + "@oxfmt/binding-win32-ia32-msvc": "0.43.0", + "@oxfmt/binding-win32-x64-msvc": "0.43.0" + } + }, + "node_modules/oxfmt/node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, "node_modules/oxlint": { "version": "1.57.0", "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.57.0.tgz", @@ -31800,21 +32151,6 @@ "node": ">=10" } }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -38183,7 +38519,7 @@ "packages/ast-to-zql": { "version": "0.0.0", "dependencies": { - "prettier": "^3.8.1" + "oxfmt": "^0.43.0" }, "devDependencies": { "@faker-js/faker": "^9.6.0", @@ -38809,7 +39145,6 @@ "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", - "prettier": "^3.8.1", "semver": "^7.5.4", "tsx": "^4.21.0", "url-pattern": "^1.0.3", diff --git a/package.json b/package.json index 236afe57de..94b850b105 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ "test": "vitest run", "test:watch": "vitest", "lint": "oxlint --quiet", - "format": "npx turbo run format", - "check-format": "npx turbo run check-format", + "format": "oxfmt", + "check-format": "oxfmt --check", "check-types": "npx turbo run check-types", "check-types:watch": "npx turbo watch check-types", "build-ci": "npm install && npx turbo run build", @@ -37,9 +37,9 @@ "@vitest/coverage-v8": "4.1.2", "@vitest/runner": "4.1.2", "baseline-browser-mapping": "^2.10.11", + "oxfmt": "^0.43.0", "oxlint": "^1.57.0", "oxlint-tsgolint": "^0.17.4", - "prettier": "^3.8.1", "syncpack": "^14.2.1", "tsx": "^4.21.0", "turbo": "^2.4.4", diff --git a/packages/analyze-query/package.json b/packages/analyze-query/package.json index d365a76997..070da110a0 100644 --- a/packages/analyze-query/package.json +++ b/packages/analyze-query/package.json @@ -8,8 +8,8 @@ "test:watch": "vitest", "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --type-aware src/" }, "dependencies": { diff --git a/packages/ast-to-zql/package.json b/packages/ast-to-zql/package.json index 4f8ecba44e..77b6db310d 100644 --- a/packages/ast-to-zql/package.json +++ b/packages/ast-to-zql/package.json @@ -6,14 +6,14 @@ "scripts": { "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:watch": "vitest" }, "dependencies": { - "prettier": "^3.8.1" + "oxfmt": "^0.43.0" }, "devDependencies": { "@faker-js/faker": "^9.6.0", diff --git a/packages/ast-to-zql/src/format.ts b/packages/ast-to-zql/src/format.ts index 10a6fa08d1..e7d0c8637c 100644 --- a/packages/ast-to-zql/src/format.ts +++ b/packages/ast-to-zql/src/format.ts @@ -1,14 +1,15 @@ -import {format} from 'prettier'; +import {format} from 'oxfmt'; export async function formatOutput(content: string): Promise { try { - return await format(content, { - parser: 'typescript', + const result = await format('output.ts', content, { semi: false, + printWidth: 80, }); + return result.code; } catch (error) { // oxlint-disable-next-line no-console - console.warn('Warning: Unable to format output with prettier:', error); + console.warn('Warning: Unable to format output with oxfmt:', error); return content; } } diff --git a/packages/datadog/package.json b/packages/datadog/package.json index 83325b6e14..437d6c6608 100644 --- a/packages/datadog/package.json +++ b/packages/datadog/package.json @@ -16,8 +16,8 @@ "test:watch": "vitest", "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --type-aware src/" } } diff --git a/packages/datadog/src/datadog-log-sink.test.ts b/packages/datadog/src/datadog-log-sink.test.ts index 894b500328..d54884c573 100644 --- a/packages/datadog/src/datadog-log-sink.test.ts +++ b/packages/datadog/src/datadog-log-sink.test.ts @@ -390,7 +390,7 @@ test('reserved keys are prefixed', async () => { 'https://http-intake.logs.datadoghq.com/api/v2/logs?dd-api-key=apiKey', { body: stringifyMany({ - usr: {name: 'bob'}, + 'usr': {name: 'bob'}, ['@DATADOG_RESERVED_host']: 'testHost', ['@DATADOG_RESERVED_source']: 'testSource', ['@DATADOG_RESERVED_status']: 'testStatus', @@ -402,10 +402,10 @@ test('reserved keys are prefixed', async () => { ['@DATADOG_RESERVED_date']: 'test-date', ['@DATADOG_RESERVED_flushDelayMs']: 'test-flushDelayMs', ['@DATADOG_RESERVED_flushRetryCount']: 'test-flushRetryCount', - date: 1, - message: 'debug message', - status: 'debug', - flushDelayMs: 9, + 'date': 1, + 'message': 'debug message', + 'status': 'debug', + 'flushDelayMs': 9, }), method: 'POST', keepalive: true, diff --git a/packages/otel/package.json b/packages/otel/package.json index e970aabcee..623b71fab3 100644 --- a/packages/otel/package.json +++ b/packages/otel/package.json @@ -6,8 +6,8 @@ "scripts": { "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { diff --git a/packages/replicache-doc/docs/howto/launch.md b/packages/replicache-doc/docs/howto/launch.md index c8f55fd6e7..3e861d8b4c 100644 --- a/packages/replicache-doc/docs/howto/launch.md +++ b/packages/replicache-doc/docs/howto/launch.md @@ -45,7 +45,6 @@ Before you launch with Replicache in your product, it's a good idea to double-ch - Your endpoints should return HTTP 401 to indicate that the user's authentication token is invalid (e.g., non-existent or expired), and that the app should re-authenticate them. - **Ensure that the `clientID` passed in does in fact belong to the authenticated user.** Client IDs are random and cryptographically strong, but it is best to be safe. Note that the Replicache sample apps do not have a notion of a _user_, so they are missing the prudent step of associating the `clientID` with a user on the server and ensuring that the authenticated user is associated with the `clientID` that is passed in to the `Push` endpoint. If the `clientID` from one user is visible to others then you _must_ do this authentication, else one user could push mutations on behalf of another user. - It is extremely important to ensure that your datastore and/or the way you use it guarantees the consistency and isolation properties required for Replicache to work as designed. These properties are: - - the effects of a transaction are revealed atomically - within a transaction, reads are consistent, ie, reading the same item twice always results in the same value, unless changed within the transaction - a transaction sees the effects of all previously committed transactions diff --git a/packages/replicache-perf/package.json b/packages/replicache-perf/package.json index 6e43266826..ff1b45d73c 100644 --- a/packages/replicache-perf/package.json +++ b/packages/replicache-perf/package.json @@ -2,8 +2,8 @@ "name": "replicache-perf", "private": true, "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "lint": "oxlint --type-aware src/", diff --git a/packages/replicache/package.json b/packages/replicache/package.json index 641d56b628..888bd38435 100644 --- a/packages/replicache/package.json +++ b/packages/replicache/package.json @@ -24,8 +24,8 @@ "test:webkit:watch": "VITEST_BROWSER=webkit vitest --config vitest.config.web.ts", "bench": "vitest bench --run", "bench:watch": "vitest bench --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc -p tsconfig.json && tsc -p tsconfig.build.json && tsc -p tool/tsconfig.json", "check-types:watch": "tsc -p tsconfig.json --watch", "check-types:build:watch": "tsc -p tsconfig.build.json --watch", diff --git a/packages/shared/package.json b/packages/shared/package.json index da374508fa..0daa21bf1b 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -17,8 +17,8 @@ "bench:bmf:silent": "npm run bench:bmf --silent", "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --type-aware src/" }, "dependencies": { diff --git a/packages/z2s/package.json b/packages/z2s/package.json index 48e16b7292..80b45f8fc4 100644 --- a/packages/z2s/package.json +++ b/packages/z2s/package.json @@ -5,8 +5,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "lint": "oxlint --type-aware src/", diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index a221759361..e7714ea579 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -16,8 +16,8 @@ "test:no-pg:watch": "vitest --project='*no-pg*'", "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts", "bench": "vitest run --config vitest.config.bench.ts", "bench:bmf": "BENCH_OUTPUT_FORMAT=json npm run bench 2>&1 | npx tsx ../shared/src/tool/mitata-json-to-bmf.ts", diff --git a/packages/zero-cache/src/auth/write-authorizer.test.ts b/packages/zero-cache/src/auth/write-authorizer.test.ts index 6e4b735272..57ec863b2c 100644 --- a/packages/zero-cache/src/auth/write-authorizer.test.ts +++ b/packages/zero-cache/src/auth/write-authorizer.test.ts @@ -71,10 +71,8 @@ beforeEach(() => { function setPermissions(permissions: PermissionsConfig) { const json = JSON.stringify(permissions); replica - .prepare( - /* sql */ ` - UPDATE "the_app.permissions" SET permissions = ?, hash = ?`, - ) + .prepare(/* sql */ ` + UPDATE "the_app.permissions" SET permissions = ?, hash = ?`) .run(json, h128(json).toString(16)); } diff --git a/packages/zero-cache/src/integration/integration.pg.test.ts b/packages/zero-cache/src/integration/integration.pg.test.ts index b10b062d4b..a79dc15f6d 100644 --- a/packages/zero-cache/src/integration/integration.pg.test.ts +++ b/packages/zero-cache/src/integration/integration.pg.test.ts @@ -122,13 +122,13 @@ const INITIAL_CUSTOM_SETUP: ChangeStreamMessage[] = [ schema: 'public', name: 'foo', columns: { - id: {pos: 0, dataType: 'text', notNull: true}, + 'id': {pos: 0, dataType: 'text', notNull: true}, ['far_id']: {pos: 1, dataType: 'text'}, - b: {pos: 2, dataType: 'bool'}, - j1: {pos: 3, dataType: 'json'}, - j2: {pos: 4, dataType: 'jsonb'}, + 'b': {pos: 2, dataType: 'bool'}, + 'j1': {pos: 3, dataType: 'json'}, + 'j2': {pos: 4, dataType: 'jsonb'}, ['j.3']: {pos: 5, dataType: 'json'}, - j4: {pos: 6, dataType: 'json'}, + 'j4': {pos: 6, dataType: 'json'}, }, }, metadata: { @@ -163,13 +163,13 @@ const INITIAL_CUSTOM_SETUP: ChangeStreamMessage[] = [ }, }, new: { - id: 'bar', + 'id': 'bar', ['far_id']: 'baz', - b: true, - j1: {foo: 'bar\u0000'}, - j2: true, + 'b': true, + 'j1': {foo: 'bar\u0000'}, + 'j2': true, ['j.3']: 123, - j4: 'string', + 'j4': 'string', }, }, ], @@ -677,7 +677,7 @@ describe('integration', {timeout: 30000}, () => { ], clientSchema: { tables: { - foo: { + 'foo': { primaryKey: ['id'], columns: {id: {type: 'string'}}, }, @@ -729,13 +729,13 @@ describe('integration', {timeout: 30000}, () => { op: 'put', tableName: 'foo', value: { - id: 'bar', + 'id': 'bar', ['far_id']: 'baz', - b: true, - j1: {foo: 'bar\u0000'}, - j2: true, + 'b': true, + 'j1': {foo: 'bar\u0000'}, + 'j2': true, ['j.3']: 123, - j4: 'string', + 'j4': 'string', }, }, { @@ -776,13 +776,13 @@ describe('integration', {timeout: 30000}, () => { }, }, new: { - id: 'voo', + 'id': 'voo', ['far_id']: 'doo', - b: null, - j1: '"foo"', - j2: 'false', + 'b': null, + 'j1': '"foo"', + 'j2': 'false', ['j.3']: '456.789', - j4: '{"bar":"baz"}', + 'j4': '{"bar":"baz"}', }, }, ], @@ -798,13 +798,13 @@ describe('integration', {timeout: 30000}, () => { }, }, new: { - id: 'bar', + 'id': 'bar', ['far_id']: 'not_baz', - b: true, - j1: '{"foo":"bar\\u0000"}', - j2: 'true', + 'b': true, + 'j1': '{"foo":"bar\\u0000"}', + 'j2': 'true', ['j.3']: '123', - j4: '"string"', + 'j4': '"string"', }, key: null, }, @@ -826,28 +826,28 @@ describe('integration', {timeout: 30000}, () => { op: 'put', tableName: 'foo', value: { - id: 'voo', + 'id': 'voo', ['far_id']: 'doo', - b: null, - j1: 'foo', - j2: false, + 'b': null, + 'j1': 'foo', + 'j2': false, ['j.3']: 456.789, - j4: {bar: 'baz'}, + 'j4': {bar: 'baz'}, }, }, { op: 'put', tableName: 'foo', value: { - b: true, + 'b': true, ['far_id']: 'not_baz', - id: 'bar', - j1: { + 'id': 'bar', + 'j1': { foo: 'bar\u0000', }, - j2: true, + 'j2': true, ['j.3']: 123, - j4: 'string', + 'j4': 'string', }, }, // boo.far {id: 'baz'} is no longer referenced by foo {id: 'bar} diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.test.ts b/packages/zero-cache/src/services/change-source/custom/change-source.test.ts index 0e5fb52b28..76ce91061e 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.test.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.test.ts @@ -234,7 +234,7 @@ describe('change-source/custom', () => { ); expectTables(replicaDbFile.connect(lc), { - foo: [{id: 'abcde', bar: 'baz', ['_0_version']: '123'}], + 'foo': [{id: 'abcde', bar: 'baz', ['_0_version']: '123'}], ['bongo_0.clients']: [], ['_zero.replicationState']: [{lock: 1, stateVersion: '123'}], ['_zero.replicationConfig']: [ diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts index bae6f037e1..71ea03c2eb 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.pg.test.ts @@ -888,9 +888,8 @@ describe('change-source/pg', {timeout: 30000, retry: 3}, () => { if (startStreamAfterReport) { // Get the current lsn (which is at or after the lag report) and // start a subscription _after_ it to skip the lag report. - const [{lsn}] = await upstream< - {lsn: string}[] - > /*sql*/ `SELECT pg_current_wal_lsn() as lsn`; + const [{lsn}] = await upstream<{lsn: string}[]> + /*sql*/ `SELECT pg_current_wal_lsn() as lsn`; watermark = toStateVersionString(lsn); lc.debug?.( diff --git a/packages/zero-cache/src/services/change-source/pg/change-source.ts b/packages/zero-cache/src/services/change-source/pg/change-source.ts index 008715dbaf..35affa903f 100644 --- a/packages/zero-cache/src/services/change-source/pg/change-source.ts +++ b/packages/zero-cache/src/services/change-source/pg/change-source.ts @@ -228,9 +228,8 @@ async function checkAndUpdateUpstream( } const {slot} = upstreamReplica; - const result = await sql< - {restartLSN: LSN | null; walStatus: string | null}[] - > /*sql*/ ` + const result = await sql<{restartLSN: LSN | null; walStatus: string | null}[]> + /*sql*/ ` SELECT restart_lsn as "restartLSN", wal_status as "walStatus" FROM pg_replication_slots WHERE slot_name = ${slot}`; if (result.length === 0) { diff --git a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts index 50d1a212e6..22b7c9109d 100644 --- a/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/initial-sync.pg.test.ts @@ -484,7 +484,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { [`${APP_ID}.permissions`]: ZERO_PERMISSIONS_SPEC, ['public.issues']: { columns: { - issueID: { + 'issueID': { pos: 1, characterMaximumLength: null, dataType: 'int4', @@ -493,7 +493,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - orgID: { + 'orgID': { pos: 2, characterMaximumLength: null, dataType: 'int4', @@ -502,7 +502,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - isAdmin: { + 'isAdmin': { pos: 3, characterMaximumLength: null, dataType: 'bool', @@ -511,7 +511,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - bigint: { + 'bigint': { pos: 4, characterMaximumLength: null, dataType: 'int8', @@ -520,7 +520,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - timestamp: { + 'timestamp': { pos: 5, characterMaximumLength: null, dataType: 'timestamptz', @@ -529,7 +529,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - bytes: { + 'bytes': { pos: 6, characterMaximumLength: null, dataType: 'bytea', @@ -538,7 +538,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - intArray: { + 'intArray': { pos: 7, characterMaximumLength: null, dataType: 'int4[]', @@ -547,7 +547,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: 'b', }, - json: { + 'json': { pos: 8, characterMaximumLength: null, dataType: 'json', @@ -556,7 +556,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - jsonb: { + 'jsonb': { pos: 9, characterMaximumLength: null, dataType: 'jsonb', @@ -565,7 +565,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - date: { + 'date': { pos: 10, characterMaximumLength: null, dataType: 'date', @@ -574,7 +574,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - time: { + 'time': { pos: 11, characterMaximumLength: null, dataType: 'time', @@ -583,7 +583,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - serial: { + 'serial': { pos: 12, characterMaximumLength: null, dataType: 'int4', @@ -591,7 +591,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: "nextval('issues_serial_seq'::regclass)", notNull: true, }, - enumz: { + 'enumz': { pos: 13, characterMaximumLength: null, dataType: 'enumz', @@ -612,7 +612,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { // }, // Identity columns, however, are replicated. // https://www.postgresql.org/docs/current/ddl-identity-columns.html - shortID: { + 'shortID': { pos: 15, characterMaximumLength: null, dataType: 'int4', @@ -621,7 +621,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { elemPgTypeClass: null, notNull: true, }, - shortID2: { + 'shortID2': { pos: 16, characterMaximumLength: null, dataType: 'int4', @@ -630,7 +630,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { elemPgTypeClass: null, notNull: true, }, - num: { + 'num': { pos: 17, characterMaximumLength: null, dataType: 'numeric', @@ -648,7 +648,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { elemPgTypeClass: null, notNull: false, }, - jsonArray: { + 'jsonArray': { pos: 19, characterMaximumLength: null, dataType: 'json[]', @@ -657,7 +657,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { elemPgTypeClass: 'b', notNull: false, }, - jsonbArray: { + 'jsonbArray': { pos: 20, characterMaximumLength: null, dataType: 'jsonb[]', @@ -679,7 +679,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { [`${APP_ID}_${SHARD_NUM}.clients`]: REPLICATED_ZERO_CLIENTS_SPEC, ['issues']: { columns: { - issueID: { + 'issueID': { pos: 1, characterMaximumLength: null, dataType: 'int4|NOT_NULL', @@ -687,7 +687,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - orgID: { + 'orgID': { pos: 2, characterMaximumLength: null, dataType: 'int4|NOT_NULL', @@ -695,7 +695,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - isAdmin: { + 'isAdmin': { pos: 3, characterMaximumLength: null, dataType: 'bool', @@ -703,7 +703,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - bigint: { + 'bigint': { pos: 4, characterMaximumLength: null, dataType: 'int8', @@ -711,7 +711,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - timestamp: { + 'timestamp': { pos: 5, characterMaximumLength: null, dataType: 'timestamptz', @@ -719,7 +719,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - bytes: { + 'bytes': { pos: 6, characterMaximumLength: null, dataType: 'bytea', @@ -727,7 +727,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - intArray: { + 'intArray': { pos: 7, characterMaximumLength: null, dataType: 'int4[]|TEXT_ARRAY', @@ -735,7 +735,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: 'b', }, - json: { + 'json': { pos: 8, characterMaximumLength: null, dataType: 'json', @@ -743,7 +743,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - jsonb: { + 'jsonb': { pos: 9, characterMaximumLength: null, dataType: 'jsonb', @@ -751,7 +751,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - date: { + 'date': { pos: 10, characterMaximumLength: null, dataType: 'date', @@ -759,7 +759,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - time: { + 'time': { pos: 11, characterMaximumLength: null, dataType: 'time', @@ -767,7 +767,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - serial: { + 'serial': { pos: 12, characterMaximumLength: null, dataType: 'int4|NOT_NULL', @@ -775,7 +775,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - enumz: { + 'enumz': { pos: 13, characterMaximumLength: null, dataType: 'enumz|TEXT_ENUM', @@ -783,7 +783,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { elemPgTypeClass: null, notNull: false, }, - shortID: { + 'shortID': { pos: 14, characterMaximumLength: null, dataType: 'int4|NOT_NULL', @@ -791,7 +791,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - shortID2: { + 'shortID2': { pos: 15, characterMaximumLength: null, dataType: 'int4|NOT_NULL', @@ -799,7 +799,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - num: { + 'num': { pos: 16, characterMaximumLength: null, dataType: 'numeric', @@ -815,7 +815,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: null, }, - jsonArray: { + 'jsonArray': { pos: 18, characterMaximumLength: null, dataType: 'json[]|TEXT_ARRAY', @@ -823,7 +823,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { dflt: null, elemPgTypeClass: 'b', }, - jsonbArray: { + 'jsonbArray': { pos: 19, characterMaximumLength: null, dataType: 'jsonb[]|TEXT_ARRAY', @@ -930,7 +930,7 @@ describe('change-source/pg/initial-sync', {timeout: 10000}, () => { }, replicatedData: { [`${APP_ID}_${SHARD_NUM}.clients`]: [], - issues: [ + 'issues': [ { issueID: 1n, orgID: 1n, diff --git a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts index da1fa321e0..f6aad778f1 100644 --- a/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts +++ b/packages/zero-cache/src/services/change-source/pg/sync-schema.pg.test.ts @@ -81,7 +81,7 @@ describe('change-streamer/pg/sync-schema', () => { replicaPostState: { [`${APP_ID}_${SHARD_NUM}.clients`]: [], ['_zero.versionHistory']: [CURRENT_SCHEMA_VERSIONS], - users: [ + 'users': [ {userID: 123, handle: '@zoot', ['_0_version']: WATERMARK_REGEX}, {userID: 456, handle: '@bonk', ['_0_version']: WATERMARK_REGEX}, ], diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index eb9c22037a..2a6add32cc 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -216,9 +216,8 @@ export class Storer implements Service { } async getMinWatermarkForCatchup(): Promise { - const [{minWatermark}] = await this.#db< - {minWatermark: string | null}[] - > /*sql*/ ` + const [{minWatermark}] = await this.#db<{minWatermark: string | null}[]> + /*sql*/ ` SELECT min(watermark) as "minWatermark" FROM ${this.#cdc('changeLog')}`; return minWatermark; } diff --git a/packages/zero-cache/src/services/replicator/change-processor.test.ts b/packages/zero-cache/src/services/replicator/change-processor.test.ts index 1ddab2eca5..1e637a8f08 100644 --- a/packages/zero-cache/src/services/replicator/change-processor.test.ts +++ b/packages/zero-cache/src/services/replicator/change-processor.test.ts @@ -121,7 +121,7 @@ describe('replicator/change-processor', () => { ['commit', issues.commit(), {watermark: '0b'}], ], data: { - issues: [ + 'issues': [ { issueID: 123n, big: null, @@ -269,7 +269,7 @@ describe('replicator/change-processor', () => { ['commit', issues.commit(), {watermark: '0a'}], ], data: { - issues: [ + 'issues': [ { issueID: 123n, big: 9223372036854775807n, @@ -346,7 +346,7 @@ describe('replicator/change-processor', () => { ['commit', orgIssues.commit(), {watermark: '0a'}], ], data: { - issues: [ + 'issues': [ { orgID: 2n, issueID: 123n, @@ -453,7 +453,7 @@ describe('replicator/change-processor', () => { ['commit', orgIssues.commit(), {watermark: '0c'}], ], data: { - issues: [ + 'issues': [ { orgID: 2n, issueID: 789n, @@ -526,13 +526,13 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0i'}], ], data: { - foo: [{id: 101n, ['_0_version']: '0i'}], - bar: [ + 'foo': [{id: 101n, ['_0_version']: '0i'}], + 'bar': [ {id: 4n, ['_0_version']: '0e'}, {id: 5n, ['_0_version']: '0e'}, {id: 6n, ['_0_version']: '0e'}, ], - baz: [], + 'baz': [], ['_zero.changeLog2']: [ { backfillingColumnVersions: '{}', @@ -672,7 +672,7 @@ describe('replicator/change-processor', () => { ['commit', issues.commit(), {watermark: '0b'}], ], data: { - full: [ + 'full': [ {id: 123n, bool: 0n, desc: 'foobar', ['_0_version']: '0b'}, {id: 987n, bool: 1n, desc: 'barfoo', ['_0_version']: '0b'}, ], @@ -763,12 +763,12 @@ describe('replicator/change-processor', () => { ['commit', full.commit(), {watermark: '06'}], ], data: { - foo: [ + 'foo': [ {id: 1n, desc: 'replaced one', ['_0_version']: '06'}, {id: 789n, desc: null, ['_0_version']: '06'}, {id: 234n, desc: 'woo', ['_0_version']: '06'}, ], - full: [ + 'full': [ {id: 2n, bool: 1n, desc: 'replaced two', ['_0_version']: '06'}, {id: 321n, bool: 0n, desc: 'voo', ['_0_version']: '06'}, {id: 456n, bool: 0n, desc: null, ['_0_version']: '06'}, @@ -886,7 +886,7 @@ describe('replicator/change-processor', () => { ['commit', orgIssues.commit(), {watermark: '07'}], ], data: { - transaction: [], + 'transaction': [], ['_zero.changeLog2']: [ { stateVersion: '07', @@ -961,7 +961,7 @@ describe('replicator/change-processor', () => { ['commit', orgIssues.commit(), {watermark: '08'}], ], data: { - issues: [ + 'issues': [ { orgID: 1n, issueID: 456n, @@ -1051,7 +1051,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 'bar', count: 2n, bool: 1n, serial: 1n, ['_0_version']: '0e'}, {id: 'baz', count: 3n, bool: 0n, serial: 2n, ['_0_version']: '0e'}, ], @@ -1204,7 +1204,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - bar: [ + 'bar': [ {id: 1n, ['_0_version']: '00'}, {id: 2n, ['_0_version']: '00'}, {id: 3n, ['_0_version']: '00'}, @@ -1318,7 +1318,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ { id: 1n, newInt: 123n, @@ -1476,7 +1476,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 1n, ['_0_version']: '00'}, {id: 2n, ['_0_version']: '00'}, {id: 3n, ['_0_version']: '0e'}, @@ -1569,7 +1569,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 1n, newName: 'hel', ['_0_version']: '00'}, {id: 2n, newName: 'low', ['_0_version']: '00'}, {id: 3n, newName: 'olrd', ['_0_version']: '0e'}, @@ -1677,7 +1677,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 1n, nolz: 'hel', ['_0_version']: '00'}, {id: 2n, nolz: 'low', ['_0_version']: '00'}, {id: 3n, nolz: 'olrd', ['_0_version']: '0e'}, @@ -1788,7 +1788,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 1n, nolz: 'hel', ['_0_version']: '00'}, {id: 2n, nolz: 'low', ['_0_version']: '00'}, {id: 3n, nolz: 'olrd', ['_0_version']: '0e'}, @@ -1897,7 +1897,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 1n, newName: 'hel', ['_0_version']: '00'}, {id: 2n, newName: 'low', ['_0_version']: '00'}, {id: 3n, newName: 'olrd', ['_0_version']: '0e'}, @@ -2011,7 +2011,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 1n, num: 3n, ['_0_version']: '00'}, {id: 2n, num: 2n, ['_0_version']: '00'}, {id: 3n, num: 1n, ['_0_version']: '0e'}, @@ -2121,7 +2121,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 1n, num: 3n, ['_0_version']: '00'}, {id: 2n, num: 2n, ['_0_version']: '00'}, {id: 3n, num: 1n, ['_0_version']: '0e'}, @@ -2241,7 +2241,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '0e'}], ], data: { - foo: [ + 'foo': [ {id: 1n, number: 3n, ['_0_version']: '00'}, {id: 2n, number: 2n, ['_0_version']: '00'}, {id: 3n, number: 1n, ['_0_version']: '0e'}, @@ -2575,7 +2575,7 @@ describe('replicator/change-processor', () => { ['commit', orgIssues.commit(), {watermark: '07'}], ], data: { - transaction: [], + 'transaction': [], ['_zero.changeLog2']: [ { stateVersion: '07', @@ -2756,7 +2756,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '123.03'}], ], data: { - bff: [ + 'bff': [ { // Note: The version is unchanged even though backfill updated // a replicated row. @@ -2973,7 +2973,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '123.03'}], ], data: { - bff: [ + 'bff': [ { // Note: Versions are unchanged even though backfill values // are added. @@ -3173,7 +3173,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '123.02'}], ], data: { - bff: [ + 'bff': [ { _0_version: '101', a: 1n, @@ -3387,7 +3387,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '123.02'}], ], data: { - bff: [ + 'bff': [ { _0_version: '03', a: 1n, @@ -3561,7 +3561,7 @@ describe('replicator/change-processor', () => { ['commit', fooBarBaz.commit(), {watermark: '123.01'}], ], data: { - bff: [ + 'bff': [ {id: 2n, _0_version: '115'}, {id: 83n, _0_version: '115'}, ], diff --git a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts index 35f130a1d5..84f1b2d3b7 100644 --- a/packages/zero-cache/src/services/replicator/incremental-sync.test.ts +++ b/packages/zero-cache/src/services/replicator/incremental-sync.test.ts @@ -174,7 +174,7 @@ describe('replicator/incremental-sync', () => { expectTables( mainDb, { - issues: [ + 'issues': [ { issueID: 123n, big: null, diff --git a/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts b/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts index e2353be1df..33031cd11d 100644 --- a/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts +++ b/packages/zero-cache/src/services/view-syncer/snapshotter.test.ts @@ -63,14 +63,12 @@ describe('view-syncer/snapshotter', () => { // Initialize ColumnMetadata and mark a column as being backfilled, // to verify that it does not appear in the pipeline results. populateFromExistingTables(db, listTables(db, false)); - db.prepare( - /*sql*/ ` + db.prepare(/*sql*/ ` UPDATE "_zero.column_metadata" SET backfill = '{"upstreamID":123}' WHERE table_name = 'issues' AND column_name = 'stillBeingBackfilled' - `, - ).run(); + `).run(); tableSpecs = computeZqlSpecs(lc, db, {includeBackfillingColumns: false}); allTableNames = new Set(tableSpecs.keys()); @@ -136,10 +134,10 @@ describe('view-syncer/snapshotter', () => { }); const messages = new ReplicationMessages({ - issues: 'id', - users: 'id', - comments: 'id', - backfilling: 'id', + 'issues': 'id', + 'users': 'id', + 'comments': 'id', + 'backfilling': 'id', ['my_app.permissions']: 'lock', }); diff --git a/packages/zero-client/package.json b/packages/zero-client/package.json index e5aab54be2..12f9e296a2 100644 --- a/packages/zero-client/package.json +++ b/packages/zero-client/package.json @@ -4,8 +4,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:watch": "vitest", diff --git a/packages/zero-events/package.json b/packages/zero-events/package.json index 48467e549f..02715e635e 100644 --- a/packages/zero-events/package.json +++ b/packages/zero-events/package.json @@ -26,8 +26,8 @@ "prepack": "npm run build", "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run" }, diff --git a/packages/zero-pg/package.json b/packages/zero-pg/package.json index 13835c4766..700c2ad5d2 100644 --- a/packages/zero-pg/package.json +++ b/packages/zero-pg/package.json @@ -5,8 +5,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "lint": "oxlint --type-aware src/", diff --git a/packages/zero-protocol/package.json b/packages/zero-protocol/package.json index 4300ed3817..73905bc6e9 100644 --- a/packages/zero-protocol/package.json +++ b/packages/zero-protocol/package.json @@ -6,8 +6,8 @@ "scripts": { "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts", "test": "vitest run", "test:watch": "vitest watch" diff --git a/packages/zero-react-native/package.json b/packages/zero-react-native/package.json index afbb8464fe..4c777b770b 100644 --- a/packages/zero-react-native/package.json +++ b/packages/zero-react-native/package.json @@ -9,8 +9,8 @@ "check-types:watch": "tsc --watch", "test": "vitest run", "test:watch": "vitest watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { diff --git a/packages/zero-react/package.json b/packages/zero-react/package.json index 0c2803ed83..239e16b402 100644 --- a/packages/zero-react/package.json +++ b/packages/zero-react/package.json @@ -15,8 +15,8 @@ "test:firefox:watch": "VITEST_BROWSER=firefox vitest", "test:webkit": "VITEST_BROWSER=webkit vitest run", "test:webkit:watch": "VITEST_BROWSER=webkit vitest", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "peerDependencies": { diff --git a/packages/zero-schema/package.json b/packages/zero-schema/package.json index a65414c1ab..33ee8e2b65 100644 --- a/packages/zero-schema/package.json +++ b/packages/zero-schema/package.json @@ -9,8 +9,8 @@ "check-types:watch": "tsc --watch", "test": "vitest run", "test:watch": "vitest watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "devDependencies": { diff --git a/packages/zero-server/package.json b/packages/zero-server/package.json index d3118feef2..76bb0c640f 100644 --- a/packages/zero-server/package.json +++ b/packages/zero-server/package.json @@ -5,8 +5,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "lint": "oxlint --type-aware src/", diff --git a/packages/zero-solid/package.json b/packages/zero-solid/package.json index 49ee3bd8b5..1cdafdf448 100644 --- a/packages/zero-solid/package.json +++ b/packages/zero-solid/package.json @@ -15,8 +15,8 @@ "test:webkit:watch": "VITEST_BROWSER=webkit vitest", "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "peerDependencies": { diff --git a/packages/zero-types/package.json b/packages/zero-types/package.json index a2d0dc0db5..63eba94aa8 100644 --- a/packages/zero-types/package.json +++ b/packages/zero-types/package.json @@ -6,8 +6,8 @@ "scripts": { "check-types": "tsc", "check-types:watch": "tsc --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --type-aware src/", "test": "vitest run", "test:watch": "vitest" diff --git a/packages/zero/package.json b/packages/zero/package.json index 0703382501..8abb809508 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -19,8 +19,8 @@ "check-types": "tsc -p tsconfig.client.json && tsc -p tsconfig.server.json", "check-types:client:watch": "tsc -p tsconfig.client.json --watch", "check-types:server:watch": "tsc -p tsconfig.server.json --watch", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --type-aware src/", "docs": "node --experimental-strip-types --no-warnings tool/generate-docs.ts", "docs:server": "node --watch --experimental-strip-types --no-warnings tool/generate-docs.ts --server" @@ -70,7 +70,6 @@ "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", - "prettier": "^3.8.1", "semver": "^7.5.4", "tsx": "^4.21.0", "url-pattern": "^1.0.3", diff --git a/packages/zql-benchmarks/package.json b/packages/zql-benchmarks/package.json index 7da3ba99d5..8398f7aadb 100644 --- a/packages/zql-benchmarks/package.json +++ b/packages/zql-benchmarks/package.json @@ -5,8 +5,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "build:bin": "tsc -p tsconfig.bin.json", diff --git a/packages/zql-integration-tests/package.json b/packages/zql-integration-tests/package.json index d95a817cf2..9b8bcb72d7 100644 --- a/packages/zql-integration-tests/package.json +++ b/packages/zql-integration-tests/package.json @@ -5,8 +5,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "build:bin": "tsc -p tsconfig.bin.json", diff --git a/packages/zql/package.json b/packages/zql/package.json index f2238744ad..9b5eb04ae5 100644 --- a/packages/zql/package.json +++ b/packages/zql/package.json @@ -5,8 +5,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "lint": "oxlint --quiet --config ../../oxlint.config.ts", diff --git a/packages/zql/src/query/query.ts b/packages/zql/src/query/query.ts index de85a1b70a..eb7ec7969a 100644 --- a/packages/zql/src/query/query.ts +++ b/packages/zql/src/query/query.ts @@ -72,7 +72,8 @@ export type GetFilterType< TColumn extends keyof TSchema['columns'], TOperator extends SimpleOperator, > = TOperator extends 'IS' | 'IS NOT' - ? // SchemaValueToTSType adds null if the type is optional, but we add null + ? + // SchemaValueToTSType adds null if the type is optional, but we add null // no matter what for dx reasons. See: // https://github.com/rocicorp/mono/pull/3576#discussion_r1925792608 SchemaValueToTSType | null | undefined diff --git a/packages/zqlite-zql-test/package.json b/packages/zqlite-zql-test/package.json index 2ed68578e3..c13659a183 100644 --- a/packages/zqlite-zql-test/package.json +++ b/packages/zqlite-zql-test/package.json @@ -5,8 +5,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "lint": "oxlint --type-aware src/", diff --git a/packages/zqlite/package.json b/packages/zqlite/package.json index 83d5234ac0..da99eb5495 100644 --- a/packages/zqlite/package.json +++ b/packages/zqlite/package.json @@ -5,8 +5,8 @@ "private": true, "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "check-types": "tsc", "check-types:watch": "tsc --watch", "build:bin": "tsc -p tsconfig.bin.json", diff --git a/prod/functions/package.json b/prod/functions/package.json index ee5dd8385e..80a8698665 100644 --- a/prod/functions/package.json +++ b/prod/functions/package.json @@ -5,8 +5,8 @@ "type": "module", "scripts": { "check-types": "tsc", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { diff --git a/prod/package.json b/prod/package.json index 27835c6fc0..2da5d09ab2 100644 --- a/prod/package.json +++ b/prod/package.json @@ -4,29 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check ." - }, - "prettier": { - "singleQuote": true, - "trailingComma": "all", - "arrowParens": "avoid", - "bracketSpacing": false, - "quoteProps": "consistent", - "overrides": [ - { - "files": [ - "*.yml", - "*.yaml" - ], - "options": { - "trailingComma": "es5", - "tabWidth": 2, - "bracketSpacing": false, - "semi": false, - "singleQuote": false - } - } - ] + "format": "oxfmt .", + "check-format": "oxfmt --check ." } } diff --git a/prod/sst/package.json b/prod/sst/package.json index 386a519564..e18545c720 100644 --- a/prod/sst/package.json +++ b/prod/sst/package.json @@ -3,8 +3,8 @@ "version": "1.0.0", "main": "index.ts", "scripts": { - "format": "prettier --write .", - "check-format": "prettier --check ." + "format": "oxfmt .", + "check-format": "oxfmt --check ." }, "keywords": [], "author": "", diff --git a/tools/client-simulator/package.json b/tools/client-simulator/package.json index ec434ad8ca..1ca5d386b5 100644 --- a/tools/client-simulator/package.json +++ b/tools/client-simulator/package.json @@ -6,8 +6,8 @@ "scripts": { "go": "tsx src/main.ts", "check-types": "tsc", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { diff --git a/tools/load-generator/package.json b/tools/load-generator/package.json index d8f826397e..1bd98d51df 100644 --- a/tools/load-generator/package.json +++ b/tools/load-generator/package.json @@ -6,8 +6,8 @@ "scripts": { "go": "tsx src/main.ts", "check-types": "tsc", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { diff --git a/tools/process-tracker/package.json b/tools/process-tracker/package.json index f338bc16b4..a05a843b7c 100644 --- a/tools/process-tracker/package.json +++ b/tools/process-tracker/package.json @@ -6,8 +6,8 @@ "scripts": { "go": "tsx src/main.ts", "check-types": "tsc", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { diff --git a/tools/sqlite-io-yield-simulator/package.json b/tools/sqlite-io-yield-simulator/package.json index ce08d52809..89d737c8f2 100644 --- a/tools/sqlite-io-yield-simulator/package.json +++ b/tools/sqlite-io-yield-simulator/package.json @@ -6,8 +6,8 @@ "scripts": { "go": "tsx src/main.ts", "check-types": "tsc", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { diff --git a/tools/verify-package-deps/package.json b/tools/verify-package-deps/package.json index 66c128abf1..1816665a2c 100644 --- a/tools/verify-package-deps/package.json +++ b/tools/verify-package-deps/package.json @@ -11,8 +11,8 @@ "verify": "node --experimental-strip-types src/verify-package-deps.ts", "verify:fix": "node --experimental-strip-types src/verify-package-deps.ts --fix", "check-types": "tsc", - "format": "prettier --write .", - "check-format": "prettier --check .", + "format": "oxfmt .", + "check-format": "oxfmt --check .", "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "dependencies": { diff --git a/turbo.json b/turbo.json index 2c17832054..4b06c5113c 100644 --- a/turbo.json +++ b/turbo.json @@ -6,13 +6,6 @@ "dependsOn": ["^build"], "outputs": ["out/**", "dist/**", ".next/**", "next-env.d.ts", "build/**"] }, - "lint": { - "outputs": [] - }, - "format": {}, - "check-format": { - "outputs": [] - }, "dev": { "cache": true }, From da144a69d38b1d53af125011c6665d4c9f1113e4 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Apr 2026 22:11:14 +0200 Subject: [PATCH 220/495] fix(zero): restore dropLabels for bundle size builds under Vite 8/Rolldown (#5744) Vite 8 deprecated the esbuild transform plugin in favor of Rolldown's native oxc transforms. As a result, `esbuild.dropLabels` was silently ignored during production builds, leaving the `BUNDLE_SIZE:` labeled block in the output. This prevented the tree-shaker from eliminating the `Inspector` class and its dependencies, adding ~10KB to the bundle. Fix by moving `dropLabels` to `rollupOptions.transform.dropLabels`, which is Rolldown's per-file transform phase (before bundling/treeshaking). Also replace the deprecated `inlineDynamicImports: true` with `codeSplitting: false`. https://claude.ai/code/session_01LBCSz53aEf759PxkpKgjLZ Co-authored-by: Claude --- packages/zero/tool/build.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/zero/tool/build.ts b/packages/zero/tool/build.ts index 01ea9a599f..a541298529 100644 --- a/packages/zero/tool/build.ts +++ b/packages/zero/tool/build.ts @@ -144,7 +144,10 @@ async function getViteConfig(): Promise { } // Bundle size dashboard config: single entry, no code splitting, minified -// Uses esbuild's dropLabels to strip BUNDLE_SIZE labeled code blocks +// Uses Rolldown's transform.dropLabels to strip BUNDLE_SIZE labeled code blocks +// before bundling so the tree-shaker can eliminate the dead Inspector code. +// Note: the old esbuild.dropLabels approach is silently ignored in Vite 8 +// because Vite 8 uses Rolldown's oxc transforms instead of esbuild. const bundleSizeConfig: InlineConfig = { ...baseConfig, build: { @@ -159,16 +162,16 @@ const bundleSizeConfig: InlineConfig = { format: 'es', entryFileNames: '[name].js', // No code splitting for bundle size measurements - inlineDynamicImports: true, + codeSplitting: false, }, treeshake: { moduleSideEffects: false, }, + transform: { + dropLabels: ['BUNDLE_SIZE'], + }, }, }, - esbuild: { - dropLabels: ['BUNDLE_SIZE'], - }, }; async function makeBinFilesExecutable() { From 5af40a2e2da01ad5bca98b19217e8b200731126d Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 2 Apr 2026 14:50:36 -0700 Subject: [PATCH 221/495] chore(zero-cache): export replica and backup metrics (#5746) --- .../zero-cache/src/observability/metrics.ts | 7 +- .../zero-cache/src/server/change-streamer.ts | 9 +++ packages/zero-cache/src/server/replicator.ts | 46 ++++++++++++- .../common/replica-schema.test.ts | 65 ++++++++++++++++++- .../change-source/common/replica-schema.ts | 14 ++++ .../custom/change-source.test.ts | 12 +++- .../change-streamer/backup-monitor.test.ts | 17 ++++- .../change-streamer/backup-monitor.ts | 47 ++++++++++++++ .../schema/replication-state.test.ts | 12 ++-- .../replicator/schema/replication-state.ts | 20 ++++-- packages/zero-cache/src/workers/replicator.ts | 21 +++--- 11 files changed, 240 insertions(+), 30 deletions(-) diff --git a/packages/zero-cache/src/observability/metrics.ts b/packages/zero-cache/src/observability/metrics.ts index 0519d153ec..236004b189 100644 --- a/packages/zero-cache/src/observability/metrics.ts +++ b/packages/zero-cache/src/observability/metrics.ts @@ -10,7 +10,12 @@ import {metrics} from '@opentelemetry/api'; // intentional lazy initialization so it is not started before the SDK is started. -export type Category = 'replication' | 'sync' | 'mutation' | 'server'; +export type Category = + | 'replication' // postgres to replica + | 'replica' // health of replica and litestream backup + | 'sync' // replica to client + | 'mutation' + | 'server'; let meter: Meter | undefined; diff --git a/packages/zero-cache/src/server/change-streamer.ts b/packages/zero-cache/src/server/change-streamer.ts index e38a755a40..dc7548f6e2 100644 --- a/packages/zero-cache/src/server/change-streamer.ts +++ b/packages/zero-cache/src/server/change-streamer.ts @@ -6,6 +6,7 @@ import {getNormalizedZeroConfig} from '../config/zero-config.ts'; import {deleteLiteDB} from '../db/delete-lite-db.ts'; import {warmupConnections} from '../db/warmup.ts'; import {initEventSink, publishCriticalEvent} from '../observability/events.ts'; +import {upgradeReplica} from '../services/change-source/common/replica-schema.ts'; import {initializeCustomChangeSource} from '../services/change-source/custom/change-source.ts'; import {initializePostgresChangeSource} from '../services/change-source/pg/change-source.ts'; import {BackupMonitor} from '../services/change-streamer/backup-monitor.ts'; @@ -146,10 +147,18 @@ export default async function runWorker( // impossible: upstream must have advanced in order for replication to be stuck. assert(changeStreamer, `resetting replica did not advance replicaVersion`); + // Perform any upgrades to the replica in case it was restored from an + // earlier version. Note that this upgrade is done by the replicator worker + // as well (in both the replication-manager and the view-syncer), but the + // change-streamer independently reads the replica, and it is fine run the + // upgrade logic redundantly since it is idempotent. + await upgradeReplica(lc, 'change-streamer-init', replica.file); + const {backupURL, port: metricsPort} = litestream; const monitor = backupURL ? new BackupMonitor( lc, + replica.file, backupURL, `http://localhost:${metricsPort}/metrics`, changeStreamer, diff --git a/packages/zero-cache/src/server/replicator.ts b/packages/zero-cache/src/server/replicator.ts index 3fbdec1823..893d3317ce 100644 --- a/packages/zero-cache/src/server/replicator.ts +++ b/packages/zero-cache/src/server/replicator.ts @@ -1,9 +1,13 @@ +import type {ObservableCallback} from '@opentelemetry/api'; +import type {LogContext} from '@rocicorp/logger'; +import {stat} from 'node:fs/promises'; import {pid} from 'node:process'; import {assert} from '../../../shared/src/asserts.ts'; import {must} from '../../../shared/src/must.ts'; import * as v from '../../../shared/src/valita.ts'; import {getNormalizedZeroConfig} from '../config/zero-config.ts'; import {initEventSink} from '../observability/events.ts'; +import {getOrCreateGauge} from '../observability/metrics.ts'; import {ChangeStreamerHttpClient} from '../services/change-streamer/change-streamer-http.ts'; import {exitAfter, runUntilKilled} from '../services/life-cycle.ts'; import {ReplicationStatusPublisher} from '../services/replicator/replication-status.ts'; @@ -23,6 +27,7 @@ import { replicaFileModeSchema, setUpMessageHandlers, setupReplica, + type WalMode, } from '../workers/replicator.ts'; import {createLogContext} from './logging.ts'; @@ -40,10 +45,15 @@ export default async function runWorker( const lc = createLogContext(config, {worker: workerName}); initEventSink(lc, config); - const replica = await setupReplica(lc, fileMode, config.replica); + const {file: dbPath, walMode} = await setupReplica( + lc, + fileMode, + config.replica, + ); + + setupMetrics(lc, dbPath, walMode); // Create the write worker for async SQLite writes. - const dbPath = replica.name; const pragmas = getPragmaConfig(fileMode); const workerClient = new ThreadWriteWorkerClient(); await workerClient.init(dbPath, mode, pragmas, config.log); @@ -94,6 +104,38 @@ export default async function runWorker( return running; } +function setupMetrics(lc: LogContext, file: string, walMode: WalMode) { + getOrCreateGauge('replica', 'db_size', { + description: + `The size of the replica's main db file, ` + + `which does not include the wal file(s)`, + unit: 'bytes', + }).addCallback(observeFileSize(lc, file)); + + getOrCreateGauge('replica', 'wal_size', { + description: `The size of the replica's wal file`, + unit: 'bytes', + }).addCallback(observeFileSize(lc, `${file}-wal`)); + + if (walMode === 'wal2') { + getOrCreateGauge('replica', 'wal2_size', { + description: `The size of the replica's wal2 file`, + unit: 'bytes', + }).addCallback(observeFileSize(lc, `${file}-wal2`)); + } +} + +function observeFileSize(lc: LogContext, file: string): ObservableCallback { + return async o => { + try { + const stats = await stat(file); + o.observe(stats.size); + } catch (e) { + lc.warn?.(`unable to stat ${file} for size metrics`, e); + } + }; +} + // fork() if (!singleProcessMode()) { void exitAfter(() => diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts index a0107888fb..695b281f22 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.test.ts @@ -1,4 +1,4 @@ -import {beforeEach, describe, test} from 'vitest'; +import {beforeEach, describe, expect, test} from 'vitest'; import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; import {promiseVoid} from '../../../../../shared/src/resolved-promises.ts'; import { @@ -38,6 +38,10 @@ const CREATE_V1_REPLICATION_CONFIG_TABLE = /*sql*/ ` publications TEXT NOT NULL, lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) ); + CREATE TABLE "_zero.replicationState" ( + stateVersion TEXT NOT NULL, + lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) + ); `; const CREATE_V11_TABLE_METADATA_TABLE = /*sql*/ ` @@ -387,6 +391,65 @@ describe('replica-schema-migrations', () => { ], }, }, + { + fromSchemaVersion: 12, + fromDataVersion: 12, + desc: 'backfill writeTimeMs column', + replicaSetup: + CREATE_V1_REPLICATION_CONFIG_TABLE + + CREATE_V6_COLUMN_METADATA_TABLE + + CREATE_V7_CHANGE_LOG + + CREATE_TABLE_METADATA_TABLE, + replicaPreState: { + ['_zero.replicationState']: [ + { + stateVersion: '123', + lock: 1, + }, + ], + }, + replicaPostState: { + ['_zero.replicationState']: [ + { + stateVersion: '123', + writeTimeMs: expect.any(Number), + lock: 1, + }, + ], + }, + }, + { + fromSchemaVersion: 13, + fromDataVersion: 11, + desc: 'preserves writeTimeMs after rollback and rollforward', + replicaSetup: + /*sql*/ `CREATE TABLE "_zero.replicationState" ( + stateVersion TEXT NOT NULL, + writeTimeMs INTEGER, + lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) + );` + + CREATE_V6_COLUMN_METADATA_TABLE + + CREATE_V7_CHANGE_LOG + + CREATE_TABLE_METADATA_TABLE, + replicaPreState: { + ['_zero.replicationState']: [ + { + stateVersion: '123', + writeTimeMs: 12345, + lock: 1, + }, + ], + }, + replicaPostState: { + ['_zero.replicationState']: [ + { + stateVersion: '123', + writeTimeMs: 12345, + lock: 1, + }, + ], + }, + }, ]; let replicaFile: DbFile; diff --git a/packages/zero-cache/src/services/change-source/common/replica-schema.ts b/packages/zero-cache/src/services/change-source/common/replica-schema.ts index c2c4d158e3..d1beefb510 100644 --- a/packages/zero-cache/src/services/change-source/common/replica-schema.ts +++ b/packages/zero-cache/src/services/change-source/common/replica-schema.ts @@ -208,6 +208,20 @@ export const schemaVersionMigrationMap: IncrementalMigrationMap = { `); }, }, + + 13: { + migrateSchema: (_, db) => { + db.exec(/*sql*/ ` + ALTER TABLE "_zero.replicationState" ADD COLUMN writeTimeMs INTEGER; + `); + }, + + migrateData: (_, db) => { + db.exec(/*sql*/ ` + UPDATE "_zero.replicationState" + SET writeTimeMs = COALESCE(writeTimeMs, unixepoch('subsec') * 1000)`); + }, + }, }; // Referenced in tests. diff --git a/packages/zero-cache/src/services/change-source/custom/change-source.test.ts b/packages/zero-cache/src/services/change-source/custom/change-source.test.ts index 76ce91061e..414df93e34 100644 --- a/packages/zero-cache/src/services/change-source/custom/change-source.test.ts +++ b/packages/zero-cache/src/services/change-source/custom/change-source.test.ts @@ -5,7 +5,7 @@ import Fastify, {type FastifyInstance} from 'fastify'; import {afterEach, beforeEach, describe, expect, test} from 'vitest'; import type WebSocket from 'ws'; import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; -import {DbFile, expectTables} from '../../../test/lite.ts'; +import {DbFile, expectMatchingObjectsInTables} from '../../../test/lite.ts'; import {stream, type Sink} from '../../../types/streams.ts'; import {AutoResetSignal} from '../../change-streamer/schema/tables.ts'; import type {ChangeStreamMessage} from '../protocol/current/downstream.ts'; @@ -233,10 +233,16 @@ describe('change-source/custom', () => { TEST_CONTEXT, ); - expectTables(replicaDbFile.connect(lc), { + expectMatchingObjectsInTables(replicaDbFile.connect(lc), { 'foo': [{id: 'abcde', bar: 'baz', ['_0_version']: '123'}], ['bongo_0.clients']: [], - ['_zero.replicationState']: [{lock: 1, stateVersion: '123'}], + ['_zero.replicationState']: [ + { + lock: 1, + stateVersion: '123', + writeTimeMs: expect.any(Number), + }, + ], ['_zero.replicationConfig']: [ { lock: 1, diff --git a/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts b/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts index ec73e84e6e..2e4bf2160a 100644 --- a/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts +++ b/packages/zero-cache/src/services/change-streamer/backup-monitor.test.ts @@ -1,8 +1,10 @@ import {resolver} from '@rocicorp/resolver'; import nock from 'nock'; -import {beforeEach, describe, expect, test, vi} from 'vitest'; +import {beforeAll, beforeEach, describe, expect, test, vi} from 'vitest'; import {createSilentLogContext} from '../../../../shared/src/logging-test-utils.ts'; +import {DbFile} from '../../test/lite.ts'; import type {Subscription} from '../../types/subscription.ts'; +import {initReplicationState} from '../replicator/schema/replication-state.ts'; import {BackupMonitor} from './backup-monitor.ts'; import type {ChangeStreamerService} from './change-streamer.ts'; import type {SnapshotMessage} from './snapshot.ts'; @@ -19,6 +21,7 @@ describe('change-streamer/backup-monitor', () => { }; let metricsResponse = 'unconfigured'; let monitor: BackupMonitor; + let replica: DbFile; function setMetricsResponse(watermark: string, timestamp: string) { // Sample response from prometheus metrics handler @@ -34,6 +37,17 @@ litestream_replica_validation_total{db="/tmp/zbugs-sync-replica.db",name="file", litestream_replica_validation_total{db="/tmp/zbugs-sync-replica.db",name="file",status="ok"} 0`; } + beforeAll(() => { + replica = new DbFile('backup_monitor_test'); + initReplicationState( + replica.connect(createSilentLogContext()), + ['zero_pub'], + '123', + ); + + return () => replica.delete(); + }); + beforeEach(() => { const lc = createSilentLogContext(); @@ -42,6 +56,7 @@ litestream_replica_validation_total{db="/tmp/zbugs-sync-replica.db",name="file", monitor = new BackupMonitor( lc, + replica.path, 's3://foo/bar', 'http://localhost:4850/metrics', changeStreamer as unknown as ChangeStreamerService, diff --git a/packages/zero-cache/src/services/change-streamer/backup-monitor.ts b/packages/zero-cache/src/services/change-streamer/backup-monitor.ts index bd7adfd113..d910fd5e9f 100644 --- a/packages/zero-cache/src/services/change-streamer/backup-monitor.ts +++ b/packages/zero-cache/src/services/change-streamer/backup-monitor.ts @@ -1,6 +1,8 @@ import type {LogContext} from '@rocicorp/logger'; import parsePrometheusTextFormat from 'parse-prometheus-text-format'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; +import {Database} from '../../../../zqlite/src/db.ts'; +import {getOrCreateGauge} from '../../observability/metrics.ts'; import {Subscription} from '../../types/subscription.ts'; import {RunningState} from '../running-state.ts'; import type {Service} from '../service.ts'; @@ -49,6 +51,7 @@ type Reservation = { export class BackupMonitor implements Service { readonly id = 'backup-monitor'; readonly #lc: LogContext; + readonly #replicaFile: string; readonly #backupURL: string; readonly #metricsEndpoint: string; readonly #changeStreamer: ChangeStreamerService; @@ -58,17 +61,20 @@ export class BackupMonitor implements Service { readonly #watermarks = new Map(); #lastWatermark: string = ''; + #latestBackupTime: Date | null = null; #cleanupDelayMs: number; #checkMetricsTimer: NodeJS.Timeout | undefined; constructor( lc: LogContext, + replicaFile: string, backupURL: string, metricsEndpoint: string, changeStreamer: ChangeStreamerService, initialCleanupDelayMs: number, ) { this.#lc = lc.withContext('component', this.id); + this.#replicaFile = replicaFile; this.#backupURL = backupURL; this.#metricsEndpoint = metricsEndpoint; this.#changeStreamer = changeStreamer; @@ -91,6 +97,7 @@ export class BackupMonitor implements Service { this.checkWatermarksAndScheduleCleanup, CHECK_INTERVAL_MS, ); + this.#initBackupLagMetric(); return this.#state.stopped(); } @@ -210,8 +217,10 @@ export class BackupMonitor implements Service { ` at ${time.toISOString()}.`, ); this.#watermarks.set(watermark, time); + this.#latestBackupTime = time; } } + return this.#latestBackupTime; } #scheduleCleanup() { @@ -254,4 +263,42 @@ export class BackupMonitor implements Service { this.#state.stop(this.#lc); return promiseVoid; } + + #initBackupLagMetric() { + getOrCreateGauge('replica', 'backup_lag', { + description: + 'Latency from when a change is written to the replica ' + + 'to when it is backed up to litestream. It is expected to create a saw ' + + 'pattern from 0 to the configured ZERO_LITESTREAM_INCREMENTAL_BACKUP_INTERVAL_MINUTES.', + unit: 'millisecond', + }).addCallback(async o => { + // For legacy litestream, we use the watermark metric (and its associated + // backup time) exported by litestream metrics to determine the time of + // of the backed up watermark. This is technically imprecise--it would be + // more correct to use the committed writeTimeMs--but it is good enough + // in that it serves the purpose of detecting a non-functioning backup. + // With litestream v5, this can be made more precise by querying the + // _zero.replicationState row from the backup directly using an LTX-based + // database reader. + const latestBackup = await this.#checkWatermarks(); + if (!latestBackup) { + this.#lc.warn?.( + `no backed up watermarks. unable to report replica.backup_lag`, + ); + return; + } + const db = new Database(this.#lc, this.#replicaFile, {readonly: true}); + try { + const {writeTimeMs} = db + .prepare(/*sql*/ `SELECT writeTimeMs FROM "_zero.replicationState"`) + .get<{writeTimeMs: number}>(); + const backupLag = Math.max(0, writeTimeMs - latestBackup.getTime()); + o.observe(backupLag); + } catch (e) { + this.#lc.warn?.(`error measuring replica.backup_lag metric`, e); + } finally { + db.close(); + } + }); + } } diff --git a/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts b/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts index 4f6c44c1e9..faea2f26d5 100644 --- a/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts +++ b/packages/zero-cache/src/services/replicator/schema/replication-state.test.ts @@ -2,10 +2,7 @@ import {beforeEach, describe, expect, test} from 'vitest'; import {createSilentLogContext} from '../../../../../shared/src/logging-test-utils.ts'; import {Database} from '../../../../../zqlite/src/db.ts'; import {StatementRunner} from '../../../db/statements.ts'; -import { - expectMatchingObjectsInTables, - expectTables, -} from '../../../test/lite.ts'; +import {expectMatchingObjectsInTables} from '../../../test/lite.ts'; import { getAscendingEvents, getReplicationState, @@ -41,6 +38,7 @@ describe('replicator/schema/replication-state', () => { { lock: 1, stateVersion: '0a', + writeTimeMs: expect.any(Number), }, ], ['_zero.runtimeEvents']: [ @@ -94,11 +92,12 @@ describe('replicator/schema/replication-state', () => { test('update watermark state', () => { updateReplicationWatermark(db, '0f'); - expectTables(db.db, { + expectMatchingObjectsInTables(db.db, { ['_zero.replicationState']: [ { lock: 1, stateVersion: '0f', + writeTimeMs: expect.any(Number), }, ], }); @@ -113,11 +112,12 @@ describe('replicator/schema/replication-state', () => { }); updateReplicationWatermark(db, '0r'); - expectTables(db.db, { + expectMatchingObjectsInTables(db.db, { ['_zero.replicationState']: [ { lock: 1, stateVersion: '0r', + writeTimeMs: expect.any(Number), }, ], }); diff --git a/packages/zero-cache/src/services/replicator/schema/replication-state.ts b/packages/zero-cache/src/services/replicator/schema/replication-state.ts index 29e7ab1297..49f9fe5c79 100644 --- a/packages/zero-cache/src/services/replicator/schema/replication-state.ts +++ b/packages/zero-cache/src/services/replicator/schema/replication-state.ts @@ -57,10 +57,12 @@ const CREATE_REPLICATION_STATE_SCHEMA = // `replicaVersion` and moving forward to each subsequent commit watermark // (e.g. corresponding to a Postgres LSN). Versions are represented as // lexicographically sortable watermarks (e.g. LexiVersions). + // writeTimeMs : The millisecond epoch at which this version was written to the replica. // - ` + /*sql*/ ` CREATE TABLE "_zero.replicationState" ( stateVersion TEXT NOT NULL, + writeTimeMs INTEGER, lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1) ); ` + @@ -130,11 +132,10 @@ export function initReplicationState( JSON.stringify(publications.sort()), stringify(initialSyncContext), ); - db.prepare( - ` - INSERT INTO "_zero.replicationState" (stateVersion) VALUES (?) - `, - ).run(watermark); + db.prepare(/*sql*/ ` + INSERT INTO "_zero.replicationState" (stateVersion, writeTimeMs) + VALUES (?, unixepoch('subsec') * 1000) + `).run(watermark); recordEvent(db, 'sync'); } @@ -196,7 +197,12 @@ export function updateReplicationWatermark( db: StatementRunner, watermark: string, ) { - db.run(`UPDATE "_zero.replicationState" SET stateVersion=?`, watermark); + db.run( + /*sql*/ ` + UPDATE "_zero.replicationState" + SET stateVersion=?, writeTimeMs=unixepoch('subsec') * 1000`, + watermark, + ); } export function getReplicationState(db: StatementRunner): ReplicationState { diff --git a/packages/zero-cache/src/workers/replicator.ts b/packages/zero-cache/src/workers/replicator.ts index 5797491fef..f919070e3f 100644 --- a/packages/zero-cache/src/workers/replicator.ts +++ b/packages/zero-cache/src/workers/replicator.ts @@ -29,6 +29,8 @@ export const replicaFileModeSchema = v.literalUnion( export type ReplicaFileMode = v.Infer; +export type WalMode = 'wal' | 'wal2'; + export function replicaFileName(replicaFile: string, mode: ReplicaFileMode) { return mode === 'serving-copy' ? `${replicaFile}-serving-copy` : replicaFile; } @@ -36,12 +38,12 @@ export function replicaFileName(replicaFile: string, mode: ReplicaFileMode) { const MILLIS_PER_HOUR = 1000 * 60 * 60; const MB = 1024 * 1024; -async function connect( +async function prepare( lc: LogContext, {file, vacuumIntervalHours}: ReplicaOptions, - walMode: 'wal' | 'wal2', + walMode: WalMode, mode: ReplicaFileMode, -): Promise { +): Promise<{file: string; walMode: WalMode}> { const replica = new Database(lc, file); // Perform any upgrades to the replica in case the backup is an @@ -93,7 +95,8 @@ async function connect( replica.pragma('optimize = 0x10002'); lc.info?.(`optimized ${file}`); - return replica; + replica.close(); + return {file, walMode}; } // Setting the journal_mode requires an exclusive lock on the replica. @@ -133,16 +136,16 @@ export function getPragmaConfig(mode: ReplicaFileMode): PragmaConfig { }; } -export async function setupReplica( +export function setupReplica( lc: LogContext, mode: ReplicaFileMode, replicaOptions: ReplicaOptions, -): Promise { +) { lc.info?.(`setting up ${mode} replica`); switch (mode) { case 'backup': - return await connect(lc, replicaOptions, 'wal', mode); + return prepare(lc, replicaOptions, 'wal', mode); case 'serving-copy': { // In 'serving-copy' mode, the original file is being used for 'backup' @@ -158,11 +161,11 @@ export async function setupReplica( replica.close(); lc.info?.(`finished copy (${Date.now() - start} ms)`); - return connect(lc, {...replicaOptions, file: copyLocation}, 'wal2', mode); + return prepare(lc, {...replicaOptions, file: copyLocation}, 'wal2', mode); } case 'serving': - return connect(lc, replicaOptions, 'wal2', mode); + return prepare(lc, replicaOptions, 'wal2', mode); default: throw new Error(`Invalid ReplicaMode ${mode}`); From 592c014d8b5422ad7c1d311ad985f4abb191c86d Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 2 Apr 2026 14:52:20 -0700 Subject: [PATCH 222/495] chore(zero-cache): fix server crash from usage metrics (#5747) Fix a server crash when debug-level logging is enabled and execSync returns an error. --- packages/zero-cache/src/server/anonymous-otel-start.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/zero-cache/src/server/anonymous-otel-start.ts b/packages/zero-cache/src/server/anonymous-otel-start.ts index 471e53497d..abd476cb30 100644 --- a/packages/zero-cache/src/server/anonymous-otel-start.ts +++ b/packages/zero-cache/src/server/anonymous-otel-start.ts @@ -431,7 +431,15 @@ class AnonymousTelemetryManager { return rootCommitHash.length === 40 ? rootCommitHash : 'unknown'; } catch (error) { - this.#lc?.debug?.('telemetry: unable to get Git root commit:', error); + // execSync throws a child_process.SpawnSyncReturns-shaped error with an + // output property (an array with stdio buffers) and sometimes a killed + // property that references back to the error itself — making it + // circular and causing stringify() in the Logger logic to throw. + const details = + error instanceof Error + ? {message: error.message, name: error.name, stack: error.stack} + : String(error); + this.#lc?.debug?.('telemetry: unable to get Git root commit:', details); return 'unknown'; } } From 5a6dabebfca676b4468d8869de064294c9edb182 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Thu, 2 Apr 2026 15:14:42 -0700 Subject: [PATCH 223/495] chore(zero-cache): satisfy oxfmt dep for analyze-query (#5748) --- package-lock.json | 63 ++++++++++++++++++++++++++++++++++++-- packages/zero/package.json | 1 + 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 52c69215da..75d6539603 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1031,6 +1031,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.49.2", "@algolia/requester-browser-xhr": "5.49.2", @@ -2054,6 +2055,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -3962,6 +3964,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -3984,6 +3987,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -6557,6 +6561,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6897,6 +6902,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7451,7 +7457,8 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz", "integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.20", @@ -9715,6 +9722,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -9845,6 +9853,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10041,6 +10050,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -10137,6 +10147,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -13307,6 +13318,7 @@ "integrity": "sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.5.0" }, @@ -15224,6 +15236,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15361,6 +15374,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.23" }, @@ -15378,6 +15392,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -15485,6 +15500,7 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -16051,6 +16067,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -16127,6 +16144,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -16646,6 +16664,7 @@ "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.2", @@ -16669,6 +16688,7 @@ "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/browser": "4.1.2", "@vitest/mocker": "4.1.2", @@ -17094,6 +17114,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -17179,6 +17200,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -17239,6 +17261,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.15.2", "@algolia/client-abtesting": "5.49.2", @@ -18463,6 +18486,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -20418,6 +20442,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -21524,6 +21549,7 @@ "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -23146,6 +23172,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24016,6 +24043,7 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.x" } @@ -24419,6 +24447,7 @@ "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -25632,6 +25661,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -26444,6 +26474,7 @@ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", @@ -29158,7 +29189,8 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/mri": { "version": "1.2.0", @@ -29203,6 +29235,7 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -29524,6 +29557,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -29927,6 +29961,7 @@ "integrity": "sha512-4F/NXJiK2KnK4LQiULUPXRzVq0LOfextGvwCVRW1VKQbF5epI3MDMEGVAl5XjAGL6IFc7xBc/eVA95wczPeEQg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -30399,6 +30434,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", @@ -30762,6 +30798,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -31975,6 +32012,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -32220,6 +32258,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "7.5.0", "@prisma/dev": "0.20.0", @@ -32650,6 +32689,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32662,6 +32702,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32736,6 +32777,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -32801,6 +32843,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -34047,6 +34090,7 @@ "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -34612,6 +34656,7 @@ "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", @@ -35403,6 +35448,7 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35597,6 +35643,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -36080,7 +36127,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.21.0", @@ -36346,6 +36394,7 @@ "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 18" }, @@ -36391,6 +36440,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -36754,6 +36804,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -37065,6 +37116,7 @@ "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", @@ -37214,6 +37266,7 @@ "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.1.2", "@vitest/mocker": "4.1.2", @@ -37333,6 +37386,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -38116,6 +38170,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -38225,6 +38280,7 @@ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "devOptional": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -39142,6 +39198,7 @@ "json-custom-numbers": "^3.1.1", "kasi": "^1.1.0", "nanoid": "^5.1.2", + "oxfmt": "^0.43.0", "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", diff --git a/packages/zero/package.json b/packages/zero/package.json index 8abb809508..c6a4ebcfcf 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -67,6 +67,7 @@ "json-custom-numbers": "^3.1.1", "kasi": "^1.1.0", "nanoid": "^5.1.2", + "oxfmt": "^0.43.0", "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", From b524a4799338897f0fe89eaa0bccb2d7a77931c6 Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Thu, 2 Apr 2026 21:09:27 -1000 Subject: [PATCH 224/495] chore(zero): Rework release.ts to improve interface. (#5749) The old interface was hard to use with the `--skip` flags, and also it didn't do a good job of actually skipping work. New interface: `node tools/release.ts canary|stable|retry ` See `--help` for more information. Also reworked and simplified implementation. --- packages/zero/tool/release.ts | 847 +++++++++++++++++++--------------- 1 file changed, 483 insertions(+), 364 deletions(-) diff --git a/packages/zero/tool/release.ts b/packages/zero/tool/release.ts index d743a9d255..3775716427 100644 --- a/packages/zero/tool/release.ts +++ b/packages/zero/tool/release.ts @@ -8,93 +8,194 @@ import { PROTOCOL_VERSION, } from '../../zero-protocol/src/protocol-version.ts'; -function basePath(...parts: string[]) { - return path.join(process.cwd(), ...parts); -} +void main(); -function execute( - command: string, - options?: {stdio?: 'inherit' | 'pipe' | undefined; cwd?: string | undefined}, -) { - console.log(`Executing: ${command}`); - return execSync(command, {stdio: 'inherit', ...options}) - ?.toString() - ?.trim(); -} +async function main() { + const {mode, from, remote, allowLocalChanges, dockerOnly} = parseArgs(); -function getPackageData(packagePath: fs.PathOrFileDescriptor) { - return JSON.parse(fs.readFileSync(packagePath, 'utf8')); -} + try { + // Find the git root directory + const gitRoot = execute('git rev-parse --show-toplevel', {stdio: 'pipe'}); + + const remotesOutput = execute('git remote', {stdio: 'pipe'}) ?? ''; + const remotes = remotesOutput.split('\n').filter(Boolean); + + if (!remotes.includes(remote)) { + console.error( + `Remote "${remote}" is not configured. Available remotes: ${remotes.join( + ', ', + )}`, + ); + process.exit(1); + } -function writePackageData(packagePath: fs.PathOrFileDescriptor, data: any) { - fs.writeFileSync(packagePath, JSON.stringify(data, null, 2)); -} + // Check that there are no uncommitted changes + if (!allowLocalChanges) { + const uncommittedChanges = execute('git status --porcelain', { + stdio: 'pipe', + }); + if (uncommittedChanges) { + console.error( + `There are uncommitted changes in the working directory.`, + ); + console.error(`Perhaps you need to commit them?`); + process.exit(1); + } + } -/** - * @param version - Base version from package.json (e.g., "0.24.0") - */ -function bumpCanaryVersion(version: string, remote: string) { - // Canary versions use the format: major.minor.patch-canary.attempt - // - // This ensures that canary versions are treated as prereleases in semver, - // so users with ^X.Y.Z in their package.json won't accidentally upgrade - // to untested canary builds. - // - // We determine the next attempt number by looking at existing git tags - // for this version. This works because: - // 1. Canaries are tagged but not merged back to the build branch - // 2. Git tags are the permanent record of what was released - // 3. Multiple canaries can exist for the same base version + const fromReleaseVersion = parseReleaseVersionFromTag(from); + if (mode === 'retry' && fromReleaseVersion === undefined) { + throw new Error( + 'retry mode requires to be an existing release tag (e.g. zero/v0.24.0-canary.3)', + ); + } - // Parse the base version (strip any existing -canary.N suffix) - const baseVersionMatch = version.match(/^(\d+\.\d+\.\d+)(?:-canary\.\d+)?$/); - if (!baseVersionMatch) { - throw new Error( - `Cannot parse version: ${version}. Expected format: X.Y.Z or X.Y.Z-canary.N`, + // For stable releases, we need to know the base version early + // Read it from the current working directory before we chdir + const zeroPackageJsonPath = path.join( + gitRoot, + 'packages', + 'zero', + 'package.json', ); - } - const baseVersion = baseVersionMatch[1]; + const packageData = getPackageData(zeroPackageJsonPath); + const currentVersion = packageData.version; - // Fetch tags to ensure we have the latest from remote - console.log(`Fetching tags from remote ${remote}...`); - execute(`git fetch ${remote} --tags`, {stdio: 'pipe'}); + // Check that the ref we're building from exists both locally and remotely + // and that they point to the same commit + console.log( + `Verifying ref ${from} exists and matches between local and remote ${remote}...`, + ); - // Find all canary tags for this base version - const tagPattern = `zero/v${baseVersion}-canary.*`; - const tagsOutput = execute(`git tag -l "${tagPattern}"`, {stdio: 'pipe'}); + let localRefHash; + let remoteRefHash; - let maxAttempt = -1; - if (tagsOutput) { - const tags = tagsOutput.split('\n').filter(Boolean); - const attemptRegex = new RegExp( - `^zero/v${baseVersion.replace(/\./g, '\\.')}-canary\\.(\\d+)$`, - ); + // Get local ref hash + try { + localRefHash = execute(`git rev-parse ${from}`, {stdio: 'pipe'}); + } catch { + console.error(`Could not resolve local ref: ${from}`); + console.error(`Make sure the branch/tag exists locally`); + process.exit(1); + } - for (const tag of tags) { - const match = tag.match(attemptRegex); - if (match) { - const attempt = parseInt(match[1]); - if (attempt > maxAttempt) { - maxAttempt = attempt; - } + // Get remote ref hash + try { + // For branches, check remote/branch + // For tags, just check the tag (tags are fetched from remote) + remoteRefHash = execute(`git rev-parse ${remote}/${from}`, { + stdio: 'pipe', + }); + } catch { + // If remote/from doesn't exist, try just the ref (works for tags) + try { + // For tags, we need to ensure we have the latest from remote + execute(`git fetch ${remote} tag ${from}`, {stdio: 'pipe'}); + remoteRefHash = execute(`git rev-parse ${from}`, {stdio: 'pipe'}); + } catch { + console.error(`Could not resolve remote ref: ${from}`); + console.error(`Make sure the branch/tag has been pushed to ${remote}`); + process.exit(1); } } - } - const nextAttempt = maxAttempt + 1; - const nextVersion = `${baseVersion}-canary.${nextAttempt}`; + if (localRefHash !== remoteRefHash) { + console.error(`Local and remote versions of ${from} do not match`); + console.error(`Local: ${localRefHash}`); + console.error(`Remote: ${remoteRefHash}`); + console.error(`Perhaps you need to push your changes?`); + process.exit(1); + } - console.log( - `Found ${maxAttempt + 1} existing canary tag(s) for v${baseVersion}`, - ); - console.log(`Next canary version: ${nextVersion}`); + console.log(`✓ Ref ${from} matches between local and remote`); - return nextVersion; + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'zero-build-')); + + // Copy the working directory to temp dir (faster than cloning) + console.log(`Copying repo from ${gitRoot} to ${tempDir}...`); + execute( + `rsync -a --progress --exclude=node_modules --exclude=.turbo ${gitRoot}/ ${tempDir}/`, + ); + process.chdir(tempDir); + + // Discard any local changes and checkout the correct ref + execute('git reset --hard'); + execute(`git fetch ${remote}`); + + // Try to checkout as remote/branch first, fall back to tag/commit + try { + execute(`git checkout ${remote}/${from}`); + } catch { + execute(`git checkout ${from}`); + } + + let result: Release; + if (mode === 'canary') { + result = await releaseCanary(currentVersion, remote, from); + } else if (mode === 'stable') { + result = await releaseStable(currentVersion, remote, from); + } else { + if (mode !== 'retry') { + throw new Error(`Unexpected release mode: ${mode}`); + } + result = await retryRelease( + currentVersion, + from, + fromReleaseVersion, + dockerOnly, + ); + } + + console.log(``); + console.log(``); + console.log(`🎉 Success!`); + console.log(``); + if (result.pushedGit) { + console.log(`* Pushed Git tag ${result.tagName} to ${remote}.`); + } + if (result.pushedNPM) { + console.log(`* Published @rocicorp/zero@${result.version} to npm.`); + } + console.log(`* Created Docker image rocicorp/zero:${result.version}.`); + console.log(``); + console.log(``); + console.log(`Next steps:`); + console.log(``); + console.log('* Run `git pull --tags` in your checkout to pull the tag.'); + console.log( + `* Test apps by installing: npm install @rocicorp/zero@${result.version}`, + ); + if (result.version.includes('-canary.')) { + console.log('* When ready to promote to stable:'); + console.log( + ` 1. Update base version in package.json if needed: node bump-version.js X.Y.Z`, + ); + console.log(` 2. Run: node release.ts stable `); + console.log( + ` 3. When ready for users: npm dist-tag add @rocicorp/zero@X.Y.Z latest`, + ); + } else { + console.log('* When ready for users to install:'); + console.log(` npm dist-tag add @rocicorp/zero@${result.version} latest`); + } + console.log(``); + } catch (error) { + // oxlint-disable-next-line restrict-template-expressions + console.error(`Error during execution: ${error}`); + process.exit(1); + } } -/** - * Parse command line arguments - */ +type ReleaseMode = 'canary' | 'stable' | 'retry'; + +type Release = { + version: string; + pushedGit: boolean; + pushedNPM: boolean; + tagName: string; +}; + +/** Parse command line arguments */ function parseArgs() { const optionDefinitions = [ { @@ -103,18 +204,6 @@ function parseArgs() { type: Boolean, description: 'Display this usage guide', }, - { - name: 'from', - type: String, - description: 'Branch, tag, or commit to build from (required)', - }, - { - name: 'stable', - alias: 's', - type: Boolean, - description: - 'Create a stable release using base version. If not provided, creates a canary release (auto-calculated version)', - }, { name: 'remote', type: String, @@ -127,21 +216,15 @@ function parseArgs() { 'Allow running with local changes in the working directory (useful for developing script)', }, { - name: 'skip-git', - type: Boolean, - description: - 'Skip git tag and push (use when retrying after git succeeded)', - }, - { - name: 'skip-npm', + name: 'docker-only', type: Boolean, - description: 'Skip npm publish (use when retrying after npm succeeded)', + description: 'Retry mode only: skip npm and publish only docker', }, { - name: 'skip-docker', - type: Boolean, - description: - 'Skip docker build and push (use when retrying after docker succeeded)', + name: 'positionals', + type: String, + defaultOption: true, + multiple: true, }, ]; @@ -150,232 +233,307 @@ function parseArgs() { options = commandLineArgs(optionDefinitions); } catch (e) { console.error(`Error: ${String(e)}`); - showHelp(optionDefinitions); + showHelp(); process.exit(1); } if (options.help) { - showHelp(optionDefinitions); + showHelp(); process.exit(0); } - if (!options.from) { - console.error('Error: --from is required'); - console.error(''); - showHelp(optionDefinitions); + const positionals = Array.isArray(options.positionals) + ? options.positionals + : []; + + if (positionals.length < 2) { + console.error('Error: Missing required arguments: '); + showHelp(); process.exit(1); } - const isCanary = !options.stable; - const remote = options.remote || 'origin'; + if (positionals.length > 2) { + console.error(`Error: Unexpected argument ${positionals[2]}`); + showHelp(); + process.exit(1); + } + + const modeArg = positionals[0]; + if (modeArg !== 'canary' && modeArg !== 'stable' && modeArg !== 'retry') { + console.error(`Error: Unknown mode ${modeArg}`); + showHelp(); + process.exit(1); + } + + const dockerOnly = Boolean(options['docker-only']); + if (dockerOnly && modeArg !== 'retry') { + console.error('--docker-only is only supported with retry mode'); + process.exit(1); + } return { - from: options.from, - isCanary, - remote, + mode: modeArg as ReleaseMode, + from: positionals[1], + remote: options.remote || 'origin', allowLocalChanges: Boolean(options['allow-local-changes']), - skipGit: Boolean(options['skip-git']), - skipNpm: Boolean(options['skip-npm']), - skipDocker: Boolean(options['skip-docker']), + dockerOnly, }; } /** Display help message */ -function showHelp(optionDefinitions: Array) { +function showHelp() { console.log(` -Usage: node release.ts [options] +Usage: node release.ts [options] Creates canary or stable release builds for @rocicorp/zero. -Default: Creates a canary release (safer, can be repeated) - Modes: - Canary (default): Builds from branch/tag/commit, auto-calculates version from git tags - Stable (--stable): Builds from branch/tag/commit using base version from package.json - -Options:`); - - for (const opt of optionDefinitions) { - const flags = opt.alias ? `-${opt.alias}, --${opt.name}` : `--${opt.name}`; - console.log(` ${flags.padEnd(25)} ${opt.description}`); - } + canary Builds from branch/tag/commit, auto-calculates version from git tags + stable Builds from branch/tag/commit using base version from package.json + retry Reuses exact tagged version, skips git tag/push + +Options: + -h, --help Display this usage guide + --remote Git remote to use (default: origin) + --allow-local-changes Allow running with local changes in working directory + --docker-only Retry mode only: skip npm and publish only docker +`); console.log(` Canary Examples: - node release.ts --from main # Build canary from main - node release.ts --from maint/zero/v0.24 # Build canary from maintenance branch - node release.ts --from zero/v0.24.0 # Build canary from specific tag + node release.ts canary main # Build canary from main + node release.ts canary maint/zero/v0.24 # Build canary from maintenance branch + node release.ts canary zero/v0.24.0 # Build new canary from tagged code Stable Release Examples: - node release.ts --stable --from zero/v0.24.0-canary.3 # Promote specific canary to stable + node release.ts stable main # Build stable release from main + node release.ts stable maint/zero/v0.24 # Build stable release from maintenance branch + node release.ts stable 4f2c1a9 # Build stable release from specific commit + node release.ts stable main --remote upstream # Build stable release against non-origin remote + +Retry Examples: + node release.ts retry zero/v0.24.0-canary.3 # Retry npm and docker from existing tag + node release.ts retry --docker-only zero/v0.24.0-canary.3 # Retry just docker Maintenance/cherry-pick workflow: 1. Create a maintenance branch from tag: git checkout -b maint/zero/v0.24 zero/v0.24.0 2. Cherry-pick commits: git cherry-pick -x 3. Push to origin: git push origin maint/zero/v0.24 - 4. Run: node release.ts --from maint/zero/v0.24 - -Retrying after partial failure: - node release.ts --from main --skip-git --skip-npm # Retry just docker - node release.ts --from main --skip-git # Retry npm and docker + 4. Run: node release.ts canary maint/zero/v0.24 `); } -const { - from: fromArg, - isCanary, - remote, - allowLocalChanges, - skipGit, - skipNpm, - skipDocker, -} = parseArgs(); - -try { - // Find the git root directory - const gitRoot = execute('git rev-parse --show-toplevel', {stdio: 'pipe'}); - - const remotesOutput = execute('git remote', {stdio: 'pipe'}) ?? ''; - const remotes = remotesOutput.split('\n').filter(Boolean); - - if (!remotes.includes(remote)) { - console.error( - `Remote "${remote}" is not configured. Available remotes: ${remotes.join( - ', ', - )}`, - ); - process.exit(1); - } +function parseReleaseVersionFromTag(ref: string) { + const match = ref.match(/^zero\/v(\d+\.\d+\.\d+(?:-canary\.\d+)?)$/); + return match?.[1]; +} - // Check that there are no uncommitted changes - if (!allowLocalChanges) { - const uncommittedChanges = execute('git status --porcelain', { - stdio: 'pipe', - }); - if (uncommittedChanges) { - console.error(`There are uncommitted changes in the working directory.`); - console.error(`Perhaps you need to commit them?`); - process.exit(1); - } +async function releaseCanary( + currentVersion: string, + remote: string, + from: string, +): Promise { + const version = bumpCanaryVersion(currentVersion, remote); + const tagName = `zero/v${version}`; + + logReleaseHeader( + `Creating canary release from ${from}`, + currentVersion, + version, + ); + + build(version); + execute(`git commit -am "Bump version to ${version}"`); + + const releaseCommitHash = execute('git rev-parse HEAD', {stdio: 'pipe'}); + if (!releaseCommitHash) { + throw new Error('Could not resolve HEAD commit for git tag push'); } + pushGit(releaseCommitHash, tagName, remote); + pushNPM(version, true); + await pushDocker(version); - const from = fromArg; + return { + version, + pushedGit: true, + pushedNPM: true, + tagName, + }; +} - // For stable releases, we need to know the base version early - // Read it from the current working directory before we chdir - const ZERO_PACKAGE_JSON_PATH = path.join( - gitRoot, - 'packages', - 'zero', - 'package.json', +async function releaseStable( + currentVersion: string, + remote: string, + from: string, +): Promise { + const tagName = `zero/v${currentVersion}`; + + logReleaseHeader( + `Creating stable release from ${from}`, + currentVersion, + currentVersion, ); - const packageData = getPackageData(ZERO_PACKAGE_JSON_PATH); - const currentVersion = packageData.version; - // Calculate what the next version will be - let nextVersion; - if (isCanary) { - nextVersion = bumpCanaryVersion(currentVersion, remote); - } else { - nextVersion = currentVersion; + build(currentVersion); + + const releaseCommitHash = execute('git rev-parse HEAD', {stdio: 'pipe'}); + if (!releaseCommitHash) { + throw new Error('Could not resolve HEAD commit for git tag push'); } + pushGit(releaseCommitHash, tagName, remote); + pushNPM(currentVersion, false); + await pushDocker(currentVersion); - console.log(''); - console.log('='.repeat(60)); - if (isCanary) { - console.log(`Creating canary release from ${from}`); - } else { - console.log(`Creating stable release from ${from}`); + return { + version: currentVersion, + pushedGit: true, + pushedNPM: true, + tagName, + }; +} + +async function retryRelease( + currentVersion: string, + from: string, + fromReleaseVersion: string | undefined, + dockerOnly: boolean, +): Promise { + if (fromReleaseVersion === undefined) { + throw new Error( + 'retry mode requires to be an existing release tag (e.g. zero/v0.24.0-canary.3)', + ); } - console.log(`Current version: ${currentVersion}`); - console.log(`Target version: ${nextVersion}`); - console.log('='.repeat(60)); - console.log(''); - // Check that the ref we're building from exists both locally and remotely - // and that they point to the same commit - console.log( - `Verifying ref ${from} exists and matches between local and remote ${remote}...`, - ); + const isCanary = fromReleaseVersion.includes('-canary.'); + const tagName = `zero/v${fromReleaseVersion}`; - let localRefHash; - let remoteRefHash; + logReleaseHeader( + `Retrying ${isCanary ? 'canary' : 'stable'} release from ${from}`, + currentVersion, + fromReleaseVersion, + {skipGit: true, skipNPM: dockerOnly}, + ); - // Get local ref hash - try { - localRefHash = execute(`git rev-parse ${from}`, {stdio: 'pipe'}); - } catch { - console.error(`Could not resolve local ref: ${from}`); - console.error(`Make sure the branch/tag exists locally`); - process.exit(1); + if (dockerOnly) { + console.log('Skipping npm publish (--docker-only)'); + } else { + build(fromReleaseVersion); + pushNPM(fromReleaseVersion, isCanary); } - // Get remote ref hash - try { - // For branches, check remote/branch - // For tags, just check the tag (tags are fetched from remote) - remoteRefHash = execute(`git rev-parse ${remote}/${from}`, { - stdio: 'pipe', - }); - } catch { - // If remote/from doesn't exist, try just the ref (works for tags) - try { - // For tags, we need to ensure we have the latest from remote - execute(`git fetch ${remote} tag ${from}`, {stdio: 'pipe'}); - remoteRefHash = execute(`git rev-parse ${from}`, {stdio: 'pipe'}); - } catch { - console.error(`Could not resolve remote ref: ${from}`); - console.error(`Make sure the branch/tag has been pushed to ${remote}`); - process.exit(1); - } - } + await pushDocker(fromReleaseVersion); - if (localRefHash !== remoteRefHash) { - console.error(`Local and remote versions of ${from} do not match`); - console.error(`Local: ${localRefHash}`); - console.error(`Remote: ${remoteRefHash}`); - console.error(`Perhaps you need to push your changes?`); - process.exit(1); + return { + version: fromReleaseVersion, + pushedGit: false, + pushedNPM: !dockerOnly, + tagName, + }; +} + +/** + * @param version - Base version from package.json (e.g., "0.24.0") + */ +function bumpCanaryVersion(version: string, remote: string) { + // Canary versions use the format: major.minor.patch-canary.attempt + // + // This ensures that canary versions are treated as prereleases in semver, + // so users with ^X.Y.Z in their package.json won't accidentally upgrade + // to untested canary builds. + // + // We determine the next attempt number by looking at existing git tags + // for this version. This works because: + // 1. Canaries are tagged but not merged back to the build branch + // 2. Git tags are the permanent record of what was released + // 3. Multiple canaries can exist for the same base version + + // Parse the base version (strip any existing -canary.N suffix) + const baseVersionMatch = version.match(/^(\d+\.\d+\.\d+)(?:-canary\.\d+)?$/); + if (!baseVersionMatch) { + throw new Error( + `Cannot parse version: ${version}. Expected format: X.Y.Z or X.Y.Z-canary.N`, + ); } + const baseVersion = baseVersionMatch[1]; + + // Fetch tags to ensure we have the latest from remote + console.log(`Fetching tags from remote ${remote}...`); + execute(`git fetch ${remote} --tags`, {stdio: 'pipe'}); + + // Find all canary tags for this base version + const tagPattern = `zero/v${baseVersion}-canary.*`; + const tagsOutput = execute(`git tag -l "${tagPattern}"`, {stdio: 'pipe'}); + + let maxAttempt = -1; + if (tagsOutput) { + const tags = tagsOutput.split('\n').filter(Boolean); + const attemptRegex = new RegExp( + `^zero/v${baseVersion.replace(/\./g, '\\.')}-canary\\.(\\d+)$`, + ); - console.log(`✓ Ref ${from} matches between local and remote`); + for (const tag of tags) { + const match = tag.match(attemptRegex); + if (match) { + const attempt = parseInt(match[1]); + if (attempt > maxAttempt) { + maxAttempt = attempt; + } + } + } + } - const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'zero-build-')); + const nextAttempt = maxAttempt + 1; + const nextVersion = `${baseVersion}-canary.${nextAttempt}`; - // Copy the working directory to temp dir (faster than cloning) - console.log(`Copying repo from ${gitRoot} to ${tempDir}...`); - execute( - `rsync -a --progress --exclude=node_modules --exclude=.turbo ${gitRoot}/ ${tempDir}/`, + console.log( + `Found ${maxAttempt + 1} existing canary tag(s) for v${baseVersion}`, ); - process.chdir(tempDir); + console.log(`Next canary version: ${nextVersion}`); - // Discard any local changes and checkout the correct ref - execute('git reset --hard'); - execute(`git fetch ${remote}`); + return nextVersion; +} - // Try to checkout as remote/branch first, fall back to tag/commit - try { - execute(`git checkout ${remote}/${from}`); - } catch { - execute(`git checkout ${from}`); +function logReleaseHeader( + summary: string, + currentVersion: string, + nextVersion: string, + options?: {skipGit?: boolean | undefined; skipNPM?: boolean | undefined}, +) { + console.log(''); + console.log('='.repeat(60)); + console.log(summary); + console.log(`Current version: ${currentVersion}`); + console.log(`Target version: ${nextVersion}`); + if (options?.skipGit) { + console.log(`Git tag/push: skipped`); + } + if (options?.skipNPM) { + console.log(`npm publish: skipped`); } + console.log('='.repeat(60)); + console.log(''); +} - //installs turbo and other build dependencies +function build(version: string) { + // Installs turbo and other build dependencies needed for npm packaging. execute('npm install'); - // After chdir, use basePath() which is now relative to temp directory - const ZERO_PACKAGE_JSON_PATH_IN_TEMP = basePath( + setVersionInWorkspace(version); + execute('npm install'); + execute('npm run build'); + execute('npm run format'); + execute('npx -y syncpack fix'); + execute('git status'); +} + +function setVersionInWorkspace(version: string) { + const zeroPackageJsonPathInTemp = basePath( 'packages', 'zero', 'package.json', ); - const currentPackageData = getPackageData(ZERO_PACKAGE_JSON_PATH_IN_TEMP); - - // Update the package.json with the new version - currentPackageData.version = nextVersion; - - const tagName = `zero/v${nextVersion}`; - - writePackageData(ZERO_PACKAGE_JSON_PATH_IN_TEMP, currentPackageData); + const currentPackageData = getPackageData(zeroPackageJsonPathInTemp); + currentPackageData.version = version; + writePackageData(zeroPackageJsonPathInTemp, currentPackageData); const dependencyPaths = [ basePath('apps', 'zbugs', 'package.json'), @@ -385,129 +543,90 @@ try { dependencyPaths.forEach(p => { const data = getPackageData(p); if (data.dependencies && data.dependencies['@rocicorp/zero']) { - data.dependencies['@rocicorp/zero'] = nextVersion; + data.dependencies['@rocicorp/zero'] = version; writePackageData(p, data); } }); +} - execute('npm install'); - execute('npm run build'); - execute('npm run format'); - execute('npx -y syncpack fix'); - - execute('git status'); +function pushGit(commitHash: string, destTag: string, remote: string) { + execute(`git tag ${destTag} ${commitHash}`); + execute(`git push ${remote} refs/tags/${destTag}`); +} +function pushNPM(version: string, isCanary: boolean) { if (isCanary) { - execute(`git commit -am "Bump version to ${nextVersion}"`); + execute('npm publish --tag=canary', {cwd: basePath('packages', 'zero')}); + execute(`npm dist-tag rm @rocicorp/zero@${version} canary`); + return; } - // Push tag to git before npm so that if npm fails the versioning logic works correctly. - // Also if npm push succeeds but docker fails we correctly record the tag that the - // npm version was made. - // Note: We don't merge back to the build branch - canaries are throwaway builds - // that exist only as tagged commits. - if (skipGit) { - console.log('Skipping git tag and push (--skip-git)'); - } else { - execute(`git tag --force ${tagName}`); - execute(`git push --force ${remote} ${tagName}`); - } + // For stable releases, publish without a dist-tag (we'll add 'latest' separately). + execute('npm publish --tag=staging', {cwd: basePath('packages', 'zero')}); + execute(`npm dist-tag rm @rocicorp/zero@${version} staging`); +} - if (skipNpm) { - console.log('Skipping npm publish (--skip-npm)'); - } else if (isCanary) { - execute('npm publish --tag=canary', {cwd: basePath('packages', 'zero')}); - execute(`npm dist-tag rm @rocicorp/zero@${nextVersion} canary`); - } else { - // For stable releases, publish without a dist-tag (we'll add 'latest' separately) - execute('npm publish --tag=staging', {cwd: basePath('packages', 'zero')}); - execute(`npm dist-tag rm @rocicorp/zero@${nextVersion} staging`); +async function pushDocker(version: string) { + try { + // Check if our specific multiarch builder exists + const builders = execute('docker buildx ls', {stdio: 'pipe'}); + const hasMultiArchBuilder = builders.includes('zero-multiarch'); + + if (!hasMultiArchBuilder) { + console.log('Setting up multi-architecture builder...'); + execute( + 'docker buildx create --name zero-multiarch --driver docker-container --bootstrap', + ); + } + execute('docker buildx use zero-multiarch'); + execute('docker buildx inspect zero-multiarch --bootstrap'); + } catch (e) { + console.error('Failed to set up Docker buildx:', e); + throw e; } - if (skipDocker) { - console.log('Skipping docker build and push (--skip-docker)'); - } else { + for (let i = 0; i < 3; i++) { try { - // Check if our specific multiarch builder exists - const builders = execute('docker buildx ls', {stdio: 'pipe'}); - const hasMultiArchBuilder = builders.includes('zero-multiarch'); - - if (!hasMultiArchBuilder) { - console.log('Setting up multi-architecture builder...'); - execute( - 'docker buildx create --name zero-multiarch --driver docker-container --bootstrap', - ); - } - execute('docker buildx use zero-multiarch'); - execute('docker buildx inspect zero-multiarch --bootstrap'); - } catch (e) { - console.error('Failed to set up Docker buildx:', e); - throw e; - } - - for (let i = 0; i < 3; i++) { - try { - execute( - `docker buildx build \ - --platform linux/amd64,linux/arm64 \ - --build-arg=ZERO_VERSION=${nextVersion} \ - --build-arg=ZERO_SYNC_PROTOCOL_VERSION=${PROTOCOL_VERSION} \ - --build-arg=ZERO_MIN_SUPPORTED_SYNC_PROTOCOL_VERSION=${MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} \ - -t rocicorp/zero:${nextVersion} \ + execute( + `docker buildx build \\ + --platform linux/amd64,linux/arm64 \\ + --build-arg=ZERO_VERSION=${version} \\ + --build-arg=ZERO_SYNC_PROTOCOL_VERSION=${PROTOCOL_VERSION} \\ + --build-arg=ZERO_MIN_SUPPORTED_SYNC_PROTOCOL_VERSION=${MIN_SERVER_SUPPORTED_SYNC_PROTOCOL} \\ + -t rocicorp/zero:${version} \\ --push .`, - {cwd: basePath('packages', 'zero')}, - ); - } catch (e) { - if (i < 3) { - console.error( - `Error building docker image, retrying in 10 seconds...`, - ); - await new Promise(resolve => setTimeout(resolve, 10_000)); - continue; - } - throw e; + {cwd: basePath('packages', 'zero')}, + ); + } catch (e) { + if (i < 3) { + console.error(`Error building docker image, retrying in 10 seconds...`); + await new Promise(resolve => setTimeout(resolve, 10_000)); + continue; } - break; + throw e; } + break; } +} - console.log(``); - console.log(``); - console.log(`🎉 Success!`); - console.log(``); - if (!skipGit) { - console.log(`* Pushed Git tag ${tagName} to ${remote}.`); - } - if (!skipNpm) { - console.log(`* Published @rocicorp/zero@${nextVersion} to npm.`); - } - if (!skipDocker) { - console.log(`* Created Docker image rocicorp/zero:${nextVersion}.`); - } - console.log(``); - console.log(``); - console.log(`Next steps:`); - console.log(``); - console.log('* Run `git pull --tags` in your checkout to pull the tag.'); - console.log( - `* Test apps by installing: npm install @rocicorp/zero@${nextVersion}`, - ); - if (isCanary) { - console.log('* When ready to promote to stable:'); - console.log( - ` 1. Update base version in package.json if needed: node bump-version.js X.Y.Z`, - ); - console.log(` 2. Run: node release.ts --stable --from ${tagName}`); - console.log( - ` 3. When ready for users: npm dist-tag add @rocicorp/zero@X.Y.Z latest`, - ); - } else { - console.log('* When ready for users to install:'); - console.log(` npm dist-tag add @rocicorp/zero@${nextVersion} latest`); - } - console.log(``); -} catch (error) { - // oxlint-disable-next-line restrict-template-expressions - console.error(`Error during execution: ${error}`); - process.exit(1); +function execute( + command: string, + options?: {stdio?: 'inherit' | 'pipe' | undefined; cwd?: string | undefined}, +) { + console.log(`Executing: ${command}`); + return execSync(command, {stdio: 'inherit', ...options}) + ?.toString() + ?.trim(); +} + +function getPackageData(packagePath: fs.PathOrFileDescriptor) { + return JSON.parse(fs.readFileSync(packagePath, 'utf8')); +} + +function writePackageData(packagePath: fs.PathOrFileDescriptor, data: any) { + fs.writeFileSync(packagePath, JSON.stringify(data, null, 2)); +} + +function basePath(...parts: string[]) { + return path.join(process.cwd(), ...parts); } From 930f3ec2fbe25da0440c5e90e8dcfab91b826b46 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 3 Apr 2026 10:19:08 +0200 Subject: [PATCH 225/495] chore: Add oxfmt to devDependencies when used (#5750) --- apps/otel-proxy/package.json | 1 + apps/zbugs/package.json | 1 + package-lock.json | 101 ++++++++----------- packages/analyze-query/package.json | 1 + packages/datadog/package.json | 1 + packages/otel/package.json | 1 + packages/replicache-perf/package.json | 3 + packages/replicache/package.json | 1 + packages/shared/package.json | 1 + packages/z2s/package.json | 1 + packages/zero-cache/package.json | 1 + packages/zero-client/package.json | 1 + packages/zero-events/package.json | 1 + packages/zero-pg/package.json | 1 + packages/zero-protocol/package.json | 1 + packages/zero-react-native/package.json | 1 + packages/zero-react/package.json | 1 + packages/zero-schema/package.json | 1 + packages/zero-server/package.json | 3 +- packages/zero-solid/package.json | 1 + packages/zero-types/package.json | 1 + packages/zero/package.json | 2 +- packages/zql-benchmarks/package.json | 7 +- packages/zql-integration-tests/package.json | 5 +- packages/zql/package.json | 1 + packages/zqlite-zql-test/package.json | 1 + packages/zqlite/package.json | 1 + prod/functions/package.json | 4 +- prod/package.json | 3 + prod/sst/package.json | 3 +- tools/client-simulator/package.json | 1 + tools/load-generator/package.json | 1 + tools/process-tracker/package.json | 1 + tools/sqlite-io-yield-simulator/package.json | 1 + tools/verify-package-deps/package.json | 1 + 35 files changed, 87 insertions(+), 70 deletions(-) diff --git a/apps/otel-proxy/package.json b/apps/otel-proxy/package.json index cd1329e5e5..f52ce5b19a 100644 --- a/apps/otel-proxy/package.json +++ b/apps/otel-proxy/package.json @@ -19,6 +19,7 @@ "devDependencies": { "@types/node": "^22.10.5", "@vitest/coverage-v8": "4.1.2", + "oxfmt": "^0.43.0", "typescript": "~5.9.3", "vitest": "4.1.2" } diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index fa817f1ebd..848f790c08 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -83,6 +83,7 @@ "@vitest/runner": "4.1.2", "drizzle-kit": "^0.31.10", "drizzle-orm": "^0.45.1", + "oxfmt": "^0.43.0", "postcss-preset-env": "^7.4.3", "rehype-video": "^2.3.0", "shared": "0.0.0", diff --git a/package-lock.json b/package-lock.json index 75d6539603..d40c246971 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "devDependencies": { "@types/node": "^22.10.5", "@vitest/coverage-v8": "4.1.2", + "oxfmt": "^0.43.0", "typescript": "~5.9.3", "vitest": "4.1.2" } @@ -93,6 +94,7 @@ "@vitest/runner": "4.1.2", "drizzle-kit": "^0.31.10", "drizzle-orm": "^0.45.1", + "oxfmt": "^0.43.0", "postcss-preset-env": "^7.4.3", "rehype-video": "^2.3.0", "shared": "0.0.0", @@ -1031,7 +1033,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.49.2", "@algolia/requester-browser-xhr": "5.49.2", @@ -2055,7 +2056,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -3964,7 +3964,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -3987,7 +3986,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -6561,7 +6559,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6902,7 +6899,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -7457,8 +7453,7 @@ "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz", "integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.0.20", @@ -9722,7 +9717,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -9853,7 +9847,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -10050,7 +10043,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10147,7 +10139,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -13318,7 +13309,6 @@ "integrity": "sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/client-runtime-utils": "7.5.0" }, @@ -15236,7 +15226,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -15374,7 +15363,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", - "peer": true, "dependencies": { "@tanstack/virtual-core": "3.13.23" }, @@ -15392,7 +15380,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -15500,7 +15487,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -16067,7 +16053,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -16144,7 +16129,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -16664,7 +16648,6 @@ "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.2", @@ -16688,7 +16671,6 @@ "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.1.2", "@vitest/mocker": "4.1.2", @@ -17114,7 +17096,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -17200,7 +17181,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -17261,7 +17241,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.15.2", "@algolia/client-abtesting": "5.49.2", @@ -18486,7 +18465,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -20442,7 +20420,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -21549,7 +21526,6 @@ "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -23172,7 +23148,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24043,7 +24018,6 @@ "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10.x" } @@ -24447,7 +24421,6 @@ "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -25661,7 +25634,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -26474,7 +26446,6 @@ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", @@ -29189,8 +29160,7 @@ "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", @@ -29235,7 +29205,6 @@ "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -29557,7 +29526,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -29961,7 +29929,6 @@ "integrity": "sha512-4F/NXJiK2KnK4LQiULUPXRzVq0LOfextGvwCVRW1VKQbF5epI3MDMEGVAl5XjAGL6IFc7xBc/eVA95wczPeEQg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "tsgolint": "bin/tsgolint.js" }, @@ -30434,7 +30401,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", @@ -30798,7 +30764,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -32012,7 +31977,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -32258,7 +32222,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "7.5.0", "@prisma/dev": "0.20.0", @@ -32689,7 +32652,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -32702,7 +32664,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32777,7 +32738,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -32843,7 +32803,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -34090,7 +34049,6 @@ "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -34656,7 +34614,6 @@ "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", @@ -35448,7 +35405,6 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -35643,7 +35599,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -36127,8 +36082,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", @@ -36394,7 +36348,6 @@ "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 18" }, @@ -36440,7 +36393,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -36804,7 +36756,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -37116,7 +37067,6 @@ "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", @@ -37266,7 +37216,6 @@ "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.1.2", "@vitest/mocker": "4.1.2", @@ -37386,7 +37335,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -38170,7 +38118,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -38280,7 +38227,6 @@ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "devOptional": true, "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -38562,6 +38508,7 @@ "devDependencies": { "ast-to-zql": "0.0.0", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "vitest": "4.1.2", "zero-cache": "0.0.0", @@ -38592,6 +38539,7 @@ "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", "@vitest/runner": "4.1.2", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.1.2" @@ -38603,6 +38551,7 @@ "@opentelemetry/api": "^1.9.0" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0" } }, @@ -38628,6 +38577,7 @@ "compare-utf8": "^0.2.0", "esbuild": "^0.27.4", "expo-sqlite": ">=15", + "oxfmt": "^0.43.0", "playwright": "^1.53.2", "shared": "0.0.0", "typescript": "~5.9.3", @@ -38694,6 +38644,9 @@ "typescript": "~5.9.3", "vite": "8.0.3", "xbytes": "^1.7.0" + }, + "devDependencies": { + "oxfmt": "^0.43.0" } }, "packages/replicache-perf/node_modules/@oxc-project/types": { @@ -39112,6 +39065,7 @@ "@vitest/runner": "4.1.2", "compare-utf8": "^0.2.0", "fast-check": "^3.18.0", + "oxfmt": "^0.43.0", "package-up": "^5.0.0", "playwright": "^1.53.2", "type-fest": "^4.30.0", @@ -39142,6 +39096,7 @@ "@faker-js/faker": "^9.6.0", "@types/pg": "^8.11.11", "@vitest/runner": "4.1.2", + "oxfmt": "^0.43.0", "pg": "^8.16.3", "shared": "0.0.0", "vitest": "4.1.2", @@ -39198,7 +39153,6 @@ "json-custom-numbers": "^3.1.1", "kasi": "^1.1.0", "nanoid": "^5.1.2", - "oxfmt": "^0.43.0", "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", @@ -39224,6 +39178,7 @@ "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", "expo-sqlite": ">=15", + "oxfmt": "^0.43.0", "replicache": "15.2.1", "shared": "0.0.0", "syncpack": "^14.2.1", @@ -39313,6 +39268,7 @@ "mockttp": "^4.2.1", "nock": "^14.0.4", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.1.2", @@ -39332,6 +39288,7 @@ "ast-to-zql": "0.0.0", "datadog": "0.0.0", "esbuild": "^0.27.4", + "oxfmt": "^0.43.0", "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", @@ -39347,6 +39304,7 @@ "version": "0.0.4", "license": "Apache-2.0", "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3" } @@ -39358,6 +39316,7 @@ }, "devDependencies": { "@vitest/runner": "4.1.2", + "oxfmt": "^0.43.0", "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-server": "0.0.0" @@ -39369,6 +39328,7 @@ "@badrap/valita": "0.3.11" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-types": "0.0.0" @@ -39379,6 +39339,7 @@ "devDependencies": { "@testing-library/react": "^16.3.2", "@types/react": "^18.3.18", + "oxfmt": "^0.43.0", "react": "^18.3.1", "shared": "0.0.0", "zero-client": "0.0.0", @@ -39396,6 +39357,7 @@ "@rocicorp/resolver": "^1.0.2" }, "devDependencies": { + "oxfmt": "^0.43.0", "replicache": "15.2.1", "shared": "0.0.0" } @@ -39403,6 +39365,7 @@ "packages/zero-schema": { "version": "0.0.0", "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "zero-protocol": "0.0.0", "zero-types": "0.0.0", @@ -39420,6 +39383,7 @@ "@prisma/client": "^7.2.0", "@vitest/runner": "4.1.2", "drizzle-orm": "^0.45.1", + "oxfmt": "^0.43.0", "pg": "^8.16.3", "postgres": "3.4.7", "prisma": "^7.2.0", @@ -39437,6 +39401,7 @@ "version": "0.0.0", "devDependencies": { "@solidjs/testing-library": "^0.8.10", + "oxfmt": "^0.43.0", "shared": "0.0.0", "solid-js": "^1.9.4", "vite-plugin-solid": "^2.11.11", @@ -39449,6 +39414,7 @@ "packages/zero-types": { "version": "0.0.0", "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.1.2" @@ -39880,6 +39846,7 @@ "@standard-schema/spec": "^1.0.0", "fast-check": "^3.18.0", "nanoid": "^5.1.2", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-protocol": "0.0.0", @@ -39892,6 +39859,7 @@ "@types/tmp": "^0.2.6", "mitata": "^1.0.34", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-cache": "0.0.0", @@ -39908,6 +39876,7 @@ "devDependencies": { "@types/tmp": "^0.2.6", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "z2s": "0.0.0", @@ -39934,6 +39903,7 @@ "fast-check": "^3.18.0", "nanoid": "^5.1.2", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-protocol": "0.0.0", @@ -39950,13 +39920,17 @@ "devDependencies": { "@rocicorp/logger": "^5.4.0", "@vitest/runner": "4.1.2", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.1.2" } }, "prod": { - "version": "0.0.0" + "version": "0.0.0", + "devDependencies": { + "oxfmt": "^0.43.0" + } }, "tools/client-simulator": { "version": "0.0.0", @@ -39967,6 +39941,7 @@ "ws": "^8.18.1" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "zero-protocol": "0.0.0" } @@ -39981,6 +39956,7 @@ "postgres": "3.4.7" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0" } }, @@ -39993,6 +39969,7 @@ }, "devDependencies": { "@types/pidusage": "^2.0.5", + "oxfmt": "^0.43.0", "shared": "0.0.0" } }, @@ -40005,6 +39982,7 @@ "zqlite": "0.0.0" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0" } }, @@ -40015,6 +39993,7 @@ }, "devDependencies": { "@types/node": "^22.10.5", + "oxfmt": "^0.43.0", "typescript": "~5.9.3" }, "engines": { diff --git a/packages/analyze-query/package.json b/packages/analyze-query/package.json index 070da110a0..e60ac71610 100644 --- a/packages/analyze-query/package.json +++ b/packages/analyze-query/package.json @@ -19,6 +19,7 @@ "devDependencies": { "ast-to-zql": "0.0.0", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "vitest": "4.1.2", "zero-cache": "0.0.0", diff --git a/packages/datadog/package.json b/packages/datadog/package.json index 437d6c6608..7039047182 100644 --- a/packages/datadog/package.json +++ b/packages/datadog/package.json @@ -7,6 +7,7 @@ "@rocicorp/lock": "^1.0.4", "@rocicorp/logger": "^5.4.0", "@vitest/runner": "4.1.2", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.1.2" diff --git a/packages/otel/package.json b/packages/otel/package.json index 623b71fab3..874ab5c05e 100644 --- a/packages/otel/package.json +++ b/packages/otel/package.json @@ -14,6 +14,7 @@ "@opentelemetry/api": "^1.9.0" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0" } } diff --git a/packages/replicache-perf/package.json b/packages/replicache-perf/package.json index ff1b45d73c..5b73301627 100644 --- a/packages/replicache-perf/package.json +++ b/packages/replicache-perf/package.json @@ -27,5 +27,8 @@ "typescript": "~5.9.3", "vite": "8.0.3", "xbytes": "^1.7.0" + }, + "devDependencies": { + "oxfmt": "^0.43.0" } } diff --git a/packages/replicache/package.json b/packages/replicache/package.json index 888bd38435..337a1b46c3 100644 --- a/packages/replicache/package.json +++ b/packages/replicache/package.json @@ -52,6 +52,7 @@ "compare-utf8": "^0.2.0", "esbuild": "^0.27.4", "expo-sqlite": ">=15", + "oxfmt": "^0.43.0", "playwright": "^1.53.2", "shared": "0.0.0", "typescript": "~5.9.3", diff --git a/packages/shared/package.json b/packages/shared/package.json index 0daa21bf1b..eeb32a1533 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -40,6 +40,7 @@ "@vitest/runner": "4.1.2", "compare-utf8": "^0.2.0", "fast-check": "^3.18.0", + "oxfmt": "^0.43.0", "package-up": "^5.0.0", "playwright": "^1.53.2", "type-fest": "^4.30.0", diff --git a/packages/z2s/package.json b/packages/z2s/package.json index 80b45f8fc4..1dd25b41f1 100644 --- a/packages/z2s/package.json +++ b/packages/z2s/package.json @@ -29,6 +29,7 @@ "@faker-js/faker": "^9.6.0", "@types/pg": "^8.11.11", "@vitest/runner": "4.1.2", + "oxfmt": "^0.43.0", "pg": "^8.16.3", "shared": "0.0.0", "vitest": "4.1.2", diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index e7714ea579..6debdbde07 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -83,6 +83,7 @@ "mockttp": "^4.2.1", "nock": "^14.0.4", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.1.2", diff --git a/packages/zero-client/package.json b/packages/zero-client/package.json index 12f9e296a2..69b920bfbf 100644 --- a/packages/zero-client/package.json +++ b/packages/zero-client/package.json @@ -31,6 +31,7 @@ "ast-to-zql": "0.0.0", "datadog": "0.0.0", "esbuild": "^0.27.4", + "oxfmt": "^0.43.0", "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", diff --git a/packages/zero-events/package.json b/packages/zero-events/package.json index 02715e635e..ce2d6f429a 100644 --- a/packages/zero-events/package.json +++ b/packages/zero-events/package.json @@ -32,6 +32,7 @@ "test": "vitest run" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3" } diff --git a/packages/zero-pg/package.json b/packages/zero-pg/package.json index 700c2ad5d2..dd638093a2 100644 --- a/packages/zero-pg/package.json +++ b/packages/zero-pg/package.json @@ -18,6 +18,7 @@ }, "devDependencies": { "@vitest/runner": "4.1.2", + "oxfmt": "^0.43.0", "vitest": "4.1.2", "zero-cache": "0.0.0", "zero-server": "0.0.0" diff --git a/packages/zero-protocol/package.json b/packages/zero-protocol/package.json index 73905bc6e9..e232527e89 100644 --- a/packages/zero-protocol/package.json +++ b/packages/zero-protocol/package.json @@ -16,6 +16,7 @@ "@badrap/valita": "0.3.11" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-types": "0.0.0" diff --git a/packages/zero-react-native/package.json b/packages/zero-react-native/package.json index 4c777b770b..8fd803a1df 100644 --- a/packages/zero-react-native/package.json +++ b/packages/zero-react-native/package.json @@ -17,6 +17,7 @@ "@rocicorp/resolver": "^1.0.2" }, "devDependencies": { + "oxfmt": "^0.43.0", "replicache": "15.2.1", "shared": "0.0.0" } diff --git a/packages/zero-react/package.json b/packages/zero-react/package.json index 239e16b402..043afd9ab8 100644 --- a/packages/zero-react/package.json +++ b/packages/zero-react/package.json @@ -26,6 +26,7 @@ "devDependencies": { "@testing-library/react": "^16.3.2", "@types/react": "^18.3.18", + "oxfmt": "^0.43.0", "react": "^18.3.1", "shared": "0.0.0", "zero-client": "0.0.0", diff --git a/packages/zero-schema/package.json b/packages/zero-schema/package.json index 33ee8e2b65..12aec51959 100644 --- a/packages/zero-schema/package.json +++ b/packages/zero-schema/package.json @@ -14,6 +14,7 @@ "lint": "oxlint --quiet --config ../../oxlint.config.ts" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "zero-protocol": "0.0.0", "zero-types": "0.0.0", diff --git a/packages/zero-server/package.json b/packages/zero-server/package.json index 76bb0c640f..502ada55e8 100644 --- a/packages/zero-server/package.json +++ b/packages/zero-server/package.json @@ -21,9 +21,10 @@ }, "devDependencies": { "@prisma/adapter-pg": "^7.2.0", - "@vitest/runner": "4.1.2", "@prisma/client": "^7.2.0", + "@vitest/runner": "4.1.2", "drizzle-orm": "^0.45.1", + "oxfmt": "^0.43.0", "pg": "^8.16.3", "postgres": "3.4.7", "prisma": "^7.2.0", diff --git a/packages/zero-solid/package.json b/packages/zero-solid/package.json index 1cdafdf448..0e7c338f8d 100644 --- a/packages/zero-solid/package.json +++ b/packages/zero-solid/package.json @@ -24,6 +24,7 @@ }, "devDependencies": { "@solidjs/testing-library": "^0.8.10", + "oxfmt": "^0.43.0", "shared": "0.0.0", "solid-js": "^1.9.4", "vite-plugin-solid": "^2.11.11", diff --git a/packages/zero-types/package.json b/packages/zero-types/package.json index 63eba94aa8..b24ae79e35 100644 --- a/packages/zero-types/package.json +++ b/packages/zero-types/package.json @@ -13,6 +13,7 @@ "test:watch": "vitest" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.1.2" diff --git a/packages/zero/package.json b/packages/zero/package.json index c6a4ebcfcf..53af1f2fac 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -67,7 +67,6 @@ "json-custom-numbers": "^3.1.1", "kasi": "^1.1.0", "nanoid": "^5.1.2", - "oxfmt": "^0.43.0", "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", @@ -83,6 +82,7 @@ "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", "expo-sqlite": ">=15", + "oxfmt": "^0.43.0", "replicache": "15.2.1", "shared": "0.0.0", "syncpack": "^14.2.1", diff --git a/packages/zql-benchmarks/package.json b/packages/zql-benchmarks/package.json index 8398f7aadb..e3a6fea4b6 100644 --- a/packages/zql-benchmarks/package.json +++ b/packages/zql-benchmarks/package.json @@ -23,14 +23,15 @@ "@types/tmp": "^0.2.6", "mitata": "^1.0.34", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", + "zero-schema": "0.0.0", "zero-types": "0.0.0", "zql": "0.0.0", - "zero-schema": "0.0.0", - "zqlite": "0.0.0", - "zql-integration-tests": "0.0.0" + "zql-integration-tests": "0.0.0", + "zqlite": "0.0.0" } } diff --git a/packages/zql-integration-tests/package.json b/packages/zql-integration-tests/package.json index 9b8bcb72d7..ad53168d42 100644 --- a/packages/zql-integration-tests/package.json +++ b/packages/zql-integration-tests/package.json @@ -21,6 +21,7 @@ "devDependencies": { "@types/tmp": "^0.2.6", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "z2s": "0.0.0", @@ -28,8 +29,8 @@ "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zero-server": "0.0.0", + "zero-types": "0.0.0", "zql": "0.0.0", - "zqlite": "0.0.0", - "zero-types": "0.0.0" + "zqlite": "0.0.0" } } diff --git a/packages/zql/package.json b/packages/zql/package.json index 9b5eb04ae5..c32c6a7a34 100644 --- a/packages/zql/package.json +++ b/packages/zql/package.json @@ -19,6 +19,7 @@ "@standard-schema/spec": "^1.0.0", "fast-check": "^3.18.0", "nanoid": "^5.1.2", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-protocol": "0.0.0", diff --git a/packages/zqlite-zql-test/package.json b/packages/zqlite-zql-test/package.json index c13659a183..140b6829ee 100644 --- a/packages/zqlite-zql-test/package.json +++ b/packages/zqlite-zql-test/package.json @@ -16,6 +16,7 @@ "devDependencies": { "@rocicorp/logger": "^5.4.0", "@vitest/runner": "4.1.2", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "vitest": "4.1.2" diff --git a/packages/zqlite/package.json b/packages/zqlite/package.json index da99eb5495..1d69d49216 100644 --- a/packages/zqlite/package.json +++ b/packages/zqlite/package.json @@ -22,6 +22,7 @@ "fast-check": "^3.18.0", "nanoid": "^5.1.2", "otel": "0.0.0", + "oxfmt": "^0.43.0", "shared": "0.0.0", "typescript": "~5.9.3", "zero-protocol": "0.0.0", diff --git a/prod/functions/package.json b/prod/functions/package.json index 80a8698665..eec47cc199 100644 --- a/prod/functions/package.json +++ b/prod/functions/package.json @@ -12,5 +12,7 @@ "dependencies": { "@rocicorp/zero": "file:rocicorp-zero.tgz" }, - "devDependencies": {} + "devDependencies": { + "oxfmt": "^0.43.0" + } } diff --git a/prod/package.json b/prod/package.json index 2da5d09ab2..52615e20bf 100644 --- a/prod/package.json +++ b/prod/package.json @@ -6,5 +6,8 @@ "scripts": { "format": "oxfmt .", "check-format": "oxfmt --check ." + }, + "devDependencies": { + "oxfmt": "^0.43.0" } } diff --git a/prod/sst/package.json b/prod/sst/package.json index e18545c720..06efbaa784 100644 --- a/prod/sst/package.json +++ b/prod/sst/package.json @@ -15,6 +15,7 @@ "sst": "3.8.9" }, "devDependencies": { - "@types/aws-lambda": "8.10.147" + "@types/aws-lambda": "8.10.147", + "oxfmt": "^0.43.0" } } diff --git a/tools/client-simulator/package.json b/tools/client-simulator/package.json index 1ca5d386b5..54d0d9052e 100644 --- a/tools/client-simulator/package.json +++ b/tools/client-simulator/package.json @@ -17,6 +17,7 @@ "ws": "^8.18.1" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0", "zero-protocol": "0.0.0" } diff --git a/tools/load-generator/package.json b/tools/load-generator/package.json index 1bd98d51df..83bc59e1f5 100644 --- a/tools/load-generator/package.json +++ b/tools/load-generator/package.json @@ -18,6 +18,7 @@ "postgres": "3.4.7" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0" } } diff --git a/tools/process-tracker/package.json b/tools/process-tracker/package.json index a05a843b7c..4e3877206d 100644 --- a/tools/process-tracker/package.json +++ b/tools/process-tracker/package.json @@ -17,6 +17,7 @@ }, "devDependencies": { "@types/pidusage": "^2.0.5", + "oxfmt": "^0.43.0", "shared": "0.0.0" } } diff --git a/tools/sqlite-io-yield-simulator/package.json b/tools/sqlite-io-yield-simulator/package.json index 89d737c8f2..186456a2ac 100644 --- a/tools/sqlite-io-yield-simulator/package.json +++ b/tools/sqlite-io-yield-simulator/package.json @@ -17,6 +17,7 @@ "zqlite": "0.0.0" }, "devDependencies": { + "oxfmt": "^0.43.0", "shared": "0.0.0" } } diff --git a/tools/verify-package-deps/package.json b/tools/verify-package-deps/package.json index 1816665a2c..d7e0870e34 100644 --- a/tools/verify-package-deps/package.json +++ b/tools/verify-package-deps/package.json @@ -20,6 +20,7 @@ }, "devDependencies": { "@types/node": "^22.10.5", + "oxfmt": "^0.43.0", "typescript": "~5.9.3" } } From f21fa80a8bb048e5f12fbe2444c313c896c9987d Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 3 Apr 2026 14:34:35 +0200 Subject: [PATCH 226/495] fix(zero-cache): break storer deadlock with changeLog write timeout When the change DB is slow or unresponsive, the storer's every-100-row batch INSERT await blocks the dequeue loop indefinitely. With statement_timeout=0 (required on some hosted Postgres providers to prevent initial-sync from timing out), this wait never ends. The result is a permanent pipeline freeze: the dequeue loop stops decrementing #approximateQueuedBytes, readyForMore() never resolves, the change-streamer never reads the commit from the Postgres replication stream, and even storer.stop() hangs because the 'stop' token queues behind the blocked INSERT. Fix by racing the batch-wait against a 30s timeout. On timeout, fail the in-flight TransactionPool (so it rolls back once the query completes) and throw, which causes run() to release backpressure and triggers a reconnect from the last committed watermark. Also move #maybeReleaseBackPressure() before the await so backpressure is released as soon as bytes drop below the threshold, without waiting for DB confirmation. --- .../change-streamer/storer.pg.test.ts | 58 +++++++++++++++++++ .../src/services/change-streamer/storer.ts | 39 ++++++++++++- 2 files changed, 95 insertions(+), 2 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 66eae81069..1473c3b05f 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -1692,6 +1692,64 @@ describe('change-streamer/storer', () => { `); await expectConsumed('08', '0a', '0d', '0e'); }); + + test('slow change DB write triggers timeout and storer re-throws', async () => { + // Re-create the storer with a very short write-batch timeout + // so the test completes quickly. + void storer.stop(); + await done; + + const SHORT_TIMEOUT_MS = 200; + storer = new Storer( + lc, + shard, + 'task-id', + 'change-streamer:12345', + 'ws', + db, + REPLICA_VERSION, + msg => consumed.enqueue(msg), + err => fatalErrors.enqueue(err), + 0.04, + SHORT_TIMEOUT_MS, + ); + await storer.assumeOwnership(); + done = storer.run(); + + // Acquire an EXCLUSIVE lock on the changeLog table from a separate + // connection. This blocks storer INSERTs without timing out the + // Postgres connection itself, simulating a slow/stuck change DB. + const lockConn = await db.reserve(); + await lockConn`BEGIN`; + await lockConn`LOCK TABLE "xero_5/cdc"."changeLog" IN EXCLUSIVE MODE`; + + // Send a transaction with >100 rows so the every-100-row batch-wait + // is reached and gets stuck on the locked table. + storer.store([ + '07', + ['begin', messages.begin(), {commitWatermark: '08'}], + ]); + for (let i = 0; i < 110; i++) { + storer.store([ + '07', + ['data', messages.insert('issues', {id: String(i)})], + ]); + } + storer.store(['08', ['commit', messages.commit(), {watermark: '08'}]]); + + // The storer should throw once the timeout elapses. + await expect(done).rejects.toThrow( + `storer changeLog write timed out after ${SHORT_TIMEOUT_MS}ms`, + ); + // Prevent the beforeEach cleanup from re-throwing the rejected done. + done = Promise.resolve(); + + // Release the lock. The storer's pool had pool.fail() called before the + // throw, so once the in-flight INSERT completes it will ROLLBACK and + // release its connection - which unblocks testDBs.drop() in cleanup. + await lockConn`ROLLBACK`; + lockConn.release(); + }); }); describe('protocol: wss', () => { diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 2a6add32cc..508c355293 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -7,6 +7,7 @@ import {assert} from '../../../../shared/src/asserts.ts'; import {BigIntJSON} from '../../../../shared/src/bigint-json.ts'; import {Queue} from '../../../../shared/src/queue.ts'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; +import {sleep} from '../../../../shared/src/sleep.ts'; import * as v from '../../../../shared/src/valita.ts'; import * as Mode from '../../db/mode-enum.ts'; import {runTx} from '../../db/run-transaction.ts'; @@ -44,6 +45,15 @@ import { } from './schema/tables.ts'; import type {Subscriber} from './subscriber.ts'; +// Maximum time to wait for a batch of changeLog INSERTs to be confirmed by +// the change DB. If this times out, the storer throws and triggers a reconnect. +// Without a timeout, a statement_timeout=0 connection setting (sometimes +// required to prevent initial-sync from hitting Postgres's default timeout) +// can cause the change DB write to block indefinitely, which in turn prevents +// the dequeue loop from making progress, which prevents back-pressure from +// releasing, which deadlocks the entire replication pipeline. +const WRITE_BATCH_TIMEOUT_MS = 30_000; // 30 seconds + type SubscriberAndMode = { subscriber: Subscriber; mode: ReplicatorMode; @@ -115,6 +125,7 @@ export class Storer implements Service { readonly #onFatal: (err: Error) => void; readonly #queue = new Queue(); readonly #backPressureThresholdBytes: number; + readonly #writeBatchTimeoutMs: number; #approximateQueuedBytes = 0; #running = false; @@ -130,6 +141,7 @@ export class Storer implements Service { onConsumed: (c: Commit | UpstreamStatusMessage) => void, onFatal: (err: Error) => void, backPressureLimitHeapProportion: number, + writeBatchTimeoutMs = WRITE_BATCH_TIMEOUT_MS, ) { this.#lc = lc.withContext('component', 'change-log'); this.#shard = shard; @@ -140,6 +152,7 @@ export class Storer implements Service { this.#replicaVersion = replicaVersion; this.#onConsumed = onConsumed; this.#onFatal = onFatal; + this.#writeBatchTimeoutMs = writeBatchTimeoutMs; const heapStats = getHeapStatistics(); this.#backPressureThresholdBytes = @@ -469,13 +482,35 @@ export class Storer implements Service { : []), ]); + // Release backpressure as soon as the byte count drops below the + // threshold, independently of whether the DB write has confirmed. + this.#maybeReleaseBackPressure(); + if (tx.pos % 100 === 0) { // Backpressure is exerted on commit when awaiting tx.pool.done(). // However, backpressure checks need to be regularly done for // very large transactions in order to avoid memory blowup. - await processed; + // + // Guard with a timeout: if the change DB is slow or stuck (e.g. + // because statement_timeout=0 lets a query block indefinitely), + // this await would block the dequeue loop, preventing further byte + // decrements and causing readyForMore() to never resolve. A timeout + // lets the storer fail fast and triggers a reconnect. + const timedOut = await Promise.race([ + processed.then(() => false as const), + sleep(this.#writeBatchTimeoutMs).then(() => true as const), + ]); + if (timedOut) { + const err = new Error( + `storer changeLog write timed out after ${this.#writeBatchTimeoutMs}ms ` + + `(pos ${tx.pos} of tx ${tx.preCommitWatermark})`, + ); + // Fail the pool so it rolls back and releases its connection + // once the in-flight query completes. + tx.pool.fail(err); + throw err; + } } - this.#maybeReleaseBackPressure(); if (tag === 'commit') { const {owner} = await tx.startingReplicationState; From 1df524d1f28b72a46611ff2e166bcb035d7ac2b4 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 3 Apr 2026 14:40:40 +0200 Subject: [PATCH 227/495] Revert "fix(zero-cache): break storer deadlock with changeLog write timeout" This reverts commit f21fa80a8bb048e5f12fbe2444c313c896c9987d. Didn't mean to commit this yet --- .../change-streamer/storer.pg.test.ts | 58 ------------------- .../src/services/change-streamer/storer.ts | 39 +------------ 2 files changed, 2 insertions(+), 95 deletions(-) diff --git a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts index 1473c3b05f..66eae81069 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.pg.test.ts @@ -1692,64 +1692,6 @@ describe('change-streamer/storer', () => { `); await expectConsumed('08', '0a', '0d', '0e'); }); - - test('slow change DB write triggers timeout and storer re-throws', async () => { - // Re-create the storer with a very short write-batch timeout - // so the test completes quickly. - void storer.stop(); - await done; - - const SHORT_TIMEOUT_MS = 200; - storer = new Storer( - lc, - shard, - 'task-id', - 'change-streamer:12345', - 'ws', - db, - REPLICA_VERSION, - msg => consumed.enqueue(msg), - err => fatalErrors.enqueue(err), - 0.04, - SHORT_TIMEOUT_MS, - ); - await storer.assumeOwnership(); - done = storer.run(); - - // Acquire an EXCLUSIVE lock on the changeLog table from a separate - // connection. This blocks storer INSERTs without timing out the - // Postgres connection itself, simulating a slow/stuck change DB. - const lockConn = await db.reserve(); - await lockConn`BEGIN`; - await lockConn`LOCK TABLE "xero_5/cdc"."changeLog" IN EXCLUSIVE MODE`; - - // Send a transaction with >100 rows so the every-100-row batch-wait - // is reached and gets stuck on the locked table. - storer.store([ - '07', - ['begin', messages.begin(), {commitWatermark: '08'}], - ]); - for (let i = 0; i < 110; i++) { - storer.store([ - '07', - ['data', messages.insert('issues', {id: String(i)})], - ]); - } - storer.store(['08', ['commit', messages.commit(), {watermark: '08'}]]); - - // The storer should throw once the timeout elapses. - await expect(done).rejects.toThrow( - `storer changeLog write timed out after ${SHORT_TIMEOUT_MS}ms`, - ); - // Prevent the beforeEach cleanup from re-throwing the rejected done. - done = Promise.resolve(); - - // Release the lock. The storer's pool had pool.fail() called before the - // throw, so once the in-flight INSERT completes it will ROLLBACK and - // release its connection - which unblocks testDBs.drop() in cleanup. - await lockConn`ROLLBACK`; - lockConn.release(); - }); }); describe('protocol: wss', () => { diff --git a/packages/zero-cache/src/services/change-streamer/storer.ts b/packages/zero-cache/src/services/change-streamer/storer.ts index 508c355293..2a6add32cc 100644 --- a/packages/zero-cache/src/services/change-streamer/storer.ts +++ b/packages/zero-cache/src/services/change-streamer/storer.ts @@ -7,7 +7,6 @@ import {assert} from '../../../../shared/src/asserts.ts'; import {BigIntJSON} from '../../../../shared/src/bigint-json.ts'; import {Queue} from '../../../../shared/src/queue.ts'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; -import {sleep} from '../../../../shared/src/sleep.ts'; import * as v from '../../../../shared/src/valita.ts'; import * as Mode from '../../db/mode-enum.ts'; import {runTx} from '../../db/run-transaction.ts'; @@ -45,15 +44,6 @@ import { } from './schema/tables.ts'; import type {Subscriber} from './subscriber.ts'; -// Maximum time to wait for a batch of changeLog INSERTs to be confirmed by -// the change DB. If this times out, the storer throws and triggers a reconnect. -// Without a timeout, a statement_timeout=0 connection setting (sometimes -// required to prevent initial-sync from hitting Postgres's default timeout) -// can cause the change DB write to block indefinitely, which in turn prevents -// the dequeue loop from making progress, which prevents back-pressure from -// releasing, which deadlocks the entire replication pipeline. -const WRITE_BATCH_TIMEOUT_MS = 30_000; // 30 seconds - type SubscriberAndMode = { subscriber: Subscriber; mode: ReplicatorMode; @@ -125,7 +115,6 @@ export class Storer implements Service { readonly #onFatal: (err: Error) => void; readonly #queue = new Queue(); readonly #backPressureThresholdBytes: number; - readonly #writeBatchTimeoutMs: number; #approximateQueuedBytes = 0; #running = false; @@ -141,7 +130,6 @@ export class Storer implements Service { onConsumed: (c: Commit | UpstreamStatusMessage) => void, onFatal: (err: Error) => void, backPressureLimitHeapProportion: number, - writeBatchTimeoutMs = WRITE_BATCH_TIMEOUT_MS, ) { this.#lc = lc.withContext('component', 'change-log'); this.#shard = shard; @@ -152,7 +140,6 @@ export class Storer implements Service { this.#replicaVersion = replicaVersion; this.#onConsumed = onConsumed; this.#onFatal = onFatal; - this.#writeBatchTimeoutMs = writeBatchTimeoutMs; const heapStats = getHeapStatistics(); this.#backPressureThresholdBytes = @@ -482,35 +469,13 @@ export class Storer implements Service { : []), ]); - // Release backpressure as soon as the byte count drops below the - // threshold, independently of whether the DB write has confirmed. - this.#maybeReleaseBackPressure(); - if (tx.pos % 100 === 0) { // Backpressure is exerted on commit when awaiting tx.pool.done(). // However, backpressure checks need to be regularly done for // very large transactions in order to avoid memory blowup. - // - // Guard with a timeout: if the change DB is slow or stuck (e.g. - // because statement_timeout=0 lets a query block indefinitely), - // this await would block the dequeue loop, preventing further byte - // decrements and causing readyForMore() to never resolve. A timeout - // lets the storer fail fast and triggers a reconnect. - const timedOut = await Promise.race([ - processed.then(() => false as const), - sleep(this.#writeBatchTimeoutMs).then(() => true as const), - ]); - if (timedOut) { - const err = new Error( - `storer changeLog write timed out after ${this.#writeBatchTimeoutMs}ms ` + - `(pos ${tx.pos} of tx ${tx.preCommitWatermark})`, - ); - // Fail the pool so it rolls back and releases its connection - // once the in-flight query completes. - tx.pool.fail(err); - throw err; - } + await processed; } + this.#maybeReleaseBackPressure(); if (tag === 'commit') { const {owner} = await tx.startingReplicationState; From 7d023757c3582c50ce8dfd2e19bd58c60b793b6e Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 3 Apr 2026 15:42:08 +0200 Subject: [PATCH 228/495] chore(bench): enhance measurement options with default settings (#5751) And increase default: - min_cpu_time from 642ms to 2 seconds - min_samples from 12 to 50 --- packages/shared/src/bench.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/shared/src/bench.ts b/packages/shared/src/bench.ts index b2dbf8908e..5b7f5fdff1 100644 --- a/packages/shared/src/bench.ts +++ b/packages/shared/src/bench.ts @@ -1,7 +1,7 @@ // oxlint-disable typescript/no-explicit-any // oxlint-disable no-console -import {measure} from 'mitata'; +import {measure, type k_options as MeasureOptions} from 'mitata'; import type {TestAPI} from 'vitest'; import * as vitest from 'vitest'; import { @@ -10,6 +10,8 @@ import { type Stats, } from './bench-format.ts'; +export type {MeasureOptions}; + export {do_not_optimize as use} from 'mitata'; // These are replaced at build time by Vite's `define` block in benchConfig. @@ -20,6 +22,11 @@ const colors = !process.env.NO_COLOR && !process.env.NODE_DISABLE_COLORS; type MeasureFn = Parameters[0]; +const defaultMeasureOptions: MeasureOptions = { + min_cpu_time: 2e9, // 2 seconds + min_samples: 50, +}; + type BenchResult = {name: string; stats: Stats}; const resultsStack: (BenchResult[] | undefined)[] = []; let currentResults: BenchResult[] | undefined; @@ -91,10 +98,10 @@ function copyModifiers any>( } function wrapTest(testFn: (...args: any[]) => any): TestAPI { - const wrapped = ((name: string, fn: MeasureFn) => + const wrapped = ((name: string, fn: MeasureFn, opts?: MeasureOptions) => testFn(name, async ({task}: {task: {fullName: string}}) => { const {fullName} = task; - const stats = await measure(fn); + const stats = await measure(fn, {...defaultMeasureOptions, ...opts}); if (currentResults) { currentResults.push({name: fullName, stats}); From c60f4bc393796f4134d4484d88a38ca8a8b92e48 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 3 Apr 2026 17:54:07 +0200 Subject: [PATCH 229/495] chore: add oxfmt dependency to package.json and package-lock.json (#5753) It is used at runtime for analyze query endpoint. --- package-lock.json | 2 +- packages/zero/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d40c246971..c8dd27ada1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39153,6 +39153,7 @@ "json-custom-numbers": "^3.1.1", "kasi": "^1.1.0", "nanoid": "^5.1.2", + "oxfmt": "^0.43.0", "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", @@ -39178,7 +39179,6 @@ "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", "expo-sqlite": ">=15", - "oxfmt": "^0.43.0", "replicache": "15.2.1", "shared": "0.0.0", "syncpack": "^14.2.1", diff --git a/packages/zero/package.json b/packages/zero/package.json index 53af1f2fac..c6a4ebcfcf 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -67,6 +67,7 @@ "json-custom-numbers": "^3.1.1", "kasi": "^1.1.0", "nanoid": "^5.1.2", + "oxfmt": "^0.43.0", "parse-prometheus-text-format": "^1.1.1", "pg-format": "npm:pg-format-fix@^1.0.5", "postgres": "3.4.7", @@ -82,7 +83,6 @@ "analyze-query": "0.0.0", "ast-to-zql": "0.0.0", "expo-sqlite": ">=15", - "oxfmt": "^0.43.0", "replicache": "15.2.1", "shared": "0.0.0", "syncpack": "^14.2.1", From 483e29b21bbf76587e6d8507d0a09b637820e1fa Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 3 Apr 2026 23:11:13 +0200 Subject: [PATCH 230/495] chore: upgrade typescript to version 6.0.2 (#5698) Updated typescript version from ~5.9.3 to ~6.0.2 --- apps/otel-proxy/package.json | 2 +- apps/otel-proxy/tsconfig.json | 4 +- apps/zbugs/package.json | 2 +- apps/zql-viz/package.json | 2 +- apps/zql-viz/tsconfig.node.json | 2 +- package-lock.json | 6970 +++-------------- packages/datadog/package.json | 2 +- packages/datadog/tsconfig.json | 1 + packages/replicache-doc/package.json | 2 +- packages/replicache-perf/package.json | 2 +- packages/replicache/package.json | 2 +- packages/replicache/tsconfig.build.json | 1 + packages/shared/package.json | 2 +- packages/z2s/src/sql.ts | 4 +- packages/zero-cache/package.json | 2 +- packages/zero-client/package.json | 2 +- packages/zero-client/tsconfig.json | 1 + packages/zero-events/package.json | 2 +- packages/zero-events/tsconfig.json | 2 +- packages/zero-protocol/package.json | 2 +- packages/zero-types/package.json | 2 +- packages/zero/package.json | 2 +- packages/zero/tsconfig.json | 1 + packages/zql-benchmarks/package.json | 2 +- .../zql-benchmarks/src/chinook-push.bench.ts | 2 +- packages/zql-benchmarks/tsconfig.json | 1 + packages/zql-integration-tests/package.json | 2 +- packages/zql-integration-tests/tsconfig.json | 1 + packages/zql/package.json | 2 +- packages/zqlite-zql-test/package.json | 2 +- packages/zqlite/package.json | 2 +- packages/zqlite/src/internal/sql.ts | 6 +- packages/zqlite/tsconfig.json | 1 + tools/verify-package-deps/package.json | 2 +- tsconfig.json | 4 +- 35 files changed, 989 insertions(+), 6052 deletions(-) diff --git a/apps/otel-proxy/package.json b/apps/otel-proxy/package.json index f52ce5b19a..2e837ecb6a 100644 --- a/apps/otel-proxy/package.json +++ b/apps/otel-proxy/package.json @@ -20,7 +20,7 @@ "@types/node": "^22.10.5", "@vitest/coverage-v8": "4.1.2", "oxfmt": "^0.43.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" } } diff --git a/apps/otel-proxy/tsconfig.json b/apps/otel-proxy/tsconfig.json index 0a01ee48e2..1bf2187ad7 100644 --- a/apps/otel-proxy/tsconfig.json +++ b/apps/otel-proxy/tsconfig.json @@ -2,8 +2,8 @@ "compilerOptions": { "target": "es2020", "lib": ["ES2020"], - "module": "commonjs", - "moduleResolution": "node", + "module": "preserve", + "moduleResolution": "bundler", "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index 848f790c08..ecd6d8e788 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -89,7 +89,7 @@ "shared": "0.0.0", "tailwindcss": "^3.0.23", "tsx": "^4.21.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vite": "8.0.3", "vite-bundle-analyzer": "^1.3.6", "vite-plugin-svgr": "^4.5.0", diff --git a/apps/zql-viz/package.json b/apps/zql-viz/package.json index 0e9abc407e..cd823bddb4 100644 --- a/apps/zql-viz/package.json +++ b/apps/zql-viz/package.json @@ -23,7 +23,7 @@ "@types/react": "^18.3.18", "@types/react-dom": "18.3.5", "@vitejs/plugin-react": "^6.0.1", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vite": "8.0.3", "zero-types": "0.0.0", "zql": "0.0.0" diff --git a/apps/zql-viz/tsconfig.node.json b/apps/zql-viz/tsconfig.node.json index f85a39906e..50d50675e4 100644 --- a/apps/zql-viz/tsconfig.node.json +++ b/apps/zql-viz/tsconfig.node.json @@ -3,7 +3,7 @@ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", "target": "ES2023", "lib": ["ES2023"], - "module": "ESNext", + "module": "preserve", "skipLibCheck": true, /* Bundler mode */ diff --git a/package-lock.json b/package-lock.json index c8dd27ada1..c60f48a7de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,10 +39,24 @@ "@types/node": "^22.10.5", "@vitest/coverage-v8": "4.1.2", "oxfmt": "^0.43.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" } }, + "apps/otel-proxy/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "apps/zbugs": { "version": "0.0.0", "dependencies": { @@ -100,7 +114,7 @@ "shared": "0.0.0", "tailwindcss": "^3.0.23", "tsx": "^4.21.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vite": "8.0.3", "vite-bundle-analyzer": "^1.3.6", "vite-plugin-svgr": "^4.5.0", @@ -109,8 +123,6 @@ }, "apps/zbugs/node_modules/@oxc-project/types": { "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "dev": true, "license": "MIT", "funding": { @@ -136,8 +148,6 @@ }, "apps/zbugs/node_modules/@rolldown/binding-darwin-arm64": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", "cpu": [ "arm64" ], @@ -210,6 +220,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -227,6 +240,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -244,6 +260,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -261,6 +280,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -278,6 +300,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -295,6 +320,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -374,15 +402,11 @@ }, "apps/zbugs/node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", - "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", "dev": true, "license": "MIT" }, "apps/zbugs/node_modules/rolldown": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", - "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dev": true, "license": "MIT", "dependencies": { @@ -413,10 +437,22 @@ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" } }, + "apps/zbugs/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "apps/zbugs/node_modules/vite": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -507,7 +543,7 @@ "@types/react": "^18.3.18", "@types/react-dom": "18.3.5", "@vitejs/plugin-react": "^6.0.1", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vite": "8.0.3", "zero-types": "0.0.0", "zql": "0.0.0" @@ -515,8 +551,6 @@ }, "apps/zql-viz/node_modules/@oxc-project/types": { "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "dev": true, "license": "MIT", "funding": { @@ -542,8 +576,6 @@ }, "apps/zql-viz/node_modules/@rolldown/binding-darwin-arm64": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", "cpu": [ "arm64" ], @@ -616,6 +648,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -633,6 +668,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -650,6 +688,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -667,6 +708,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -684,6 +728,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -701,6 +748,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -780,15 +830,11 @@ }, "apps/zql-viz/node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", - "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", "dev": true, "license": "MIT" }, "apps/zql-viz/node_modules/rolldown": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", - "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dev": true, "license": "MIT", "dependencies": { @@ -819,10 +865,22 @@ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" } }, + "apps/zql-viz/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "apps/zql-viz/node_modules/vite": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -899,8 +957,6 @@ }, "node_modules/@algolia/abtesting": { "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.2.tgz", - "integrity": "sha512-rF7vRVE61E0QORw8e2NNdnttcl3jmFMWS9B4hhdga12COe+lMa26bQLfcBn/Nbp9/AF/8gXdaRCPsVns3CnjsA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -914,8 +970,6 @@ }, "node_modules/@algolia/autocomplete-core": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", - "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", "license": "MIT", "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", @@ -924,8 +978,6 @@ }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", - "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.19.2" @@ -936,8 +988,6 @@ }, "node_modules/@algolia/autocomplete-shared": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", - "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -946,8 +996,6 @@ }, "node_modules/@algolia/client-abtesting": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.2.tgz", - "integrity": "sha512-XyvKCm0RRmovMI/ChaAVjTwpZhXdbgt3iZofK914HeEHLqD1MUFFVLz7M0+Ou7F56UkHXwRbpHwb9xBDNopprQ==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -961,8 +1009,6 @@ }, "node_modules/@algolia/client-analytics": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.49.2.tgz", - "integrity": "sha512-jq/3qvtmj3NijZlhq7A1B0Cl41GfaBpjJxcwukGsYds6aMSCWrEAJ9pUqw/C9B3hAmILYKl7Ljz3N9SFvekD3Q==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -976,8 +1022,6 @@ }, "node_modules/@algolia/client-common": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.49.2.tgz", - "integrity": "sha512-bn0biLequn3epobCfjUqCxlIlurLr4RHu7RaE4trgN+RDcUq6HCVC3/yqq1hwbNYpVtulnTOJzcaxYlSr1fnuw==", "license": "MIT", "engines": { "node": ">= 14.0.0" @@ -985,8 +1029,6 @@ }, "node_modules/@algolia/client-insights": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.2.tgz", - "integrity": "sha512-z14wfFs1T3eeYbCArC8pvntAWsPo9f6hnUGoj8IoRUJTwgJiiySECkm8bmmV47/x0oGHfsVn3kBdjMX0yq0sNA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -1000,8 +1042,6 @@ }, "node_modules/@algolia/client-personalization": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.49.2.tgz", - "integrity": "sha512-GpRf7yuuAX93+Qt0JGEJZwgtL0MFdjFO9n7dn8s2pA9mTjzl0Sc5+uTk1VPbIAuf7xhCP9Mve+URGb6J+EYxgA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -1015,8 +1055,6 @@ }, "node_modules/@algolia/client-query-suggestions": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.2.tgz", - "integrity": "sha512-HZwApmNkp0DiAjZcLYdQLddcG4Agb88OkojiAHGgcm5DVXobT5uSZ9lmyrbw/tmQBJwgu2CNw4zTyXoIB7YbPA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -1030,8 +1068,6 @@ }, "node_modules/@algolia/client-search": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", - "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -1045,14 +1081,10 @@ }, "node_modules/@algolia/events": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", "license": "MIT" }, "node_modules/@algolia/ingestion": { "version": "1.49.2", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.49.2.tgz", - "integrity": "sha512-YYJRjaZ2bqk923HxE4um7j/Cm3/xoSkF2HC2ZweOF8cXL3sqnlndSUYmCaxHFjNPWLaSHk2IfssX6J/tdKTULw==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -1066,8 +1098,6 @@ }, "node_modules/@algolia/monitoring": { "version": "1.49.2", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.2.tgz", - "integrity": "sha512-9WgH+Dha39EQQyGKCHlGYnxW/7W19DIrEbCEbnzwAMpGAv1yTWCHMPXHxYa+LcL3eCp2V/5idD1zHNlIKmHRHg==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -1081,8 +1111,6 @@ }, "node_modules/@algolia/recommend": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.49.2.tgz", - "integrity": "sha512-K7Gp5u+JtVYgaVpBxF5rGiM+Ia8SsMdcAJMTDV93rwh00DKNllC19o1g+PwrDjDvyXNrnTEbofzbTs2GLfFyKA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2", @@ -1096,8 +1124,6 @@ }, "node_modules/@algolia/requester-browser-xhr": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.49.2.tgz", - "integrity": "sha512-3UhYCcWX6fbtN8ABcxZlhaQEwXFh3CsFtARyyadQShHMPe3mJV9Wel4FpJTa+seugRkbezFz0tt6aPTZSYTBuA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2" @@ -1108,8 +1134,6 @@ }, "node_modules/@algolia/requester-fetch": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.2.tgz", - "integrity": "sha512-G94VKSGbsr+WjsDDOBe5QDQ82QYgxvpxRGJfCHZBnYKYsy/jv9qGIDb93biza+LJWizQBUtDj7bZzp3QZyzhPQ==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2" @@ -1120,8 +1144,6 @@ }, "node_modules/@algolia/requester-node-http": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.49.2.tgz", - "integrity": "sha512-UuihBGHafG/ENsrcTGAn5rsOffrCIRuHMOsD85fZGLEY92ate+BMTUqxz60dv5zerh8ZumN4bRm8eW2z9L11jA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.2" @@ -1132,8 +1154,6 @@ }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, "license": "MIT", "engines": { @@ -1145,8 +1165,6 @@ }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", @@ -1159,8 +1177,6 @@ }, "node_modules/@aws-crypto/crc32c": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", @@ -1170,8 +1186,6 @@ }, "node_modules/@aws-crypto/sha1-browser": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -1184,8 +1198,6 @@ }, "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1196,8 +1208,6 @@ }, "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", @@ -1209,8 +1219,6 @@ }, "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", @@ -1222,8 +1230,6 @@ }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", @@ -1237,8 +1243,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1249,8 +1253,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", @@ -1262,8 +1264,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", @@ -1275,8 +1275,6 @@ }, "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", @@ -1289,8 +1287,6 @@ }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1298,8 +1294,6 @@ }, "node_modules/@aws-crypto/util": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.222.0", @@ -1309,8 +1303,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1321,8 +1313,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", @@ -1334,8 +1324,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", @@ -1347,8 +1335,6 @@ }, "node_modules/@aws-sdk/client-s3": { "version": "3.1010.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1010.0.tgz", - "integrity": "sha512-XUqXFrn/FGLLzO5OXu9iAtt492kj9Z7Yk8b0iPFxeJoIhaa61YOgR84chOExvnjm2+JTYyGNZiVPmgnFB3jxXA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", @@ -1413,8 +1399,6 @@ }, "node_modules/@aws-sdk/core": { "version": "3.973.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.20.tgz", - "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1437,8 +1421,6 @@ }, "node_modules/@aws-sdk/crc64-nvme": { "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.5.tgz", - "integrity": "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -1450,8 +1432,6 @@ }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.18.tgz", - "integrity": "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1466,8 +1446,6 @@ }, "node_modules/@aws-sdk/credential-provider-http": { "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.20.tgz", - "integrity": "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1487,8 +1465,6 @@ }, "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.20.tgz", - "integrity": "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1512,8 +1488,6 @@ }, "node_modules/@aws-sdk/credential-provider-login": { "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz", - "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1531,8 +1505,6 @@ }, "node_modules/@aws-sdk/credential-provider-node": { "version": "3.972.21", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.21.tgz", - "integrity": "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.18", @@ -1554,8 +1526,6 @@ }, "node_modules/@aws-sdk/credential-provider-process": { "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.18.tgz", - "integrity": "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1571,8 +1541,6 @@ }, "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.20.tgz", - "integrity": "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1590,8 +1558,6 @@ }, "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.20.tgz", - "integrity": "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1608,8 +1574,6 @@ }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz", - "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1626,8 +1590,6 @@ }, "node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz", - "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1641,8 +1603,6 @@ }, "node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.974.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.0.tgz", - "integrity": "sha512-BmdDjqvnuYaC4SY7ypHLXfCSsGYGUZkjCLSZyUAAYn1YT28vbNMJNDwhlfkvvE+hQHG5RJDlEmYuvBxcB9jX1g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", @@ -1666,8 +1626,6 @@ }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", - "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1681,8 +1639,6 @@ }, "node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz", - "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1695,8 +1651,6 @@ }, "node_modules/@aws-sdk/middleware-logger": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", - "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1709,8 +1663,6 @@ }, "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", - "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1725,8 +1677,6 @@ }, "node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.20.tgz", - "integrity": "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1750,8 +1700,6 @@ }, "node_modules/@aws-sdk/middleware-ssec": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz", - "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1764,8 +1712,6 @@ }, "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.972.21", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz", - "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1783,8 +1729,6 @@ }, "node_modules/@aws-sdk/nested-clients": { "version": "3.996.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz", - "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -1832,8 +1776,6 @@ }, "node_modules/@aws-sdk/region-config-resolver": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", - "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1848,8 +1790,6 @@ }, "node_modules/@aws-sdk/s3-request-presigner": { "version": "3.1010.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.1010.0.tgz", - "integrity": "sha512-EP+LRZ5+FM9IFZz9vmRSCHAqtaD39Y3TcMbBApn2NgHIogvYxuLx+KUV9rcjGOyJFSDlbSUa0R9s1bM/YmeSCg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/signature-v4-multi-region": "^3.996.8", @@ -1867,8 +1807,6 @@ }, "node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.996.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.8.tgz", - "integrity": "sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-sdk-s3": "^3.972.20", @@ -1884,8 +1822,6 @@ }, "node_modules/@aws-sdk/token-providers": { "version": "3.1009.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1009.0.tgz", - "integrity": "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", @@ -1902,8 +1838,6 @@ }, "node_modules/@aws-sdk/types": { "version": "3.973.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", - "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -1915,8 +1849,6 @@ }, "node_modules/@aws-sdk/util-arn-parser": { "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1927,8 +1859,6 @@ }, "node_modules/@aws-sdk/util-endpoints": { "version": "3.996.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", - "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1943,8 +1873,6 @@ }, "node_modules/@aws-sdk/util-format-url": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.8.tgz", - "integrity": "sha512-J6DS9oocrgxM8xlUTTmQOuwRF6rnAGEujAN9SAzllcrQmwn5iJ58ogxy3SEhD0Q7JZvlA5jvIXBkpQRqEqlE9A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1958,8 +1886,6 @@ }, "node_modules/@aws-sdk/util-locate-window": { "version": "3.965.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", - "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1970,8 +1896,6 @@ }, "node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", - "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", @@ -1982,8 +1906,6 @@ }, "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.973.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz", - "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-user-agent": "^3.972.21", @@ -2007,8 +1929,6 @@ }, "node_modules/@aws-sdk/xml-builder": { "version": "3.972.11", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz", - "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -2021,8 +1941,6 @@ }, "node_modules/@aws/lambda-invoke-store": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", - "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", "license": "Apache-2.0", "engines": { "node": ">=18.0.0" @@ -2030,8 +1948,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -2044,8 +1960,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2053,8 +1967,6 @@ }, "node_modules/@babel/core": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -2083,8 +1995,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2092,8 +2002,6 @@ }, "node_modules/@babel/generator": { "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", @@ -2108,8 +2016,6 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -2120,8 +2026,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", @@ -2136,8 +2040,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2145,8 +2047,6 @@ }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -2166,8 +2066,6 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2175,8 +2073,6 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -2192,8 +2088,6 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2201,8 +2095,6 @@ }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", - "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", @@ -2217,8 +2109,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2226,8 +2116,6 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.5", @@ -2239,8 +2127,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.6", @@ -2252,8 +2138,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -2269,8 +2153,6 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" @@ -2281,8 +2163,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2290,8 +2170,6 @@ }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -2307,8 +2185,6 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", @@ -2324,8 +2200,6 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -2337,8 +2211,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2346,8 +2218,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2355,8 +2225,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2364,8 +2232,6 @@ }, "node_modules/@babel/helper-wrap-function": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", @@ -2378,8 +2244,6 @@ }, "node_modules/@babel/helpers": { "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", @@ -2391,8 +2255,6 @@ }, "node_modules/@babel/parser": { "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -2406,8 +2268,6 @@ }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -2422,8 +2282,6 @@ }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2437,8 +2295,6 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2452,8 +2308,6 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -2469,8 +2323,6 @@ }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -2485,8 +2337,6 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2497,8 +2347,6 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2509,8 +2357,6 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2524,8 +2370,6 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2539,8 +2383,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2554,8 +2396,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2569,8 +2409,6 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -2585,8 +2423,6 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2600,8 +2436,6 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -2617,8 +2451,6 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -2634,8 +2466,6 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2649,8 +2479,6 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2664,8 +2492,6 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -2680,8 +2506,6 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -2696,8 +2520,6 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -2716,8 +2538,6 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -2732,8 +2552,6 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -2748,8 +2566,6 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -2764,8 +2580,6 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2779,8 +2593,6 @@ }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -2795,8 +2607,6 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2810,8 +2620,6 @@ }, "node_modules/@babel/plugin-transform-explicit-resource-management": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -2826,8 +2634,6 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2841,8 +2647,6 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2856,8 +2660,6 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -2872,8 +2674,6 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", @@ -2889,8 +2689,6 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2904,8 +2702,6 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2919,8 +2715,6 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2934,8 +2728,6 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2949,8 +2741,6 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -2965,8 +2755,6 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.28.6", @@ -2981,8 +2769,6 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.28.6", @@ -2999,8 +2785,6 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -3015,8 +2799,6 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3031,8 +2813,6 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3046,8 +2826,6 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3061,8 +2839,6 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3076,8 +2852,6 @@ }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", @@ -3095,8 +2869,6 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -3111,8 +2883,6 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3126,8 +2896,6 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -3142,8 +2910,6 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3157,8 +2923,6 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -3173,8 +2937,6 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -3190,8 +2952,6 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3205,8 +2965,6 @@ }, "node_modules/@babel/plugin-transform-react-constant-elements": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3220,8 +2978,6 @@ }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3235,8 +2991,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", - "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -3254,8 +3008,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" @@ -3269,8 +3021,6 @@ }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -3285,8 +3035,6 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3300,8 +3048,6 @@ }, "node_modules/@babel/plugin-transform-regexp-modifiers": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3316,8 +3062,6 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3331,8 +3075,6 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", - "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -3351,8 +3093,6 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3360,8 +3100,6 @@ }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3375,8 +3113,6 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -3391,8 +3127,6 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3406,8 +3140,6 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3421,8 +3153,6 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3436,8 +3166,6 @@ }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", - "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -3455,8 +3183,6 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3470,8 +3196,6 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3486,8 +3210,6 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -3502,8 +3224,6 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3518,8 +3238,6 @@ }, "node_modules/@babel/preset-env": { "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.29.0", @@ -3602,8 +3320,6 @@ }, "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { "version": "0.14.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", - "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.8", @@ -3615,8 +3331,6 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3624,8 +3338,6 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -3638,8 +3350,6 @@ }, "node_modules/@babel/preset-react": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -3658,8 +3368,6 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -3677,8 +3385,6 @@ }, "node_modules/@babel/runtime": { "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3686,8 +3392,6 @@ }, "node_modules/@babel/runtime-corejs3": { "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", - "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", "license": "MIT", "dependencies": { "core-js-pure": "^3.48.0" @@ -3698,8 +3402,6 @@ }, "node_modules/@babel/template": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", @@ -3712,8 +3414,6 @@ }, "node_modules/@babel/traverse": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -3730,8 +3430,6 @@ }, "node_modules/@babel/types": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -3743,8 +3441,6 @@ }, "node_modules/@badrap/valita": { "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@badrap/valita/-/valita-0.3.11.tgz", - "integrity": "sha512-oak0W8bycFjnrLeVCVvZqkOWTGh74wCPKUxGLJyhRukRs+V/hQdfZp1eDcQE4Gf3UrtJWfR/Ou4Xe0DZqJZ2FA==", "license": "MIT", "engines": { "node": ">= 16" @@ -3752,15 +3448,11 @@ }, "node_modules/@balena/dockerignore": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", - "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", "dev": true, "license": "Apache-2.0" }, "node_modules/@bcoe/v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", "engines": { @@ -3769,15 +3461,11 @@ }, "node_modules/@blazediff/core": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", - "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3788,15 +3476,11 @@ }, "node_modules/@chevrotain/cst-dts-gen/node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, "license": "MIT" }, "node_modules/@chevrotain/gast": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", - "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3806,29 +3490,21 @@ }, "node_modules/@chevrotain/gast/node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, "license": "MIT" }, "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==", "dev": true, "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==", "dev": true, "license": "Apache-2.0" }, "node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "license": "MIT", "optional": true, "engines": { @@ -3837,8 +3513,6 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -3849,8 +3523,6 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -3859,8 +3531,6 @@ }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", "funding": [ { "type": "github", @@ -3882,8 +3552,6 @@ }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -3901,8 +3569,6 @@ }, "node_modules/@csstools/css-calc": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -3924,8 +3590,6 @@ }, "node_modules/@csstools/css-color-parser": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -3951,8 +3615,6 @@ }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -3973,8 +3635,6 @@ }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -3992,8 +3652,6 @@ }, "node_modules/@csstools/media-query-list-parser": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "funding": [ { "type": "github", @@ -4015,8 +3673,6 @@ }, "node_modules/@csstools/postcss-alpha-function": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", - "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", "funding": [ { "type": "github", @@ -4044,8 +3700,6 @@ }, "node_modules/@csstools/postcss-alpha-function/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -4069,8 +3723,6 @@ }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4090,8 +3742,6 @@ }, "node_modules/@csstools/postcss-color-function": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4111,8 +3761,6 @@ }, "node_modules/@csstools/postcss-color-function-display-p3-linear": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", "funding": [ { "type": "github", @@ -4140,8 +3788,6 @@ }, "node_modules/@csstools/postcss-color-function-display-p3-linear/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -4165,8 +3811,6 @@ }, "node_modules/@csstools/postcss-color-mix-function": { "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", "funding": [ { "type": "github", @@ -4194,8 +3838,6 @@ }, "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -4219,8 +3861,6 @@ }, "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", "funding": [ { "type": "github", @@ -4248,8 +3888,6 @@ }, "node_modules/@csstools/postcss-color-mix-variadic-function-arguments/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -4273,8 +3911,6 @@ }, "node_modules/@csstools/postcss-content-alt-text": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", "funding": [ { "type": "github", @@ -4301,8 +3937,6 @@ }, "node_modules/@csstools/postcss-content-alt-text/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -4326,8 +3960,6 @@ }, "node_modules/@csstools/postcss-contrast-color-function": { "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", "funding": [ { "type": "github", @@ -4355,8 +3987,6 @@ }, "node_modules/@csstools/postcss-contrast-color-function/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -4380,8 +4010,6 @@ }, "node_modules/@csstools/postcss-exponential-functions": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", "funding": [ { "type": "github", @@ -4407,8 +4035,6 @@ }, "node_modules/@csstools/postcss-font-format-keywords": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4427,8 +4053,6 @@ }, "node_modules/@csstools/postcss-gamut-mapping": { "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", "funding": [ { "type": "github", @@ -4454,8 +4078,6 @@ }, "node_modules/@csstools/postcss-gradients-interpolation-method": { "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", "funding": [ { "type": "github", @@ -4483,8 +4105,6 @@ }, "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -4508,8 +4128,6 @@ }, "node_modules/@csstools/postcss-hwb-function": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4528,8 +4146,6 @@ }, "node_modules/@csstools/postcss-ic-unit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4549,8 +4165,6 @@ }, "node_modules/@csstools/postcss-initial": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", "funding": [ { "type": "github", @@ -4571,8 +4185,6 @@ }, "node_modules/@csstools/postcss-is-pseudo-class": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4592,8 +4204,6 @@ }, "node_modules/@csstools/postcss-light-dark-function": { "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", "funding": [ { "type": "github", @@ -4620,8 +4230,6 @@ }, "node_modules/@csstools/postcss-light-dark-function/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -4645,8 +4253,6 @@ }, "node_modules/@csstools/postcss-logical-float-and-clear": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", "funding": [ { "type": "github", @@ -4667,8 +4273,6 @@ }, "node_modules/@csstools/postcss-logical-overflow": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", "funding": [ { "type": "github", @@ -4689,8 +4293,6 @@ }, "node_modules/@csstools/postcss-logical-overscroll-behavior": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", "funding": [ { "type": "github", @@ -4711,8 +4313,6 @@ }, "node_modules/@csstools/postcss-logical-resize": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", "funding": [ { "type": "github", @@ -4736,8 +4336,6 @@ }, "node_modules/@csstools/postcss-logical-viewport-units": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", "funding": [ { "type": "github", @@ -4762,8 +4360,6 @@ }, "node_modules/@csstools/postcss-media-minmax": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", "funding": [ { "type": "github", @@ -4790,8 +4386,6 @@ }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", "funding": [ { "type": "github", @@ -4817,8 +4411,6 @@ }, "node_modules/@csstools/postcss-nested-calc": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4837,8 +4429,6 @@ }, "node_modules/@csstools/postcss-normalize-display-values": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4857,8 +4447,6 @@ }, "node_modules/@csstools/postcss-oklab-function": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4878,8 +4466,6 @@ }, "node_modules/@csstools/postcss-position-area-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", - "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", "funding": [ { "type": "github", @@ -4900,8 +4486,6 @@ }, "node_modules/@csstools/postcss-progressive-custom-properties": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -4916,8 +4500,6 @@ }, "node_modules/@csstools/postcss-property-rule-prelude-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", - "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", "funding": [ { "type": "github", @@ -4942,8 +4524,6 @@ }, "node_modules/@csstools/postcss-random-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", "funding": [ { "type": "github", @@ -4969,8 +4549,6 @@ }, "node_modules/@csstools/postcss-relative-color-syntax": { "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", "funding": [ { "type": "github", @@ -4998,8 +4576,6 @@ }, "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -5023,8 +4599,6 @@ }, "node_modules/@csstools/postcss-scope-pseudo-class": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", "funding": [ { "type": "github", @@ -5048,8 +4622,6 @@ }, "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -5061,8 +4633,6 @@ }, "node_modules/@csstools/postcss-sign-functions": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", "funding": [ { "type": "github", @@ -5088,8 +4658,6 @@ }, "node_modules/@csstools/postcss-stepped-value-functions": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -5108,8 +4676,6 @@ }, "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", - "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", "funding": [ { "type": "github", @@ -5133,8 +4699,6 @@ }, "node_modules/@csstools/postcss-system-ui-font-family": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", - "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", "funding": [ { "type": "github", @@ -5159,8 +4723,6 @@ }, "node_modules/@csstools/postcss-text-decoration-shorthand": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -5179,8 +4741,6 @@ }, "node_modules/@csstools/postcss-trigonometric-functions": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -5199,8 +4759,6 @@ }, "node_modules/@csstools/postcss-unset-value": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", "dev": true, "license": "CC0-1.0", "engines": { @@ -5216,8 +4774,6 @@ }, "node_modules/@csstools/selector-specificity": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "dev": true, "license": "CC0-1.0", "engines": { @@ -5233,8 +4789,6 @@ }, "node_modules/@csstools/utilities": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", "funding": [ { "type": "github", @@ -5255,8 +4809,6 @@ }, "node_modules/@databases/escape-identifier": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@databases/escape-identifier/-/escape-identifier-1.0.3.tgz", - "integrity": "sha512-Su36iSVzaHxpVdISVMViUX/32sLvzxVgjZpYhzhotxZUuLo11GVWsiHwqkvUZijTLUxcDmUqEwGJO3O/soLuZA==", "license": "MIT", "dependencies": { "@databases/validate-unicode": "^1.0.0" @@ -5264,20 +4816,14 @@ }, "node_modules/@databases/sql": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@databases/sql/-/sql-3.3.0.tgz", - "integrity": "sha512-vj9huEy4mjJ48GS1Z8yvtMm4BYAnFYACUds25ym6Gd/gsnngkJ17fo62a6mmbNNwCBS/8467PmZR01Zs/06TjA==", "license": "MIT" }, "node_modules/@databases/validate-unicode": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@databases/validate-unicode/-/validate-unicode-1.0.0.tgz", - "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==", "license": "MIT" }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -5285,8 +4831,6 @@ }, "node_modules/@docsearch/core": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.0.tgz", - "integrity": "sha512-IqG3oSd529jVRQ4dWZQKwZwQLVd//bWJTz2HiL0LkiHrI4U/vLrBasKB7lwQB/69nBAcCgs3TmudxTZSLH/ZQg==", "license": "MIT", "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -5307,14 +4851,10 @@ }, "node_modules/@docsearch/css": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.0.tgz", - "integrity": "sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ==", "license": "MIT" }, "node_modules/@docsearch/react": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.0.tgz", - "integrity": "sha512-j8H5B4ArGxBPBWvw3X0J0Rm/Pjv2JDa2rV5OE0DLTp5oiBCptIJ/YlNOhZxuzbO2nwge+o3Z52nJRi3hryK9cA==", "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.19.2", @@ -5344,8 +4884,6 @@ }, "node_modules/@docusaurus/babel": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", - "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -5370,8 +4908,6 @@ }, "node_modules/@docusaurus/bundler": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", - "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -5413,8 +4949,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-cascade-layers": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", "funding": [ { "type": "github", @@ -5439,8 +4973,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-color-function": { "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", "funding": [ { "type": "github", @@ -5468,8 +5000,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-font-format-keywords": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", "funding": [ { "type": "github", @@ -5494,8 +5024,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-hwb-function": { "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", "funding": [ { "type": "github", @@ -5523,8 +5051,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-ic-unit": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", "funding": [ { "type": "github", @@ -5550,8 +5076,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-is-pseudo-class": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", "funding": [ { "type": "github", @@ -5576,8 +5100,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-nested-calc": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", "funding": [ { "type": "github", @@ -5602,8 +5124,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-normalize-display-values": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", - "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", "funding": [ { "type": "github", @@ -5627,8 +5147,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-oklab-function": { "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", "funding": [ { "type": "github", @@ -5656,8 +5174,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -5681,8 +5197,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-stepped-value-functions": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", "funding": [ { "type": "github", @@ -5708,8 +5222,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-text-decoration-shorthand": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", "funding": [ { "type": "github", @@ -5734,8 +5246,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-trigonometric-functions": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", "funding": [ { "type": "github", @@ -5761,8 +5271,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/postcss-unset-value": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", "funding": [ { "type": "github", @@ -5783,8 +5291,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/selector-resolve-nested": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", "funding": [ { "type": "github", @@ -5805,8 +5311,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/@csstools/selector-specificity": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "funding": [ { "type": "github", @@ -5827,8 +5331,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/css-blank-pseudo": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", "funding": [ { "type": "github", @@ -5852,8 +5354,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/css-has-pseudo": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", "funding": [ { "type": "github", @@ -5879,8 +5379,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/css-prefers-color-scheme": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", "funding": [ { "type": "github", @@ -5901,8 +5399,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/cssdb": { "version": "8.8.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.8.0.tgz", - "integrity": "sha512-QbLeyz2Bgso1iRlh7IpWk6OKa3lLNGXsujVjDMPl9rOZpxKeiG69icLpbLCFxeURwmcdIfZqQyhlooKJYM4f8Q==", "funding": [ { "type": "opencollective", @@ -5917,8 +5413,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-attribute-case-insensitive": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", - "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", "funding": [ { "type": "github", @@ -5942,8 +5436,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-color-functional-notation": { "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", - "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", "funding": [ { "type": "github", @@ -5971,8 +5463,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-color-hex-alpha": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", - "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", "funding": [ { "type": "github", @@ -5997,8 +5487,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-color-rebeccapurple": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", - "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", "funding": [ { "type": "github", @@ -6023,8 +5511,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-custom-media": { "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", "funding": [ { "type": "github", @@ -6051,8 +5537,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-custom-properties": { "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", "funding": [ { "type": "github", @@ -6080,8 +5564,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-custom-selectors": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", "funding": [ { "type": "github", @@ -6108,8 +5590,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-dir-pseudo-class": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", - "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", "funding": [ { "type": "github", @@ -6133,8 +5613,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-double-position-gradients": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", - "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", "funding": [ { "type": "github", @@ -6160,8 +5638,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-focus-visible": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", - "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", "funding": [ { "type": "github", @@ -6185,8 +5661,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-focus-within": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", - "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "funding": [ { "type": "github", @@ -6210,8 +5684,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-gap-properties": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", - "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", "funding": [ { "type": "github", @@ -6232,8 +5704,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-image-set-function": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", - "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", "funding": [ { "type": "github", @@ -6258,8 +5728,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-lab-function": { "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", - "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", "funding": [ { "type": "github", @@ -6287,8 +5755,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-logical": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", - "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", "funding": [ { "type": "github", @@ -6312,8 +5778,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-nesting": { "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", "funding": [ { "type": "github", @@ -6339,8 +5803,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-opacity-percentage": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", - "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", "funding": [ { "type": "kofi", @@ -6361,8 +5823,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-overflow-shorthand": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", - "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", "funding": [ { "type": "github", @@ -6386,8 +5846,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-place": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", - "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", "funding": [ { "type": "github", @@ -6411,8 +5869,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-preset-env": { "version": "10.6.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", - "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", "funding": [ { "type": "github", @@ -6506,8 +5962,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-pseudo-class-any-link": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", - "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", "funding": [ { "type": "github", @@ -6531,8 +5985,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-selector-not": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", - "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", "funding": [ { "type": "github", @@ -6556,8 +6008,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -6569,8 +6019,6 @@ }, "node_modules/@docusaurus/core": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", - "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", "license": "MIT", "dependencies": { "@docusaurus/babel": "3.9.2", @@ -6630,8 +6078,6 @@ }, "node_modules/@docusaurus/core/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -6645,8 +6091,6 @@ }, "node_modules/@docusaurus/core/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -6661,8 +6105,6 @@ }, "node_modules/@docusaurus/core/node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -6685,8 +6127,6 @@ }, "node_modules/@docusaurus/core/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -6697,8 +6137,6 @@ }, "node_modules/@docusaurus/core/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -6709,8 +6147,6 @@ }, "node_modules/@docusaurus/core/node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -6721,8 +6157,6 @@ }, "node_modules/@docusaurus/core/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -6733,8 +6167,6 @@ }, "node_modules/@docusaurus/cssnano-preset": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", - "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", @@ -6748,8 +6180,6 @@ }, "node_modules/@docusaurus/logger": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", - "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -6761,8 +6191,6 @@ }, "node_modules/@docusaurus/logger/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -6776,8 +6204,6 @@ }, "node_modules/@docusaurus/logger/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -6792,8 +6218,6 @@ }, "node_modules/@docusaurus/logger/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -6804,8 +6228,6 @@ }, "node_modules/@docusaurus/mdx-loader": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", - "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", "license": "MIT", "dependencies": { "@docusaurus/logger": "3.9.2", @@ -6843,8 +6265,6 @@ }, "node_modules/@docusaurus/module-type-aliases": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", - "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", "license": "MIT", "dependencies": { "@docusaurus/types": "3.9.2", @@ -6862,8 +6282,6 @@ }, "node_modules/@docusaurus/plugin-content-blog": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", - "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6896,8 +6314,6 @@ }, "node_modules/@docusaurus/plugin-content-docs": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", - "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6929,8 +6345,6 @@ }, "node_modules/@docusaurus/plugin-content-pages": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", - "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6952,8 +6366,6 @@ }, "node_modules/@docusaurus/plugin-css-cascade-layers": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", - "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6968,8 +6380,6 @@ }, "node_modules/@docusaurus/plugin-debug": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", - "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6989,8 +6399,6 @@ }, "node_modules/@docusaurus/plugin-google-analytics": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", - "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7008,8 +6416,6 @@ }, "node_modules/@docusaurus/plugin-google-gtag": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", - "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7028,8 +6434,6 @@ }, "node_modules/@docusaurus/plugin-google-tag-manager": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", - "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7047,8 +6451,6 @@ }, "node_modules/@docusaurus/plugin-sitemap": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", - "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7071,8 +6473,6 @@ }, "node_modules/@docusaurus/plugin-svgr": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", - "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7094,8 +6494,6 @@ }, "node_modules/@docusaurus/preset-classic": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", - "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7124,8 +6522,6 @@ }, "node_modules/@docusaurus/theme-classic": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", - "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7164,8 +6560,6 @@ }, "node_modules/@docusaurus/theme-common": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", - "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", "license": "MIT", "dependencies": { "@docusaurus/mdx-loader": "3.9.2", @@ -7192,8 +6586,6 @@ }, "node_modules/@docusaurus/theme-search-algolia": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", - "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", "license": "MIT", "dependencies": { "@docsearch/react": "^3.9.0 || ^4.1.0", @@ -7223,8 +6615,6 @@ }, "node_modules/@docusaurus/theme-translations": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", - "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -7236,15 +6626,11 @@ }, "node_modules/@docusaurus/tsconfig": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", - "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", "dev": true, "license": "MIT" }, "node_modules/@docusaurus/types": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", - "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -7265,8 +6651,6 @@ }, "node_modules/@docusaurus/types/node_modules/webpack-merge": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -7279,8 +6663,6 @@ }, "node_modules/@docusaurus/utils": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", - "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", "license": "MIT", "dependencies": { "@docusaurus/logger": "3.9.2", @@ -7311,8 +6693,6 @@ }, "node_modules/@docusaurus/utils-common": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", - "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", "license": "MIT", "dependencies": { "@docusaurus/types": "3.9.2", @@ -7324,8 +6704,6 @@ }, "node_modules/@docusaurus/utils-validation": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", - "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", "license": "MIT", "dependencies": { "@docusaurus/logger": "3.9.2", @@ -7343,8 +6721,6 @@ }, "node_modules/@dotenvx/dotenvx": { "version": "1.55.1", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.55.1.tgz", - "integrity": "sha512-WEuKyoe9CA7dfcFBnNbL0ndbCNcptaEYBygfFo9X1qEG+HD7xku4CYIplw6sbAHJavesZWbVBHeRSpvri0eKqw==", "license": "BSD-3-Clause", "dependencies": { "commander": "^11.1.0", @@ -7366,8 +6742,6 @@ }, "node_modules/@dotenvx/dotenvx/node_modules/commander": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "license": "MIT", "engines": { "node": ">=16" @@ -7375,21 +6749,15 @@ }, "node_modules/@drdgvhbh/postgres-error-codes": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@drdgvhbh/postgres-error-codes/-/postgres-error-codes-0.0.6.tgz", - "integrity": "sha512-tAz0Xp+qhq90x0r/3VW96iRdHFw72cYQqXa65u0eFVhSMC27bc2gZ8Ky5WXEmshrl/bCe7QTYBNEF0U5zeSQjw==", "license": "MIT" }, "node_modules/@drizzle-team/brocli": { "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", - "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", "dev": true, "license": "Apache-2.0" }, "node_modules/@ecies/ciphers": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.5.tgz", - "integrity": "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==", "license": "MIT", "engines": { "bun": ">=1", @@ -7402,8 +6770,6 @@ }, "node_modules/@edge-runtime/format": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.1.tgz", - "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==", "license": "MPL-2.0", "engines": { "node": ">=16" @@ -7411,8 +6777,6 @@ }, "node_modules/@edge-runtime/node-utils": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz", - "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==", "license": "MPL-2.0", "engines": { "node": ">=16" @@ -7420,8 +6784,6 @@ }, "node_modules/@edge-runtime/ponyfill": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz", - "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==", "license": "MPL-2.0", "engines": { "node": ">=16" @@ -7429,8 +6791,6 @@ }, "node_modules/@edge-runtime/primitives": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz", - "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==", "license": "MPL-2.0", "engines": { "node": ">=16" @@ -7438,8 +6798,6 @@ }, "node_modules/@edge-runtime/vm": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz", - "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==", "license": "MPL-2.0", "dependencies": { "@edge-runtime/primitives": "4.1.0" @@ -7450,15 +6808,11 @@ }, "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==", "dev": true, "license": "Apache-2.0" }, "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==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7470,8 +6824,6 @@ }, "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==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -7480,8 +6832,6 @@ }, "node_modules/@emnapi/core": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", - "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", "license": "MIT", "optional": true, "dependencies": { @@ -7491,8 +6841,6 @@ }, "node_modules/@emnapi/runtime": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", - "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", "license": "MIT", "optional": true, "dependencies": { @@ -7501,8 +6849,6 @@ }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "license": "MIT", "optional": true, "dependencies": { @@ -7511,9 +6857,6 @@ }, "node_modules/@esbuild-kit/core-utils": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", - "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "deprecated": "Merged into tsx: https://tsx.is", "dev": true, "license": "MIT", "dependencies": { @@ -7574,8 +6917,6 @@ }, "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], @@ -7897,8 +7238,6 @@ }, "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7935,9 +7274,6 @@ }, "node_modules/@esbuild-kit/esm-loader": { "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "deprecated": "Merged into tsx: https://tsx.is", "dev": true, "license": "MIT", "dependencies": { @@ -7946,13 +7282,12 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7963,13 +7298,12 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7980,13 +7314,12 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7997,13 +7330,12 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8015,8 +7347,6 @@ }, "node_modules/@esbuild/darwin-arm64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -8031,13 +7361,12 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8048,13 +7377,12 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8065,13 +7393,12 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8082,13 +7409,12 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8099,13 +7425,12 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8116,13 +7441,12 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8133,13 +7457,12 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8150,13 +7473,12 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8167,13 +7489,12 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8184,13 +7505,12 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8201,13 +7521,12 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8218,13 +7537,12 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8235,13 +7553,12 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8252,13 +7569,12 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8269,13 +7585,12 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8286,13 +7601,12 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8303,13 +7617,12 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8320,13 +7633,12 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8337,13 +7649,12 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8354,13 +7665,12 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8371,13 +7681,12 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8389,8 +7698,6 @@ }, "node_modules/@faker-js/faker": { "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.9.0.tgz", - "integrity": "sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==", "funding": [ { "type": "opencollective", @@ -8405,8 +7712,6 @@ }, "node_modules/@fastify/ajv-compiler": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", - "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", "funding": [ { "type": "github", @@ -8426,8 +7731,6 @@ }, "node_modules/@fastify/busboy": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "license": "MIT", "engines": { "node": ">=14" @@ -8435,8 +7738,6 @@ }, "node_modules/@fastify/cookie": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@fastify/cookie/-/cookie-10.0.1.tgz", - "integrity": "sha512-NV/wbCUv4ETJ5KM1KMu0fLx0nSCm9idIxwg66NZnNbfPQH3rdbx6k0qRs5uy0y+MhBgvDudYRA30KlK659chyw==", "license": "MIT", "dependencies": { "cookie-signature": "^1.2.1", @@ -8445,8 +7746,6 @@ }, "node_modules/@fastify/cors": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-10.1.0.tgz", - "integrity": "sha512-MZyBCBJtII60CU9Xme/iE4aEy8G7QpzGR8zkdXZkDFt7ElEMachbE61tfhAG/bvSaULlqlf0huMT12T7iqEmdQ==", "funding": [ { "type": "github", @@ -8465,8 +7764,6 @@ }, "node_modules/@fastify/error": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", - "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", "funding": [ { "type": "github", @@ -8481,8 +7778,6 @@ }, "node_modules/@fastify/fast-json-stringify-compiler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", - "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", "funding": [ { "type": "github", @@ -8500,8 +7795,6 @@ }, "node_modules/@fastify/forwarded": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", - "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", "funding": [ { "type": "github", @@ -8516,8 +7809,6 @@ }, "node_modules/@fastify/merge-json-schemas": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", - "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", "funding": [ { "type": "github", @@ -8535,8 +7826,6 @@ }, "node_modules/@fastify/oauth2": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@fastify/oauth2/-/oauth2-8.2.0.tgz", - "integrity": "sha512-JQls0pZVt7k9j+qLrSf5OGflpHvylgEfSCVSA2oDaILCX3dwC/Z0UeI1J9M3luik7dtEbEFfpq0v9hF1v/46pQ==", "funding": [ { "type": "github", @@ -8556,8 +7845,6 @@ }, "node_modules/@fastify/oauth2/node_modules/@fastify/cookie": { "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@fastify/cookie/-/cookie-11.0.2.tgz", - "integrity": "sha512-GWdwdGlgJxyvNv+QcKiGNevSspMQXncjMZ1J8IvuDQk0jvkzgWWZFNC2En3s+nHndZBGV8IbLwOI/sxCZw/mzA==", "funding": [ { "type": "github", @@ -8576,8 +7863,6 @@ }, "node_modules/@fastify/proxy-addr": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", - "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", "funding": [ { "type": "github", @@ -8596,8 +7881,6 @@ }, "node_modules/@fastify/websocket": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.2.0.tgz", - "integrity": "sha512-3HrDPbAG1CzUCqnslgJxppvzaAZffieOVbLp1DAy1huCSynUWPifSvfdEDUR8HlJLp3sp1A36uOM2tJogADS8w==", "funding": [ { "type": "github", @@ -8617,8 +7900,6 @@ }, "node_modules/@floating-ui/core": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.11" @@ -8626,8 +7907,6 @@ }, "node_modules/@floating-ui/dom": { "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", "license": "MIT", "dependencies": { "@floating-ui/core": "^1.7.5", @@ -8636,8 +7915,6 @@ }, "node_modules/@floating-ui/react": { "version": "0.26.28", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", - "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.1.2", @@ -8651,8 +7928,6 @@ }, "node_modules/@floating-ui/react-dom": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.7.6" @@ -8664,14 +7939,10 @@ }, "node_modules/@floating-ui/utils": { "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, "node_modules/@gerrit0/mini-shiki": { "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", - "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", "dev": true, "license": "MIT", "dependencies": { @@ -8684,8 +7955,6 @@ }, "node_modules/@google-cloud/precise-date": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", - "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==", "license": "Apache-2.0", "engines": { "node": ">=14.0.0" @@ -8693,8 +7962,6 @@ }, "node_modules/@graphql-tools/merge": { "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.1.tgz", - "integrity": "sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg==", "dev": true, "license": "MIT", "dependencies": { @@ -8707,8 +7974,6 @@ }, "node_modules/@graphql-tools/merge/node_modules/@graphql-tools/utils": { "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.9.0.tgz", - "integrity": "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==", "dev": true, "license": "MIT", "dependencies": { @@ -8720,8 +7985,6 @@ }, "node_modules/@graphql-tools/schema": { "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.5.1.tgz", - "integrity": "sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg==", "dev": true, "license": "MIT", "dependencies": { @@ -8736,8 +7999,6 @@ }, "node_modules/@graphql-tools/schema/node_modules/@graphql-tools/utils": { "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.9.0.tgz", - "integrity": "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==", "dev": true, "license": "MIT", "dependencies": { @@ -8749,8 +8010,6 @@ }, "node_modules/@graphql-tools/utils": { "version": "8.13.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", - "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", "dev": true, "license": "MIT", "dependencies": { @@ -8762,8 +8021,6 @@ }, "node_modules/@grpc/grpc-js": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", - "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.8.0", @@ -8775,8 +8032,6 @@ }, "node_modules/@grpc/proto-loader": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", @@ -8793,8 +8048,6 @@ }, "node_modules/@hapi/boom": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz", - "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==", "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^11.0.2" @@ -8802,26 +8055,18 @@ }, "node_modules/@hapi/boom/node_modules/@hapi/hoek": { "version": "11.0.7", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", - "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", "license": "BSD-3-Clause" }, "node_modules/@hapi/bourne": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", "license": "BSD-3-Clause" }, "node_modules/@hapi/hoek": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" @@ -8829,8 +8074,6 @@ }, "node_modules/@hapi/wreck": { "version": "18.1.0", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.1.0.tgz", - "integrity": "sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w==", "license": "BSD-3-Clause", "dependencies": { "@hapi/boom": "^10.0.1", @@ -8840,14 +8083,10 @@ }, "node_modules/@hapi/wreck/node_modules/@hapi/hoek": { "version": "11.0.7", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", - "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", "license": "BSD-3-Clause" }, "node_modules/@headlessui/react": { "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.9.tgz", - "integrity": "sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.16", @@ -8866,8 +8105,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -8879,8 +8116,6 @@ }, "node_modules/@httptoolkit/httpolyglot": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@httptoolkit/httpolyglot/-/httpolyglot-3.0.1.tgz", - "integrity": "sha512-fU9psZBRc49PfdrxFZ8W19SwVQ4+rrc0EYVxmy7H41y6/elaIu5p68wly4uLVt1DPD0K92MdN65GqP3N1ofZKg==", "dev": true, "license": "MIT", "dependencies": { @@ -8892,8 +8127,6 @@ }, "node_modules/@httptoolkit/subscriptions-transport-ws": { "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@httptoolkit/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.2.tgz", - "integrity": "sha512-YB+gYYVjgYUeJrGkfS91ABeNWCFU7EVcn9Cflf2UXjsIiPJEI6yPxujPcjKv9wIJpM+33KQW/qVEmc+BdIDK2w==", "dev": true, "license": "MIT", "dependencies": { @@ -8909,22 +8142,16 @@ }, "node_modules/@httptoolkit/subscriptions-transport-ws/node_modules/eventemitter3": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", "dev": true, "license": "MIT" }, "node_modules/@httptoolkit/util": { "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@httptoolkit/util/-/util-0.1.9.tgz", - "integrity": "sha512-MRRf7UAHcb/bXfytFDmuCo+XRH6HqxXpQpTMT8KUd95YCLDiofPOBE+2SV3M6rG4YYeEf3WxNzQiidn3qo1akQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@httptoolkit/websocket-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz", - "integrity": "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8940,8 +8167,6 @@ }, "node_modules/@httptoolkit/websocket-stream/node_modules/duplexify": { "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "license": "MIT", "dependencies": { @@ -8953,15 +8178,11 @@ }, "node_modules/@httptoolkit/websocket-stream/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, "node_modules/@httptoolkit/websocket-stream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -8976,8 +8197,6 @@ }, "node_modules/@httptoolkit/websocket-stream/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { @@ -8986,8 +8205,6 @@ }, "node_modules/@isaacs/balanced-match": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "dev": true, "license": "MIT", "engines": { @@ -8996,8 +8213,6 @@ }, "node_modules/@isaacs/brace-expansion": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9009,8 +8224,6 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { @@ -9027,8 +8240,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -9040,8 +8251,6 @@ }, "node_modules/@isaacs/cliui/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==", "dev": true, "license": "MIT", "dependencies": { @@ -9056,8 +8265,6 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -9068,8 +8275,6 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -9085,8 +8290,6 @@ }, "node_modules/@jest/types/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -9100,8 +8303,6 @@ }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9116,8 +8317,6 @@ }, "node_modules/@jest/types/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -9128,8 +8327,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -9138,8 +8335,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -9148,8 +8343,6 @@ }, "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" @@ -9157,8 +8350,6 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -9167,14 +8358,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -9183,8 +8370,6 @@ }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "license": "MIT", "funding": { "type": "opencollective", @@ -9193,8 +8378,6 @@ }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9209,8 +8392,6 @@ }, "node_modules/@jsonjoy.com/buffers": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9225,8 +8406,6 @@ }, "node_modules/@jsonjoy.com/codegen": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9241,8 +8420,6 @@ }, "node_modules/@jsonjoy.com/fs-core": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.56.11.tgz", - "integrity": "sha512-wThHjzUp01ImIjfCwhs+UnFkeGPFAymwLEkOtenHewaKe2pTP12p6r1UuwikA9NEvNf9Vlck92r8fb8n/MWM5w==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-node-builtins": "4.56.11", @@ -9262,8 +8439,6 @@ }, "node_modules/@jsonjoy.com/fs-fsa": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.56.11.tgz", - "integrity": "sha512-ZYlF3XbMayyp97xEN8ZvYutU99PCHjM64mMZvnCseXkCJXJDVLAwlF8Q/7q/xiWQRsv3pQBj1WXHd9eEyYcaCQ==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-core": "4.56.11", @@ -9284,8 +8459,6 @@ }, "node_modules/@jsonjoy.com/fs-node": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.56.11.tgz", - "integrity": "sha512-D65YrnP6wRuZyEWoSFnBJSr5zARVpVBGctnhie4rCsMuGXNzX7IHKaOt85/Aj7SSoG1N2+/xlNjWmkLvZ2H3Tg==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-core": "4.56.11", @@ -9309,8 +8482,6 @@ }, "node_modules/@jsonjoy.com/fs-node-builtins": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.56.11.tgz", - "integrity": "sha512-CNmt3a0zMCIhniFLXtzPWuUxXFU+U+2VyQiIrgt/rRVeEJNrMQUABaRbVxR0Ouw1LyR9RjaEkPM6nYpED+y43A==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9325,8 +8496,6 @@ }, "node_modules/@jsonjoy.com/fs-node-to-fsa": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.56.11.tgz", - "integrity": "sha512-5OzGdvJDgZVo+xXWEYo72u81zpOWlxlbG4d4nL+hSiW+LKlua/dldNgPrpWxtvhgyntmdFQad2UTxFyGjJAGhA==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-fsa": "4.56.11", @@ -9346,8 +8515,6 @@ }, "node_modules/@jsonjoy.com/fs-node-utils": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.56.11.tgz", - "integrity": "sha512-JADOZFDA3wRfsuxkT0+MYc4F9hJO2PYDaY66kRTG6NqGX3+bqmKu66YFYAbII/tEmQWPZeHoClUB23rtQM9UPg==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-node-builtins": "4.56.11" @@ -9365,8 +8532,6 @@ }, "node_modules/@jsonjoy.com/fs-print": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.56.11.tgz", - "integrity": "sha512-rnaKRgCRIn8JGTjxhS0JPE38YM3Pj/H7SW4/tglhIPbfKEkky7dpPayNKV2qy25SZSL15oFVgH/62dMZ/z7cyA==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-node-utils": "4.56.11", @@ -9385,8 +8550,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.56.11.tgz", - "integrity": "sha512-IIldPX+cIRQuUol9fQzSS3hqyECxVpYMJQMqdU3dCKZFRzEl1rkIkw4P6y7Oh493sI7YdxZlKr/yWdzEWZ1wGQ==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", @@ -9407,8 +8570,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9423,8 +8584,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9439,8 +8598,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "17.67.0", @@ -9465,8 +8622,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/util": "17.67.0" @@ -9484,8 +8639,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "17.67.0", @@ -9504,8 +8657,6 @@ }, "node_modules/@jsonjoy.com/json-pack": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "^1.1.2", @@ -9530,8 +8681,6 @@ }, "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9546,8 +8695,6 @@ }, "node_modules/@jsonjoy.com/json-pointer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/codegen": "^1.0.0", @@ -9566,8 +8713,6 @@ }, "node_modules/@jsonjoy.com/util": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "^1.0.0", @@ -9586,8 +8731,6 @@ }, "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9602,14 +8745,10 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "license": "MIT" }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "license": "BSD-3-Clause", "dependencies": { "detect-libc": "^2.0.0", @@ -9628,8 +8767,6 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -9640,8 +8777,6 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -9653,8 +8788,6 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "license": "MIT", "dependencies": { "semver": "^6.0.0" @@ -9668,8 +8801,6 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -9677,8 +8808,6 @@ }, "node_modules/@mdx-js/mdx": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", - "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -9714,8 +8843,6 @@ }, "node_modules/@mdx-js/react": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", "dependencies": { "@types/mdx": "^2.0.0" @@ -9731,8 +8858,6 @@ }, "node_modules/@microsoft/api-extractor-model": { "version": "7.32.0", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.0.tgz", - "integrity": "sha512-QIVJSreb8fGGJy1Qx0yzGVXxvHJN1WXgkFNHFheVv1iBJNqgvp+xeT3ienJmRwXmPPc5Es/cxBrXtKZJR3i7iw==", "dev": true, "license": "MIT", "dependencies": { @@ -9743,15 +8868,11 @@ }, "node_modules/@microsoft/tsdoc": { "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", - "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", "dev": true, "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", - "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", "dev": true, "license": "MIT", "dependencies": { @@ -9763,8 +8884,6 @@ }, "node_modules/@monaco-editor/loader": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", - "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", "license": "MIT", "dependencies": { "state-local": "^1.0.6" @@ -9772,8 +8891,6 @@ }, "node_modules/@monaco-editor/react": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", - "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", "license": "MIT", "dependencies": { "@monaco-editor/loader": "^1.5.0" @@ -9786,8 +8903,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -9800,8 +8915,6 @@ }, "node_modules/@mrleebo/prisma-ast/node_modules/lilconfig": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "license": "MIT", "engines": { @@ -9810,8 +8923,6 @@ }, "node_modules/@mswjs/interceptors": { "version": "0.41.3", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", - "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", "dev": true, "license": "MIT", "dependencies": { @@ -9828,8 +8939,6 @@ }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "license": "MIT", "optional": true, "dependencies": { @@ -9844,8 +8953,6 @@ }, "node_modules/@noble/ciphers": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -9856,8 +8963,6 @@ }, "node_modules/@noble/curves": { "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -9871,8 +8976,6 @@ }, "node_modules/@noble/hashes": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -9883,8 +8986,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -9896,8 +8997,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -9905,8 +9004,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -9918,8 +9015,6 @@ }, "node_modules/@octokit/auth-token": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", "license": "MIT", "engines": { "node": ">= 18" @@ -9927,8 +9022,6 @@ }, "node_modules/@octokit/core": { "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz", - "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==", "license": "MIT", "dependencies": { "@octokit/auth-token": "^5.0.0", @@ -9945,8 +9038,6 @@ }, "node_modules/@octokit/endpoint": { "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", "license": "MIT", "dependencies": { "@octokit/types": "^14.0.0", @@ -9958,8 +9049,6 @@ }, "node_modules/@octokit/graphql": { "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", "license": "MIT", "dependencies": { "@octokit/request": "^9.2.3", @@ -9972,14 +9061,10 @@ }, "node_modules/@octokit/openapi-types": { "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", "license": "MIT" }, "node_modules/@octokit/request": { "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", - "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", "license": "MIT", "dependencies": { "@octokit/endpoint": "^10.1.4", @@ -9994,8 +9079,6 @@ }, "node_modules/@octokit/request-error": { "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", "license": "MIT", "dependencies": { "@octokit/types": "^14.0.0" @@ -10006,8 +9089,6 @@ }, "node_modules/@octokit/types": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", "license": "MIT", "dependencies": { "@octokit/openapi-types": "^25.1.0" @@ -10015,15 +9096,11 @@ }, "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", "dev": true, "license": "MIT" }, "node_modules/@open-draft/logger": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10033,15 +9110,11 @@ }, "node_modules/@open-draft/until": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true, "license": "MIT" }, "node_modules/@opentelemetry/api": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", "engines": { "node": ">=8.0.0" @@ -10049,8 +9122,6 @@ }, "node_modules/@opentelemetry/api-logs": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.203.0.tgz", - "integrity": "sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.3.0" @@ -10061,8 +9132,6 @@ }, "node_modules/@opentelemetry/auto-instrumentations-node": { "version": "0.62.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.62.2.tgz", - "integrity": "sha512-Ipe6X7ddrCiRsuewyTU83IvKiSFT4piqmv9z8Ovg1E7v98pdTj1pUE6sDrHV50zl7/ypd+cONBgt+EYSZu4u9Q==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -10124,8 +9193,6 @@ }, "node_modules/@opentelemetry/context-async-hooks": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.0.tgz", - "integrity": "sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10136,8 +9203,6 @@ }, "node_modules/@opentelemetry/core": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", - "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10151,8 +9216,6 @@ }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.203.0.tgz", - "integrity": "sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", @@ -10171,8 +9234,6 @@ }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10186,8 +9247,6 @@ }, "node_modules/@opentelemetry/exporter-logs-otlp-http": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.203.0.tgz", - "integrity": "sha512-s0hys1ljqlMTbXx2XiplmMJg9wG570Z5lH7wMvrZX6lcODI56sG4HL03jklF63tBeyNwK2RV1/ntXGo3HgG4Qw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.203.0", @@ -10205,8 +9264,6 @@ }, "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10220,8 +9277,6 @@ }, "node_modules/@opentelemetry/exporter-logs-otlp-proto": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.203.0.tgz", - "integrity": "sha512-nl/7S91MXn5R1aIzoWtMKGvqxgJgepB/sH9qW0rZvZtabnsjbf8OQ1uSx3yogtvLr0GzwD596nQKz2fV7q2RBw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.203.0", @@ -10241,8 +9296,6 @@ }, "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10256,8 +9309,6 @@ }, "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10272,8 +9323,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.203.0.tgz", - "integrity": "sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", @@ -10294,8 +9343,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10309,8 +9356,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10325,8 +9370,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10341,8 +9384,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-http": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.203.0.tgz", - "integrity": "sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10360,8 +9401,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10375,8 +9414,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10391,8 +9428,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10407,8 +9442,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.203.0.tgz", - "integrity": "sha512-OZnhyd9npU7QbyuHXFEPVm3LnjZYifuKpT3kTnF84mXeEQ84pJJZgyLBpU4FSkSwUkt/zbMyNAI7y5+jYTWGIg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10427,8 +9460,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10442,8 +9473,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10458,8 +9487,6 @@ }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10474,8 +9501,6 @@ }, "node_modules/@opentelemetry/exporter-prometheus": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.203.0.tgz", - "integrity": "sha512-2jLuNuw5m4sUj/SncDf/mFPabUxMZmmYetx5RKIMIQyPnl6G6ooFzfeE8aXNRf8YD1ZXNlCnRPcISxjveGJHNg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10491,8 +9516,6 @@ }, "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10506,8 +9529,6 @@ }, "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10522,8 +9543,6 @@ }, "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10538,8 +9557,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.203.0.tgz", - "integrity": "sha512-322coOTf81bm6cAA8+ML6A+m4r2xTCdmAZzGNTboPXRzhwPt4JEmovsFAs+grpdarObd68msOJ9FfH3jxM6wqA==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", @@ -10559,8 +9576,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10574,8 +9589,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10590,8 +9603,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.203.0.tgz", - "integrity": "sha512-ZDiaswNYo0yq/cy1bBLJFe691izEJ6IgNmkjm4C6kE9ub/OMQqDXORx2D2j8fzTBTxONyzusbaZlqtfmyqURPw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10609,8 +9620,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10624,8 +9633,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10640,8 +9647,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-proto": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.203.0.tgz", - "integrity": "sha512-1xwNTJ86L0aJmWRwENCJlH4LULMG2sOXWIVw+Szta4fkqKVY50Eo4HoVKKq6U9QEytrWCr8+zjw0q/ZOeXpcAQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10659,8 +9664,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10674,8 +9677,6 @@ }, "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10690,8 +9691,6 @@ }, "node_modules/@opentelemetry/exporter-zipkin": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.0.1.tgz", - "integrity": "sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10708,8 +9707,6 @@ }, "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -10723,8 +9720,6 @@ }, "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -10739,8 +9734,6 @@ }, "node_modules/@opentelemetry/instrumentation": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.203.0.tgz", - "integrity": "sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.203.0", @@ -10756,8 +9749,6 @@ }, "node_modules/@opentelemetry/instrumentation-amqplib": { "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.50.0.tgz", - "integrity": "sha512-kwNs/itehHG/qaQBcVrLNcvXVPW0I4FCOVtw3LHMLdYIqD7GJ6Yv2nX+a4YHjzbzIeRYj8iyMp0Bl7tlkidq5w==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -10773,8 +9764,6 @@ }, "node_modules/@opentelemetry/instrumentation-aws-lambda": { "version": "0.54.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.54.1.tgz", - "integrity": "sha512-qm8pGSAM1mXk7unbrGktWWGJc6IFI58ZsaHJ+i420Fp5VO3Vf7GglIgaXTS8CKBrVB4LHFj3NvzJg31PtsAQcA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -10790,8 +9779,6 @@ }, "node_modules/@opentelemetry/instrumentation-aws-sdk": { "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.58.0.tgz", - "integrity": "sha512-9vFH7gU686dsAeLMCkqUj9y0MQZ1xrTtStSpNV2UaGWtDnRjJrAdJLu9Y545oKEaDTeVaob4UflyZvvpZnw3Xw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -10807,8 +9794,6 @@ }, "node_modules/@opentelemetry/instrumentation-bunyan": { "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.49.0.tgz", - "integrity": "sha512-ky5Am1y6s3Ex/3RygHxB/ZXNG07zPfg9Z6Ora+vfeKcr/+I6CJbWXWhSBJor3gFgKN3RvC11UWVURnmDpBS6Pg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "^0.203.0", @@ -10824,8 +9809,6 @@ }, "node_modules/@opentelemetry/instrumentation-cassandra-driver": { "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.49.0.tgz", - "integrity": "sha512-BNIvqldmLkeikfI5w5Rlm9vG5NnQexfPoxOgEMzfDVOEF+vS6351I6DzWLLgWWR9CNF/jQJJi/lr6am2DLp0Rw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -10840,8 +9823,6 @@ }, "node_modules/@opentelemetry/instrumentation-connect": { "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.47.0.tgz", - "integrity": "sha512-pjenvjR6+PMRb6/4X85L4OtkQCootgb/Jzh/l/Utu3SJHBid1F+gk9sTGU2FWuhhEfV6P7MZ7BmCdHXQjgJ42g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -10858,8 +9839,6 @@ }, "node_modules/@opentelemetry/instrumentation-cucumber": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.19.0.tgz", - "integrity": "sha512-99ms8kQWRuPt5lkDqbJJzD+7Tq5TMUlBZki4SA2h6CgK4ncX+tyep9XFY1e+XTBLJIWmuFMGbWqBLJ4fSKIQNQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -10874,8 +9853,6 @@ }, "node_modules/@opentelemetry/instrumentation-dataloader": { "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.21.1.tgz", - "integrity": "sha512-hNAm/bwGawLM8VDjKR0ZUDJ/D/qKR3s6lA5NV+btNaPVm2acqhPcT47l2uCVi+70lng2mywfQncor9v8/ykuyw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0" @@ -10889,8 +9866,6 @@ }, "node_modules/@opentelemetry/instrumentation-dns": { "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.47.0.tgz", - "integrity": "sha512-775fOnewWkTF4iXMGKgwvOGqEmPrU1PZpXjjqvTrEErYBJe7Fz1WlEeUStHepyKOdld7Ghv7TOF/kE3QDctvrg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0" @@ -10904,8 +9879,6 @@ }, "node_modules/@opentelemetry/instrumentation-express": { "version": "0.52.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.52.0.tgz", - "integrity": "sha512-W7pizN0Wh1/cbNhhTf7C62NpyYw7VfCFTYg0DYieSTrtPBT1vmoSZei19wfKLnrMsz3sHayCg0HxCVL2c+cz5w==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -10921,8 +9894,6 @@ }, "node_modules/@opentelemetry/instrumentation-fastify": { "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.48.0.tgz", - "integrity": "sha512-3zQlE/DoVfVH6/ycuTv7vtR/xib6WOa0aLFfslYcvE62z0htRu/ot8PV/zmMZfnzpTQj8S/4ULv36R6UIbpJIg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -10938,8 +9909,6 @@ }, "node_modules/@opentelemetry/instrumentation-fs": { "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.23.0.tgz", - "integrity": "sha512-Puan+QopWHA/KNYvDfOZN6M/JtF6buXEyD934vrb8WhsX1/FuM7OtoMlQyIqAadnE8FqqDL4KDPiEfCQH6pQcQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -10954,8 +9923,6 @@ }, "node_modules/@opentelemetry/instrumentation-generic-pool": { "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.47.0.tgz", - "integrity": "sha512-UfHqf3zYK+CwDwEtTjaD12uUqGGTswZ7ofLBEdQ4sEJp9GHSSJMQ2hT3pgBxyKADzUdoxQAv/7NqvL42ZI+Qbw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0" @@ -10969,8 +9936,6 @@ }, "node_modules/@opentelemetry/instrumentation-graphql": { "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.51.0.tgz", - "integrity": "sha512-LchkOu9X5DrXAnPI1+Z06h/EH/zC7D6sA86hhPrk3evLlsJTz0grPrkL/yUJM9Ty0CL/y2HSvmWQCjbJEz/ADg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0" @@ -10984,8 +9949,6 @@ }, "node_modules/@opentelemetry/instrumentation-grpc": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.203.0.tgz", - "integrity": "sha512-Qmjx2iwccHYRLoE4RFS46CvQE9JG9Pfeae4EPaNZjvIuJxb/pZa2R9VWzRlTehqQWpAvto/dGhtkw8Tv+o0LTg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "0.203.0", @@ -11000,8 +9963,6 @@ }, "node_modules/@opentelemetry/instrumentation-hapi": { "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.50.0.tgz", - "integrity": "sha512-5xGusXOFQXKacrZmDbpHQzqYD1gIkrMWuwvlrEPkYOsjUqGUjl1HbxCsn5Y9bUXOCgP1Lj6A4PcKt1UiJ2MujA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11017,8 +9978,6 @@ }, "node_modules/@opentelemetry/instrumentation-http": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.203.0.tgz", - "integrity": "sha512-y3uQAcCOAwnO6vEuNVocmpVzG3PER6/YZqbPbbffDdJ9te5NkHEkfSMNzlC3+v7KlE+WinPGc3N7MR30G1HY2g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11035,8 +9994,6 @@ }, "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11050,8 +10007,6 @@ }, "node_modules/@opentelemetry/instrumentation-ioredis": { "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.51.0.tgz", - "integrity": "sha512-9IUws0XWCb80NovS+17eONXsw1ZJbHwYYMXiwsfR9TSurkLV5UNbRSKb9URHO+K+pIJILy9wCxvyiOneMr91Ig==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11067,8 +10022,6 @@ }, "node_modules/@opentelemetry/instrumentation-kafkajs": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.13.0.tgz", - "integrity": "sha512-FPQyJsREOaGH64hcxlzTsIEQC4DYANgTwHjiB7z9lldmvua1LRMVn3/FfBlzXoqF179B0VGYviz6rn75E9wsDw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11083,8 +10036,6 @@ }, "node_modules/@opentelemetry/instrumentation-knex": { "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.48.0.tgz", - "integrity": "sha512-V5wuaBPv/lwGxuHjC6Na2JFRjtPgstw19jTFl1B1b6zvaX8zVDYUDaR5hL7glnQtUSCMktPttQsgK4dhXpddcA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11099,8 +10050,6 @@ }, "node_modules/@opentelemetry/instrumentation-koa": { "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.51.0.tgz", - "integrity": "sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11116,8 +10065,6 @@ }, "node_modules/@opentelemetry/instrumentation-lru-memoizer": { "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.48.0.tgz", - "integrity": "sha512-KUW29wfMlTPX1wFz+NNrmE7IzN7NWZDrmFWHM/VJcmFEuQGnnBuTIdsP55CnBDxKgQ/qqYFp4udQFNtjeFosPw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0" @@ -11131,8 +10078,6 @@ }, "node_modules/@opentelemetry/instrumentation-memcached": { "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.47.0.tgz", - "integrity": "sha512-vXDs/l4hlWy1IepPG1S6aYiIZn+tZDI24kAzwKKJmR2QEJRL84PojmALAEJGazIOLl/VdcCPZdMb0U2K0VzojA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11148,8 +10093,6 @@ }, "node_modules/@opentelemetry/instrumentation-mongodb": { "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.56.0.tgz", - "integrity": "sha512-YG5IXUUmxX3Md2buVMvxm9NWlKADrnavI36hbJsihqqvBGsWnIfguf0rUP5Srr0pfPqhQjUP+agLMsvu0GmUpA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11164,8 +10107,6 @@ }, "node_modules/@opentelemetry/instrumentation-mongoose": { "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.50.0.tgz", - "integrity": "sha512-Am8pk1Ct951r4qCiqkBcGmPIgGhoDiFcRtqPSLbJrUZqEPUsigjtMjoWDRLG1Ki1NHgOF7D0H7d+suWz1AAizw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11181,8 +10122,6 @@ }, "node_modules/@opentelemetry/instrumentation-mysql": { "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.49.0.tgz", - "integrity": "sha512-QU9IUNqNsrlfE3dJkZnFHqLjlndiU39ll/YAAEvWE40sGOCi9AtOF6rmEGzJ1IswoZ3oyePV7q2MP8SrhJfVAA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11198,8 +10137,6 @@ }, "node_modules/@opentelemetry/instrumentation-mysql2": { "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.50.0.tgz", - "integrity": "sha512-PoOMpmq73rOIE3nlTNLf3B1SyNYGsp7QXHYKmeTZZnJ2Ou7/fdURuOhWOI0e6QZ5gSem18IR1sJi6GOULBQJ9g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11215,8 +10152,6 @@ }, "node_modules/@opentelemetry/instrumentation-nestjs-core": { "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.49.0.tgz", - "integrity": "sha512-1R/JFwdmZIk3T/cPOCkVvFQeKYzbbUvDxVH3ShXamUwBlGkdEu5QJitlRMyVNZaHkKZKWgYrBarGQsqcboYgaw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11231,8 +10166,6 @@ }, "node_modules/@opentelemetry/instrumentation-net": { "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.47.0.tgz", - "integrity": "sha512-csoJ++Njpf7C09JH+0HNGenuNbDZBqO1rFhMRo6s0rAmJwNh9zY3M/urzptmKlqbKnf4eH0s+CKHy/+M8fbFsQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11247,8 +10180,6 @@ }, "node_modules/@opentelemetry/instrumentation-oracledb": { "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.29.0.tgz", - "integrity": "sha512-2aHLiJdkyiUbooIUm7FaZf+O4jyqEl+RfFpgud1dxT87QeeYM216wi+xaMNzsb5yKtRBqbA3qeHBCyenYrOZwA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11264,8 +10195,6 @@ }, "node_modules/@opentelemetry/instrumentation-pg": { "version": "0.56.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.56.1.tgz", - "integrity": "sha512-0/PiHDPVaLdcXNw6Gqb3JBdMxComMEwh444X8glwiynJKJHRTR49+l2cqJfoOVzB8Sl1XRl3Yaqw6aDi3s8e9w==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11284,8 +10213,6 @@ }, "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -11295,8 +10222,6 @@ }, "node_modules/@opentelemetry/instrumentation-pino": { "version": "0.50.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.50.1.tgz", - "integrity": "sha512-pBbvuWiHA9iAumAuQ0SKYOXK7NRlbnVTf/qBV0nMdRnxBPrc/GZTbh0f7Y59gZfYsbCLhXLL1oRTEnS+PwS3CA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "^0.203.0", @@ -11312,8 +10237,6 @@ }, "node_modules/@opentelemetry/instrumentation-redis": { "version": "0.52.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.52.0.tgz", - "integrity": "sha512-R8Y7cCZlJ2Vl31S2i7bl5SqyC/aul54ski4wCFip/Tp9WGtLK1xVATi2rwy2wkc8ZCtjdEe9eEVR+QFG6gGZxg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11329,8 +10252,6 @@ }, "node_modules/@opentelemetry/instrumentation-restify": { "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.49.0.tgz", - "integrity": "sha512-tsGZZhS4mVZH7omYxw5jpsrD3LhWizqWc0PYtAnzpFUvL5ZINHE+cm57bssTQ2AK/GtZMxu9LktwCvIIf3dSmw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11346,8 +10267,6 @@ }, "node_modules/@opentelemetry/instrumentation-router": { "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.48.0.tgz", - "integrity": "sha512-Wixrc8CchuJojXpaS/dCQjFOMc+3OEil1H21G+WLYQb8PcKt5kzW9zDBT19nyjjQOx/D/uHPfgbrT+Dc7cfJ9w==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11362,8 +10281,6 @@ }, "node_modules/@opentelemetry/instrumentation-runtime-node": { "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.17.1.tgz", - "integrity": "sha512-c1FlAk+bB2uF9a8YneGmNPTl7c/xVaan4mmWvbkWcOmH/ipKqR1LaKUlz/BMzLrJLjho1EJlG2NrS2w2Arg+nw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0" @@ -11377,8 +10294,6 @@ }, "node_modules/@opentelemetry/instrumentation-socket.io": { "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.50.0.tgz", - "integrity": "sha512-6JN6lnKN9ZuZtZdMQIR+no1qHzQvXSZUsNe3sSWMgqmNRyEXuDUWBIyKKeG0oHRHtR4xE4QhJyD4D5kKRPWZFA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11393,8 +10308,6 @@ }, "node_modules/@opentelemetry/instrumentation-tedious": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.22.0.tgz", - "integrity": "sha512-XrrNSUCyEjH1ax9t+Uo6lv0S2FCCykcF7hSxBMxKf7Xn0bPRxD3KyFUZy25aQXzbbbUHhtdxj3r2h88SfEM3aA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", @@ -11410,8 +10323,6 @@ }, "node_modules/@opentelemetry/instrumentation-undici": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.14.0.tgz", - "integrity": "sha512-2HN+7ztxAReXuxzrtA3WboAKlfP5OsPA57KQn2AdYZbJ3zeRPcLXyW4uO/jpLE6PLm0QRtmeGCmfYpqRlwgSwg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11426,8 +10337,6 @@ }, "node_modules/@opentelemetry/instrumentation-winston": { "version": "0.48.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.48.1.tgz", - "integrity": "sha512-XyOuVwdziirHHYlsw+BWrvdI/ymjwnexupKA787zQQ+D5upaE/tseZxjfQa7+t4+FdVLxHICaMTmkSD4yZHpzQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "^0.203.0", @@ -11442,8 +10351,6 @@ }, "node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.203.0.tgz", - "integrity": "sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11458,8 +10365,6 @@ }, "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11473,8 +10378,6 @@ }, "node_modules/@opentelemetry/otlp-grpc-exporter-base": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.203.0.tgz", - "integrity": "sha512-te0Ze1ueJF+N/UOFl5jElJW4U0pZXQ8QklgSfJ2linHN0JJsuaHG8IabEUi2iqxY8ZBDlSiz1Trfv5JcjWWWwQ==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", @@ -11491,8 +10394,6 @@ }, "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11506,8 +10407,6 @@ }, "node_modules/@opentelemetry/otlp-transformer": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.203.0.tgz", - "integrity": "sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.203.0", @@ -11527,8 +10426,6 @@ }, "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11542,8 +10439,6 @@ }, "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11558,8 +10453,6 @@ }, "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11574,8 +10467,6 @@ }, "node_modules/@opentelemetry/propagator-b3": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.0.1.tgz", - "integrity": "sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1" @@ -11589,8 +10480,6 @@ }, "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11604,8 +10493,6 @@ }, "node_modules/@opentelemetry/propagator-jaeger": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.0.1.tgz", - "integrity": "sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1" @@ -11619,8 +10506,6 @@ }, "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11634,8 +10519,6 @@ }, "node_modules/@opentelemetry/redis-common": { "version": "0.38.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.2.tgz", - "integrity": "sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11643,8 +10526,6 @@ }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { "version": "0.31.11", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.31.11.tgz", - "integrity": "sha512-R/asn6dAOWMfkLeEwqHCUz0cNbb9oiHVyd11iwlypeT/p9bR1lCX5juu5g/trOwxo62dbuFcDbBdKCJd3O2Edg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11659,8 +10540,6 @@ }, "node_modules/@opentelemetry/resource-detector-aws": { "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.13.0.tgz", - "integrity": "sha512-ZPCn7gZhGqUYUoD+RCHIlayoHBMaJaEjfqlgz2EPKoXJ4y7Ru7CUm+Tm3yJVMKF92cN9xUQR0j5KALyF0fg9aw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11676,8 +10555,6 @@ }, "node_modules/@opentelemetry/resource-detector-azure": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.10.0.tgz", - "integrity": "sha512-5cNAiyPBg53Uxe/CW7hsCq8HiKNAUGH+gi65TtgpzSR9bhJG4AEbuZhbJDFwe97tn2ifAD1JTkbc/OFuaaFWbA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11693,8 +10570,6 @@ }, "node_modules/@opentelemetry/resource-detector-container": { "version": "0.7.11", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.7.11.tgz", - "integrity": "sha512-XUxnGuANa/EdxagipWMXKYFC7KURwed9/V0+NtYjFmwWHzV9/J4IYVGTK8cWDpyUvAQf/vE4sMa3rnS025ivXQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11709,8 +10584,6 @@ }, "node_modules/@opentelemetry/resource-detector-gcp": { "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.37.0.tgz", - "integrity": "sha512-LGpJBECIMsVKhiulb4nxUw++m1oF4EiDDPmFGW2aqYaAF0oUvJNv8Z/55CAzcZ7SxvlTgUwzewXDBsuCup7iqw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11727,8 +10600,6 @@ }, "node_modules/@opentelemetry/resources": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.0.tgz", - "integrity": "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.0", @@ -11743,8 +10614,6 @@ }, "node_modules/@opentelemetry/sdk-logs": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.203.0.tgz", - "integrity": "sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.203.0", @@ -11760,8 +10629,6 @@ }, "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11775,8 +10642,6 @@ }, "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11791,8 +10656,6 @@ }, "node_modules/@opentelemetry/sdk-metrics": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.0.tgz", - "integrity": "sha512-CicxWZxX6z35HR83jl+PLgtFgUrKRQ9LCXyxgenMnz5A1lgYWfAog7VtdOvGkJYyQgMNPhXQwkYrDLujk7z1Iw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.0", @@ -11807,8 +10670,6 @@ }, "node_modules/@opentelemetry/sdk-node": { "version": "0.203.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.203.0.tgz", - "integrity": "sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.203.0", @@ -11843,8 +10704,6 @@ }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/context-async-hooks": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.0.1.tgz", - "integrity": "sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11855,8 +10714,6 @@ }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11870,8 +10727,6 @@ }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11886,8 +10741,6 @@ }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11902,8 +10755,6 @@ }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.0.1.tgz", - "integrity": "sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/context-async-hooks": "2.0.1", @@ -11919,8 +10770,6 @@ }, "node_modules/@opentelemetry/sdk-trace-base": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.1.tgz", - "integrity": "sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11936,8 +10785,6 @@ }, "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -11951,8 +10798,6 @@ }, "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.0.1", @@ -11967,8 +10812,6 @@ }, "node_modules/@opentelemetry/sdk-trace-node": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.6.0.tgz", - "integrity": "sha512-YhswtasmsbIGEFvLGvR9p/y3PVRTfFf+mgY8van4Ygpnv4sA3vooAjvh+qAn9PNWxs4/IwGGqiQS0PPsaRJ0vQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/context-async-hooks": "2.6.0", @@ -11984,8 +10827,6 @@ }, "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.0.tgz", - "integrity": "sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.0", @@ -12001,8 +10842,6 @@ }, "node_modules/@opentelemetry/semantic-conventions": { "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz", - "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -12010,8 +10849,6 @@ }, "node_modules/@opentelemetry/sql-common": { "version": "0.41.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz", - "integrity": "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0" @@ -12023,26 +10860,8 @@ "@opentelemetry/api": "^1.1.0" } }, - "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.94.0.tgz", - "integrity": "sha512-Ficqj6MggRGFkemU4pVFTyth3jWVL/zpIWjGMTXaPU81l46ZDcYVFWp9ia6nfE5mm8UdVSI2trvmK+BpNUim7g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@oxc-parser/binding-darwin-arm64": { "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.94.0.tgz", - "integrity": "sha512-uYyeMH9vMfb0JAdm6ZwHTgcTv53030elQKMnUbux9K5rxOCWbHUyeVACEv86V+E/Ft6RtkvWDIqUY4sYZRmcuQ==", "cpu": [ "arm64" ], @@ -12055,218 +10874,8 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.94.0.tgz", - "integrity": "sha512-Ek1fh8dw6b+/hzLo5jjPuxkshRxekjtTfhfWZ4RehMYiApT8Rj4k+7kcQ+zV1ZaF+1+yLgNqNja2RMRqx3MHzQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.94.0.tgz", - "integrity": "sha512-81bE/8F252Ew179uVo9FU67dmRc+n8QSMhj6mmMxisdI3ao5MjCI5jDL19mH3UeQ9uRUBSPFILmHBDQYNZ9oKw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.94.0.tgz", - "integrity": "sha512-aGOU8IYXVYGN2aRrvcU5+UdM7BzIVlm4m0REQzjpblQKRdZfWFtDBRJez+fK/F10g0H1AU5DQVgbW5aeko49Jw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.94.0.tgz", - "integrity": "sha512-69/ZuYSZ4dd7UWoEOyf+pXYPtvUZguDQqjhxMx8fI0J30sEEqs1d/DBLLnog/afHmaapPEIEr6rp9jF6bYcgNw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.94.0.tgz", - "integrity": "sha512-u55PGVVfZF/frpEcv/vowfuqsCd5VKz3wta8KZ3MBxboat7XxgRIMS8VQEBiJ3aYE80taACu5EfPN1y9DhiU0Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.94.0.tgz", - "integrity": "sha512-Qm2SEU7/f2b2Rg76Pj49BdMFF7Vv7+2qLPxaae4aH1515kzVv6nZW0bqCo4fPDDyiE4bryF7Jr+WKhllBxvXPw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.94.0.tgz", - "integrity": "sha512-bZO3QAt0lsZjk351mVM85obMivbXG+tDiah5XmmOaGO8k4vEYmoiKr2YHJoA2eNpKhPJF8dNyIS7U+XAvirr9g==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.94.0.tgz", - "integrity": "sha512-IdbJ/rwsaEPQx11mQwGoClqhAmVaAF9+3VmDRYVmfsYsrhX1Ue1HvBdVHDvtHzJDuumC/X/codkVId9Ss+7fVg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.94.0.tgz", - "integrity": "sha512-TbtpRdViF3aPCQBKuEo+TcucwW3KFa6bMHVakgaJu12RZrFpO4h1IWppBbuuBQ9X7SfvpgC1YgCDGve9q6fpEA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.94.0.tgz", - "integrity": "sha512-hlfoDmWvgSbexoJ9u3KwAJwpeu91FfJR6++fQjeYXD2InK4gZow9o3DRoTpN/kslZwzUNpiRURqxey/RvWh8JQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.94.0.tgz", - "integrity": "sha512-VoCtQZIsRZN8mszbdizh+5MwzbgbMxsPgT2hOzzILQLNY2o2OXG3xSiFNFakVhbWc9qSTaZ/MRDsqR+IM3fLFw==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.94.0.tgz", - "integrity": "sha512-3wsbMqV8V7WaLdiQ2oawdgKkCgMHXJ7VDuo6uIcXauU3wK6CG0QyDXRV9bPWzorGLRBUHndu/2VB1+9dgT9fvg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.94.0.tgz", - "integrity": "sha512-UTQQ1576Nzhh4jr/YmvzqnuwTPOauB/TPzsnWzT+w8InHxL5JA1fmy01wB1F2BWT9AD6YV4BTB1ozRICYdAgjw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@oxc-project/runtime": { "version": "0.115.0", - "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", - "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", "dev": true, "license": "MIT", "engines": { @@ -12275,8 +10884,6 @@ }, "node_modules/@oxc-project/types": { "version": "0.115.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", - "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", "dev": true, "license": "MIT", "funding": { @@ -12317,8 +10924,6 @@ }, "node_modules/@oxfmt/binding-darwin-arm64": { "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.43.0.tgz", - "integrity": "sha512-o3i49ZUSJWANzXMAAVY1wnqb65hn4JVzwlRQ5qfcwhRzIA8lGVaud31Q3by5ALHPrksp5QEaKCQF9aAS3TXpZA==", "cpu": [ "arm64" ], @@ -12402,6 +11007,9 @@ "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12418,6 +11026,9 @@ "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -12434,6 +11045,9 @@ "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12450,6 +11064,9 @@ "cpu": [ "riscv64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12466,6 +11083,9 @@ "cpu": [ "riscv64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -12482,6 +11102,9 @@ "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12498,6 +11121,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12514,6 +11140,9 @@ "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -12589,8 +11218,6 @@ }, "node_modules/@oxlint-tsgolint/darwin-arm64": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.17.4.tgz", - "integrity": "sha512-XEA7vl/T1+wiVnMq2MR6u5OYr2pwKHiAPgklxpK8tPrjQ1ci/amNmwI8ECn6TPXSCsC8SJsSN5xvzXm5H3dTfw==", "cpu": [ "arm64" ], @@ -12707,8 +11334,6 @@ }, "node_modules/@oxlint/binding-darwin-arm64": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.57.0.tgz", - "integrity": "sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==", "cpu": [ "arm64" ], @@ -12798,6 +11423,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12815,6 +11443,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -12832,6 +11463,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12849,6 +11483,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12866,6 +11503,9 @@ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -12883,6 +11523,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12900,6 +11543,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -12917,6 +11563,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -12996,8 +11645,6 @@ }, "node_modules/@peculiar/asn1-cms": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", - "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13009,8 +11656,6 @@ }, "node_modules/@peculiar/asn1-csr": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", - "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13021,8 +11666,6 @@ }, "node_modules/@peculiar/asn1-ecc": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", - "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13033,8 +11676,6 @@ }, "node_modules/@peculiar/asn1-pfx": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", - "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.1", @@ -13047,8 +11688,6 @@ }, "node_modules/@peculiar/asn1-pkcs8": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", - "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13059,8 +11698,6 @@ }, "node_modules/@peculiar/asn1-pkcs9": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", - "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.1", @@ -13075,8 +11712,6 @@ }, "node_modules/@peculiar/asn1-rsa": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", - "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13087,8 +11722,6 @@ }, "node_modules/@peculiar/asn1-schema": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", "license": "MIT", "dependencies": { "asn1js": "^3.0.6", @@ -13098,8 +11731,6 @@ }, "node_modules/@peculiar/asn1-x509": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", - "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13110,8 +11741,6 @@ }, "node_modules/@peculiar/asn1-x509-attr": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", - "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13122,8 +11751,6 @@ }, "node_modules/@peculiar/x509": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -13144,14 +11771,10 @@ }, "node_modules/@pinojs/redact": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, @@ -13161,8 +11784,6 @@ }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "license": "MIT", "engines": { "node": ">=12.22.0" @@ -13170,8 +11791,6 @@ }, "node_modules/@pnpm/network.ca-file": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" @@ -13182,14 +11801,10 @@ }, "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "license": "ISC" }, "node_modules/@pnpm/npm-conf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", - "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", @@ -13202,14 +11817,10 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "license": "MIT" }, "node_modules/@postgresql-typed/oids": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@postgresql-typed/oids/-/oids-0.2.0.tgz", - "integrity": "sha512-jh1nIP/nmtlZkj1t0cO2NC2lFHg/fXQhtRFsL70Rh/5ELp5fqxH/calwPVTkS8gPae1k/PTqQYbU23E+Q2q0rg==", "license": "MPL-2.0", "engines": { "node": ">=16", @@ -13218,8 +11829,6 @@ }, "node_modules/@prisma/adapter-pg": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.5.0.tgz", - "integrity": "sha512-EJx7OLULahcC3IjJgdx2qRDNCT+ToY2v66UkeETMCLhNOTgqVzRzYvOEphY7Zp0eHyzfkC33Edd/qqeadf9R4A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13231,8 +11840,6 @@ }, "node_modules/@prisma/adapter-pg/node_modules/@types/pg": { "version": "8.11.11", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.11.tgz", - "integrity": "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==", "dev": true, "license": "MIT", "dependencies": { @@ -13243,8 +11850,6 @@ }, "node_modules/@prisma/adapter-pg/node_modules/pg-types": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.1.0.tgz", - "integrity": "sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==", "dev": true, "license": "MIT", "dependencies": { @@ -13262,8 +11867,6 @@ }, "node_modules/@prisma/adapter-pg/node_modules/postgres-array": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", - "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", "dev": true, "license": "MIT", "engines": { @@ -13272,8 +11875,6 @@ }, "node_modules/@prisma/adapter-pg/node_modules/postgres-bytea": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", - "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", "dev": true, "license": "MIT", "dependencies": { @@ -13285,8 +11886,6 @@ }, "node_modules/@prisma/adapter-pg/node_modules/postgres-date": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", "dev": true, "license": "MIT", "engines": { @@ -13295,8 +11894,6 @@ }, "node_modules/@prisma/adapter-pg/node_modules/postgres-interval": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", - "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", "dev": true, "license": "MIT", "engines": { @@ -13305,8 +11902,6 @@ }, "node_modules/@prisma/client": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.5.0.tgz", - "integrity": "sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13330,15 +11925,11 @@ }, "node_modules/@prisma/client-runtime-utils": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.5.0.tgz", - "integrity": "sha512-KnJ2b4Si/pcWEtK68uM+h0h1oh80CZt2suhLTVuLaSKg4n58Q9jBF/A42Kw6Ma+aThy1yAhfDeTC0JvEmeZnFQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/config": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.5.0.tgz", - "integrity": "sha512-1J/9YEX7A889xM46PYg9e8VAuSL1IUmXJW3tEhMv7XQHDWlfC9YSkIw9sTYRaq5GswGlxZ+GnnyiNsUZ9JJhSQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13350,8 +11941,6 @@ }, "node_modules/@prisma/config/node_modules/c12": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", - "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", "dev": true, "license": "MIT", "dependencies": { @@ -13379,8 +11968,6 @@ }, "node_modules/@prisma/config/node_modules/dotenv": { "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -13392,8 +11979,6 @@ }, "node_modules/@prisma/config/node_modules/jiti": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", "bin": { @@ -13402,15 +11987,11 @@ }, "node_modules/@prisma/debug": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.5.0.tgz", - "integrity": "sha512-163+nffny0JoPEkDhfNco0vcuT3ymIJc9+WX7MHSQhfkeKUmKe9/wqvGk5SjppT93DtBjVwr5HPJYlXbzm6qtg==", "dev": true, "license": "Apache-2.0" }, "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==", "dev": true, "license": "ISC", "dependencies": { @@ -13435,15 +12016,11 @@ }, "node_modules/@prisma/dev/node_modules/std-env": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, "node_modules/@prisma/driver-adapter-utils": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.5.0.tgz", - "integrity": "sha512-B79N/amgV677mFesFDBAdrW0OIaqawap9E0sjgLBtzIz2R3hIMS1QB8mLZuUEiS4q5Y8Oh3I25Kw4SLxMypk9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13452,8 +12029,6 @@ }, "node_modules/@prisma/engines": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.5.0.tgz", - "integrity": "sha512-ondGRhzoaVpRWvFaQ5wH5zS1BIbhzbKqczKjCn6j3L0Zfe/LInjcEg8+xtB49AuZBX30qyx1ZtGoootUohz2pw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -13466,15 +12041,11 @@ }, "node_modules/@prisma/engines-version": { "version": "7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e.tgz", - "integrity": "sha512-E+iRV/vbJLl8iGjVr6g/TEWokA+gjkV/doZkaQN1i/ULVdDwGnPJDfLUIFGS3BVwlG/m6L8T4x1x5isl8hGMxA==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines/node_modules/@prisma/get-platform": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.5.0.tgz", - "integrity": "sha512-7I+2y1nu/gkEKSiHHbcZ1HPe/euGdEqJZxEEMT0246q4De1+hla0ZzlTgvaT9dHcVCgLSuCG8v39db5qUUWNgw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13483,8 +12054,6 @@ }, "node_modules/@prisma/fetch-engine": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.5.0.tgz", - "integrity": "sha512-kZCl2FV54qnyrVdnII8MI6qvt7HfU6Cbiz8dZ8PXz4f4lbSw45jEB9/gEMK2SGdiNhBKyk/Wv95uthoLhGMLYA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13495,8 +12064,6 @@ }, "node_modules/@prisma/fetch-engine/node_modules/@prisma/get-platform": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.5.0.tgz", - "integrity": "sha512-7I+2y1nu/gkEKSiHHbcZ1HPe/euGdEqJZxEEMT0246q4De1+hla0ZzlTgvaT9dHcVCgLSuCG8v39db5qUUWNgw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13505,8 +12072,6 @@ }, "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==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13515,22 +12080,16 @@ }, "node_modules/@prisma/get-platform/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==", "dev": true, "license": "Apache-2.0" }, "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==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/studio-core": { "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.21.1.tgz", - "integrity": "sha512-bOGqG/eMQtKC0XVvcVLRmhWWzm/I+0QUWqAEhEBtetpuS3k3V4IWqKGUONkAIT223DNXJMxMtZp36b1FmcdPeg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -13545,32 +12104,22 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", @@ -13579,38 +12128,26 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, "node_modules/@react-aria/focus": { "version": "3.21.5", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.5.tgz", - "integrity": "sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q==", "license": "Apache-2.0", "dependencies": { "@react-aria/interactions": "^3.27.1", @@ -13626,8 +12163,6 @@ }, "node_modules/@react-aria/interactions": { "version": "3.27.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.27.1.tgz", - "integrity": "sha512-M3wLpTTmDflI0QGNK0PJNUaBXXfeBXue8ZxLMngfc1piHNiH4G5lUvWd9W14XVbqrSCVY8i8DfGrNYpyyZu0tw==", "license": "Apache-2.0", "dependencies": { "@react-aria/ssr": "^3.9.10", @@ -13643,8 +12178,6 @@ }, "node_modules/@react-aria/ssr": { "version": "3.9.10", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", - "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -13658,8 +12191,6 @@ }, "node_modules/@react-aria/utils": { "version": "3.33.1", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.33.1.tgz", - "integrity": "sha512-kIx1Sj6bbAT0pdqCegHuPanR9zrLn5zMRiM7LN12rgRf55S19ptd9g3ncahArifYTRkfEU9VIn+q0HjfMqS9/w==", "license": "Apache-2.0", "dependencies": { "@react-aria/ssr": "^3.9.10", @@ -13676,8 +12207,6 @@ }, "node_modules/@react-stately/flags": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz", - "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -13685,8 +12214,6 @@ }, "node_modules/@react-stately/utils": { "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -13697,8 +12224,6 @@ }, "node_modules/@react-types/shared": { "version": "3.33.1", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.33.1.tgz", - "integrity": "sha512-oJHtjvLG43VjwemQDadlR5g/8VepK56B/xKO2XORPHt9zlW6IZs3tZrYlvH29BMvoqC7RtE7E5UjgbnbFtDGag==", "license": "Apache-2.0", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" @@ -13706,8 +12231,6 @@ }, "node_modules/@rocicorp/lock": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@rocicorp/lock/-/lock-1.0.4.tgz", - "integrity": "sha512-FavTiO8ETXFXDVfA87IThGduTTTR8iqzBnr/c60gUUmbk7knGEXPmf2B+yiNuluJD0ku0fL2V2r62UXnsLXl6w==", "license": "Apache-2.0", "dependencies": { "@rocicorp/resolver": "^1.0.2" @@ -13718,14 +12241,10 @@ }, "node_modules/@rocicorp/logger": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rocicorp/logger/-/logger-5.4.0.tgz", - "integrity": "sha512-kmMR5iLrwRIsvPZ+UXnmyAM3Mlvz6rCHrYfMsrMPgFYKLfo7amUH1RwHo6tuuqJiAvUbeaCoDtc8e+V0Mr4PSA==", "license": "Apache-2.0" }, "node_modules/@rocicorp/resolver": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rocicorp/resolver/-/resolver-1.0.2.tgz", - "integrity": "sha512-TfjMTQp9cNNqNtHFfa+XHEGdA7NnmDRu+ZJH4YF3dso0Xk/b9DMhg/sl+b6CR4ThFZArXXDsG1j8Mwl34wcOZQ==", "license": "Apache-2.0", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -13741,8 +12260,6 @@ }, "node_modules/@rocicorp/zero-sqlite3": { "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@rocicorp/zero-sqlite3/-/zero-sqlite3-1.0.15.tgz", - "integrity": "sha512-o4ezzTgNQvOM23X/mBRN4LAo0i7XkIDAL3Obg7FaJLFTuwJyYwqE45aqk9vg8/0mlBw2U+DEUGLP1q/Pf+VgYQ==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -13759,8 +12276,6 @@ }, "node_modules/@rocicorp/zero-virtual": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@rocicorp/zero-virtual/-/zero-virtual-0.1.4.tgz", - "integrity": "sha512-RrGhLyOostGP7IMj1sfiZ9S1MwycHmv4YPm26RMBSCAlcku23thFNeE7t0q3zwEK9ykdQ1LbZ0rZAveg4dFpiw==", "license": "Apache-2.0", "peerDependencies": { "@rocicorp/zero": ">=0.25", @@ -13789,8 +12304,6 @@ }, "node_modules/@rolldown/binding-darwin-arm64": { "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", "cpu": [ "arm64" ], @@ -13863,6 +12376,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13880,6 +12396,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13897,6 +12416,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13914,6 +12436,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13931,6 +12456,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13948,6 +12476,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -14027,15 +12558,11 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.7", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", - "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", "dev": true, "license": "MIT" }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -14057,15 +12584,11 @@ }, "node_modules/@rollup/pluginutils/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==", "dev": true, "license": "MIT" }, "node_modules/@rushstack/node-core-library": { "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.18.0.tgz", - "integrity": "sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==", "dev": true, "license": "MIT", "dependencies": { @@ -14089,8 +12612,6 @@ }, "node_modules/@rushstack/node-core-library/node_modules/ajv": { "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "license": "MIT", "dependencies": { @@ -14106,8 +12627,6 @@ }, "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "license": "ISC", "dependencies": { @@ -14119,8 +12638,6 @@ }, "node_modules/@rushstack/node-core-library/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "license": "ISC", "dependencies": { @@ -14135,15 +12652,11 @@ }, "node_modules/@rushstack/node-core-library/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/@rushstack/problem-matcher": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", - "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -14157,8 +12670,6 @@ }, "node_modules/@rushstack/rig-package": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", - "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", "dev": true, "license": "MIT", "dependencies": { @@ -14168,8 +12679,6 @@ }, "node_modules/@rushstack/terminal": { "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.3.tgz", - "integrity": "sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==", "dev": true, "license": "MIT", "dependencies": { @@ -14188,8 +12697,6 @@ }, "node_modules/@rushstack/ts-command-line": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.3.tgz", - "integrity": "sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==", "dev": true, "license": "MIT", "dependencies": { @@ -14201,16 +12708,12 @@ }, "node_modules/@schickling/fps-meter": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@schickling/fps-meter/-/fps-meter-0.1.2.tgz", - "integrity": "sha512-aNZbZTBj7EuHYrSg8Yainb0wlF35Oi53pacj/UIY5IV9TBp/KA0Od7uYtqwWYVifSQ6BMBhck8LI3xIsAkR53Q==", "peerDependencies": { "react": "*" } }, "node_modules/@shikijs/engine-oniguruma": { "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", - "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dev": true, "license": "MIT", "dependencies": { @@ -14220,8 +12723,6 @@ }, "node_modules/@shikijs/langs": { "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", - "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", "dev": true, "license": "MIT", "dependencies": { @@ -14230,8 +12731,6 @@ }, "node_modules/@shikijs/themes": { "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", - "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dev": true, "license": "MIT", "dependencies": { @@ -14240,8 +12739,6 @@ }, "node_modules/@shikijs/types": { "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", - "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14251,15 +12748,11 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, "node_modules/@sideway/address": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" @@ -14267,26 +12760,18 @@ }, "node_modules/@sideway/formula": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "license": "BSD-3-Clause" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "license": "BSD-3-Clause" }, "node_modules/@sinclair/typebox": { "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "license": "MIT" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "license": "MIT", "engines": { "node": ">=10" @@ -14297,8 +12782,6 @@ }, "node_modules/@slorber/remark-comment": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", @@ -14308,8 +12791,6 @@ }, "node_modules/@smithy/abort-controller": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", - "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14321,8 +12802,6 @@ }, "node_modules/@smithy/chunked-blob-reader": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", - "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14333,8 +12812,6 @@ }, "node_modules/@smithy/chunked-blob-reader-native": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", - "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", "license": "Apache-2.0", "dependencies": { "@smithy/util-base64": "^4.3.2", @@ -14346,8 +12823,6 @@ }, "node_modules/@smithy/config-resolver": { "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", - "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.12", @@ -14363,8 +12838,6 @@ }, "node_modules/@smithy/core": { "version": "3.23.12", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.12.tgz", - "integrity": "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^5.3.12", @@ -14384,8 +12857,6 @@ }, "node_modules/@smithy/credential-provider-imds": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", - "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.12", @@ -14400,8 +12871,6 @@ }, "node_modules/@smithy/eventstream-codec": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz", - "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", @@ -14415,8 +12884,6 @@ }, "node_modules/@smithy/eventstream-serde-browser": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz", - "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==", "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.12", @@ -14429,8 +12896,6 @@ }, "node_modules/@smithy/eventstream-serde-config-resolver": { "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz", - "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14442,8 +12907,6 @@ }, "node_modules/@smithy/eventstream-serde-node": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz", - "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==", "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.12", @@ -14456,8 +12919,6 @@ }, "node_modules/@smithy/eventstream-serde-universal": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz", - "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==", "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-codec": "^4.2.12", @@ -14470,8 +12931,6 @@ }, "node_modules/@smithy/fetch-http-handler": { "version": "5.3.15", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", - "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^5.3.12", @@ -14486,8 +12945,6 @@ }, "node_modules/@smithy/hash-blob-browser": { "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.13.tgz", - "integrity": "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.2.2", @@ -14501,8 +12958,6 @@ }, "node_modules/@smithy/hash-node": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", - "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14516,8 +12971,6 @@ }, "node_modules/@smithy/hash-stream-node": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.12.tgz", - "integrity": "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14530,8 +12983,6 @@ }, "node_modules/@smithy/invalid-dependency": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", - "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14543,8 +12994,6 @@ }, "node_modules/@smithy/is-array-buffer": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", - "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14555,8 +13004,6 @@ }, "node_modules/@smithy/md5-js": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.12.tgz", - "integrity": "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14569,8 +13016,6 @@ }, "node_modules/@smithy/middleware-content-length": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", - "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^5.3.12", @@ -14583,8 +13028,6 @@ }, "node_modules/@smithy/middleware-endpoint": { "version": "4.4.26", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.26.tgz", - "integrity": "sha512-8Qfikvd2GVKSm8S6IbjfwFlRY9VlMrj0Dp4vTwAuhqbX7NhJKE5DQc2bnfJIcY0B+2YKMDBWfvexbSZeejDgeg==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.23.12", @@ -14602,8 +13045,6 @@ }, "node_modules/@smithy/middleware-retry": { "version": "4.4.43", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.43.tgz", - "integrity": "sha512-ZwsifBdyuNHrFGmbc7bAfP2b54+kt9J2rhFd18ilQGAB+GDiP4SrawqyExbB7v455QVR7Psyhb2kjULvBPIhvA==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.12", @@ -14622,8 +13063,6 @@ }, "node_modules/@smithy/middleware-serde": { "version": "4.2.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.15.tgz", - "integrity": "sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.23.12", @@ -14637,8 +13076,6 @@ }, "node_modules/@smithy/middleware-stack": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", - "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14650,8 +13087,6 @@ }, "node_modules/@smithy/node-config-provider": { "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", - "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.2.12", @@ -14665,8 +13100,6 @@ }, "node_modules/@smithy/node-http-handler": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.0.tgz", - "integrity": "sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.2.12", @@ -14681,8 +13114,6 @@ }, "node_modules/@smithy/property-provider": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", - "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14694,8 +13125,6 @@ }, "node_modules/@smithy/protocol-http": { "version": "5.3.12", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", - "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14707,8 +13136,6 @@ }, "node_modules/@smithy/querystring-builder": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", - "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14721,8 +13148,6 @@ }, "node_modules/@smithy/querystring-parser": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", - "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14734,8 +13159,6 @@ }, "node_modules/@smithy/service-error-classification": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", - "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1" @@ -14746,8 +13169,6 @@ }, "node_modules/@smithy/shared-ini-file-loader": { "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", - "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14759,8 +13180,6 @@ }, "node_modules/@smithy/signature-v4": { "version": "5.3.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", - "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.2", @@ -14778,8 +13197,6 @@ }, "node_modules/@smithy/smithy-client": { "version": "4.12.6", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.6.tgz", - "integrity": "sha512-aib3f0jiMsJ6+cvDnXipBsGDL7ztknYSVqJs1FdN9P+u9tr/VzOR7iygSh6EUOdaBeMCMSh3N0VdyYsG4o91DQ==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.23.12", @@ -14796,8 +13213,6 @@ }, "node_modules/@smithy/types": { "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", - "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14808,8 +13223,6 @@ }, "node_modules/@smithy/url-parser": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", - "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", "license": "Apache-2.0", "dependencies": { "@smithy/querystring-parser": "^4.2.12", @@ -14822,8 +13235,6 @@ }, "node_modules/@smithy/util-base64": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", - "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^4.2.2", @@ -14836,8 +13247,6 @@ }, "node_modules/@smithy/util-body-length-browser": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", - "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14848,8 +13257,6 @@ }, "node_modules/@smithy/util-body-length-node": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", - "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14860,8 +13267,6 @@ }, "node_modules/@smithy/util-buffer-from": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", - "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.2", @@ -14873,8 +13278,6 @@ }, "node_modules/@smithy/util-config-provider": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", - "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14885,8 +13288,6 @@ }, "node_modules/@smithy/util-defaults-mode-browser": { "version": "4.3.42", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.42.tgz", - "integrity": "sha512-0vjwmcvkWAUtikXnWIUOyV6IFHTEeQUYh3JUZcDgcszF+hD/StAsQ3rCZNZEPHgI9kVNcbnyc8P2CBHnwgmcwg==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.2.12", @@ -14900,8 +13301,6 @@ }, "node_modules/@smithy/util-defaults-mode-node": { "version": "4.2.45", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.45.tgz", - "integrity": "sha512-q5dOqqfTgUcLe38TAGiFn9srToKj2YCHJ34QGOLzM+xYLLA+qRZv7N+33kl1MERVusue36ZHnlNaNEvY/PzSrw==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.4.11", @@ -14918,8 +13317,6 @@ }, "node_modules/@smithy/util-endpoints": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", - "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.12", @@ -14932,8 +13329,6 @@ }, "node_modules/@smithy/util-hex-encoding": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", - "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -14944,8 +13339,6 @@ }, "node_modules/@smithy/util-middleware": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", - "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", @@ -14957,8 +13350,6 @@ }, "node_modules/@smithy/util-retry": { "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", - "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", "license": "Apache-2.0", "dependencies": { "@smithy/service-error-classification": "^4.2.12", @@ -14971,8 +13362,6 @@ }, "node_modules/@smithy/util-stream": { "version": "4.5.20", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.20.tgz", - "integrity": "sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==", "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^5.3.15", @@ -14990,8 +13379,6 @@ }, "node_modules/@smithy/util-uri-escape": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", - "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15002,8 +13389,6 @@ }, "node_modules/@smithy/util-utf8": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", - "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^4.2.2", @@ -15015,8 +13400,6 @@ }, "node_modules/@smithy/util-waiter": { "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.13.tgz", - "integrity": "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.2.12", @@ -15029,8 +13412,6 @@ }, "node_modules/@smithy/uuid": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", - "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15041,8 +13422,6 @@ }, "node_modules/@solidjs/testing-library": { "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@solidjs/testing-library/-/testing-library-0.8.10.tgz", - "integrity": "sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15063,14 +13442,10 @@ }, "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/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "license": "MIT", "engines": { "node": ">=14" @@ -15085,8 +13460,6 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "license": "MIT", "engines": { "node": ">=14" @@ -15101,8 +13474,6 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "license": "MIT", "engines": { "node": ">=14" @@ -15117,8 +13488,6 @@ }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "license": "MIT", "engines": { "node": ">=14" @@ -15133,8 +13502,6 @@ }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "license": "MIT", "engines": { "node": ">=14" @@ -15149,8 +13516,6 @@ }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "license": "MIT", "engines": { "node": ">=14" @@ -15165,8 +13530,6 @@ }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "license": "MIT", "engines": { "node": ">=14" @@ -15181,8 +13544,6 @@ }, "node_modules/@svgr/babel-plugin-transform-svg-component": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "license": "MIT", "engines": { "node": ">=12" @@ -15197,8 +13558,6 @@ }, "node_modules/@svgr/babel-preset": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", @@ -15223,8 +13582,6 @@ }, "node_modules/@svgr/core": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -15243,8 +13600,6 @@ }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "license": "MIT", "dependencies": { "@babel/types": "^7.21.3", @@ -15260,8 +13615,6 @@ }, "node_modules/@svgr/plugin-jsx": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -15282,8 +13635,6 @@ }, "node_modules/@svgr/plugin-svgo": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "license": "MIT", "dependencies": { "cosmiconfig": "^8.1.3", @@ -15303,8 +13654,6 @@ }, "node_modules/@svgr/webpack": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -15326,8 +13675,6 @@ }, "node_modules/@swc/helpers": { "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", - "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -15335,8 +13682,6 @@ }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" @@ -15347,8 +13692,6 @@ }, "node_modules/@tailwindcss/forms": { "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", - "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", "dev": true, "license": "MIT", "dependencies": { @@ -15360,8 +13703,6 @@ }, "node_modules/@tanstack/react-virtual": { "version": "3.13.23", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", - "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", "license": "MIT", "dependencies": { "@tanstack/virtual-core": "3.13.23" @@ -15377,8 +13718,6 @@ }, "node_modules/@tanstack/virtual-core": { "version": "3.13.23", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", - "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", "license": "MIT", "funding": { "type": "github", @@ -15387,8 +13726,6 @@ }, "node_modules/@tantaman/api-extractor": { "version": "7.55.0", - "resolved": "https://registry.npmjs.org/@tantaman/api-extractor/-/api-extractor-7.55.0.tgz", - "integrity": "sha512-62EM3QnYmCmyWPSXoYyfT2F14CDW4dl32i5Ckb8W9/yd1XTQzslbKcm/oJv2sXXaEv8YFovy12HnNXe8kC9AuA==", "dev": true, "license": "MIT", "dependencies": { @@ -15413,8 +13750,6 @@ }, "node_modules/@tantaman/api-extractor/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "license": "ISC", "dependencies": { @@ -15426,8 +13761,6 @@ }, "node_modules/@tantaman/api-extractor/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "license": "ISC", "dependencies": { @@ -15442,8 +13775,6 @@ }, "node_modules/@tantaman/api-extractor/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -15452,8 +13783,6 @@ }, "node_modules/@tantaman/api-extractor/node_modules/typescript": { "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -15466,15 +13795,11 @@ }, "node_modules/@tantaman/api-extractor/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/@testcontainers/postgresql": { "version": "10.28.0", - "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-10.28.0.tgz", - "integrity": "sha512-NN25rruG5D4Q7pCNIJuHwB+G85OSeJ3xHZ2fWx0O6sPoPEfCYwvpj8mq99cyn68nxFkFYZeyrZJtSFO+FnydiA==", "dev": true, "license": "MIT", "dependencies": { @@ -15483,8 +13808,6 @@ }, "node_modules/@testing-library/dom": { "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", "dependencies": { @@ -15503,8 +13826,6 @@ }, "node_modules/@testing-library/react": { "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", "dev": true, "license": "MIT", "dependencies": { @@ -15531,15 +13852,11 @@ }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true, "license": "MIT" }, "node_modules/@ts-morph/common": { "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", - "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", "license": "MIT", "dependencies": { "fast-glob": "^3.2.7", @@ -15550,14 +13867,10 @@ }, "node_modules/@ts-morph/common/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/@ts-morph/common/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -15566,8 +13879,6 @@ }, "node_modules/@ts-morph/common/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -15578,32 +13889,22 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "license": "MIT" }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "license": "MIT", "optional": true, "dependencies": { @@ -15612,28 +13913,20 @@ }, "node_modules/@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true, "license": "MIT" }, "node_modules/@types/aria-query": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, "license": "MIT" }, "node_modules/@types/aws-lambda": { "version": "8.10.152", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.152.tgz", - "integrity": "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==", "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -15646,8 +13939,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -15656,8 +13947,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -15667,8 +13956,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -15677,8 +13964,6 @@ }, "node_modules/@types/basic-auth": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@types/basic-auth/-/basic-auth-1.1.8.tgz", - "integrity": "sha512-dKcUeixGuZn8pBjcUrf1N7x5K6lWuKuwHHitM2IZ4vwZUDWEhhNtwCWiba8jTA9zn0GQQ+fTFkWpKx8pOU/enw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -15686,8 +13971,6 @@ }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -15696,8 +13979,6 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -15705,8 +13986,6 @@ }, "node_modules/@types/bunyan": { "version": "1.8.11", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", - "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -15714,8 +13993,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -15725,20 +14002,14 @@ }, "node_modules/@types/command-line-args": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", - "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", "license": "MIT" }, "node_modules/@types/command-line-usage": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", - "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", "license": "MIT" }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -15746,8 +14017,6 @@ }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", @@ -15756,8 +14025,6 @@ }, "node_modules/@types/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -15766,14 +14033,10 @@ }, "node_modules/@types/d3-color": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -15781,8 +14044,6 @@ }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { "@types/d3-color": "*" @@ -15790,14 +14051,10 @@ }, "node_modules/@types/d3-selection": { "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", "license": "MIT" }, "node_modules/@types/d3-transition": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -15805,8 +14062,6 @@ }, "node_modules/@types/d3-zoom": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", @@ -15815,8 +14070,6 @@ }, "node_modules/@types/debug": { "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", "dependencies": { "@types/ms": "*" @@ -15824,15 +14077,11 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/@types/docker-modem": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", - "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15842,8 +14091,6 @@ }, "node_modules/@types/dockerode": { "version": "3.3.47", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.47.tgz", - "integrity": "sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==", "dev": true, "license": "MIT", "dependencies": { @@ -15854,8 +14101,6 @@ }, "node_modules/@types/eslint": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", "dependencies": { "@types/estree": "*", @@ -15864,8 +14109,6 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -15874,14 +14117,10 @@ }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "license": "MIT", "dependencies": { "@types/estree": "*" @@ -15889,8 +14128,6 @@ }, "node_modules/@types/express": { "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -15901,8 +14138,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -15913,14 +14148,10 @@ }, "node_modules/@types/gtag.js": { "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -15928,32 +14159,22 @@ }, "node_modules/@types/history": { "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", "license": "MIT" }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "license": "MIT" }, "node_modules/@types/http-cache-semantics": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -15961,14 +14182,10 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -15976,8 +14193,6 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" @@ -15985,28 +14200,20 @@ }, "node_modules/@types/js-cookie": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", - "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", "dev": true, "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==", "license": "MIT" }, "node_modules/@types/k6": { "version": "0.53.2", - "resolved": "https://registry.npmjs.org/@types/k6/-/k6-0.53.2.tgz", - "integrity": "sha512-TxFJbeSfD/RfQe+GeMbpdwiOOySRTj3vfHvcA4yoLQ3wvGPjyppCqmyKXgktf3535T+YAc41bB7GkhuCPRmfUg==", "dev": true, "license": "MIT" }, "node_modules/@types/mdast": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -16014,14 +14221,10 @@ }, "node_modules/@types/mdx": { "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", "license": "MIT" }, "node_modules/@types/memcached": { "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", - "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -16029,20 +14232,14 @@ }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, "node_modules/@types/mysql": { "version": "2.15.27", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", - "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -16050,8 +14247,6 @@ }, "node_modules/@types/node": { "version": "22.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", - "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -16059,8 +14254,6 @@ }, "node_modules/@types/oracledb": { "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-6.5.2.tgz", - "integrity": "sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -16068,8 +14261,6 @@ }, "node_modules/@types/pg": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.18.0.tgz", - "integrity": "sha512-gT+oueVQkqnj6ajGJXblFR4iavIXWsGAFCk3dP4Kki5+a9R4NMt0JARdk6s8cUKcfUoqP5dAtDSLU8xYUTFV+Q==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -16079,15 +14270,11 @@ }, "node_modules/@types/pg-format": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/pg-format/-/pg-format-1.0.5.tgz", - "integrity": "sha512-i+oEEJEC+1I3XAhgqtVp45Faj8MBbV0Aoq4rHsHD7avgLjyDkaWKObd514g0Q/DOUkdxU0P4CQ0iq2KR4SoJcw==", "dev": true, "license": "MIT" }, "node_modules/@types/pg-pool": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", - "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", "license": "MIT", "dependencies": { "@types/pg": "*" @@ -16095,39 +14282,27 @@ }, "node_modules/@types/pidusage": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/pidusage/-/pidusage-2.0.5.tgz", - "integrity": "sha512-MIiyZI4/MK9UGUXWt0jJcCZhVw7YdhBuTOuqP/BjuLDLZ2PmmViMIQgZiWxtaMicQfAz/kMrZ5T7PKxFSkTeUA==", "dev": true, "license": "MIT" }, "node_modules/@types/prismjs": { "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", - "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, "node_modules/@types/qs": { "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -16136,8 +14311,6 @@ }, "node_modules/@types/react-dom": { "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", "dev": true, "license": "MIT", "peerDependencies": { @@ -16146,8 +14319,6 @@ }, "node_modules/@types/react-router": { "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -16156,8 +14327,6 @@ }, "node_modules/@types/react-router-config": { "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -16167,8 +14336,6 @@ }, "node_modules/@types/react-router-dom": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -16178,14 +14345,10 @@ }, "node_modules/@types/retry": { "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "license": "MIT" }, "node_modules/@types/sax": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -16193,15 +14356,11 @@ }, "node_modules/@types/semver": { "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -16209,8 +14368,6 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "license": "MIT", "dependencies": { "@types/express": "*" @@ -16218,8 +14375,6 @@ }, "node_modules/@types/serve-static": { "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -16229,8 +14384,6 @@ }, "node_modules/@types/serve-static/node_modules/@types/send": { "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -16239,8 +14392,6 @@ }, "node_modules/@types/sockjs": { "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -16248,8 +14399,6 @@ }, "node_modules/@types/ssh2": { "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", - "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16258,8 +14407,6 @@ }, "node_modules/@types/ssh2-streams": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.13.tgz", - "integrity": "sha512-faHyY3brO9oLEA0QlcO8N2wT7R0+1sHWZvQ+y3rMLwdY1ZyS1z0W3t65j9PqT4HmQ6ALzNe7RZlNuCNE0wBSWA==", "dev": true, "license": "MIT", "dependencies": { @@ -16268,8 +14415,6 @@ }, "node_modules/@types/ssh2/node_modules/@types/node": { "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, "license": "MIT", "dependencies": { @@ -16278,22 +14423,16 @@ }, "node_modules/@types/ssh2/node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, "license": "MIT" }, "node_modules/@types/strip-ansi": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-ansi/-/strip-ansi-3.0.0.tgz", - "integrity": "sha512-wVhzc+WJ/JNdV25MeaK0skxGdbdOFeqYv1sqY8yPXbsshZ0XwSbWWwfKzj836cPW+e+PpqUNvKoiac9ZqCdyRQ==", "dev": true, "license": "MIT" }, "node_modules/@types/tedious": { "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", - "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -16301,21 +14440,15 @@ }, "node_modules/@types/tmp": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", - "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", "dev": true, "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, "node_modules/@types/ws": { "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -16323,8 +14456,6 @@ }, "node_modules/@types/yargs": { "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -16332,32 +14463,22 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, "node_modules/@vercel/build-utils": { "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-8.7.0.tgz", - "integrity": "sha512-ofZX+ABiW76u5khIyYyH5xK5KSuiAteqRu5hz2k1a2WHLwF7VpeBg8gdFR+HwbVnNkHtkMA64ya5Dd/lNoABkw==", "license": "Apache-2.0" }, "node_modules/@vercel/error-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.3.tgz", - "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", "license": "Apache-2.0" }, "node_modules/@vercel/nft": { "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.3.tgz", - "integrity": "sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA==", "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.5", @@ -16382,8 +14503,6 @@ }, "node_modules/@vercel/nft/node_modules/@rollup/pluginutils": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "license": "MIT", "dependencies": { "estree-walker": "^2.0.1", @@ -16395,14 +14514,10 @@ }, "node_modules/@vercel/nft/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/@vercel/nft/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -16411,15 +14526,10 @@ }, "node_modules/@vercel/nft/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==", "license": "MIT" }, "node_modules/@vercel/nft/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -16438,8 +14548,6 @@ }, "node_modules/@vercel/nft/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -16450,8 +14558,6 @@ }, "node_modules/@vercel/nft/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -16462,8 +14568,6 @@ }, "node_modules/@vercel/nft/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", "engines": { "node": ">=8" @@ -16471,8 +14575,6 @@ }, "node_modules/@vercel/node": { "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vercel/node/-/node-3.2.29.tgz", - "integrity": "sha512-WRVYidBqtRyYUw36v/WyUB2v97PsiV2+LepUiOPWcW9UpszQGGT2DAzsXOYqWveXMJKFhx0aETR6Nn6i+Yps1Q==", "license": "Apache-2.0", "dependencies": { "@edge-runtime/node-utils": "2.3.0", @@ -16499,26 +14601,18 @@ }, "node_modules/@vercel/node/node_modules/@types/node": { "version": "16.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", - "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", "license": "MIT" }, "node_modules/@vercel/node/node_modules/cjs-module-lexer": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "license": "MIT" }, "node_modules/@vercel/node/node_modules/es-module-lexer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "license": "MIT" }, "node_modules/@vercel/node/node_modules/esbuild": { "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", - "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -16552,8 +14646,6 @@ }, "node_modules/@vercel/node/node_modules/node-fetch": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -16572,14 +14664,10 @@ }, "node_modules/@vercel/node/node_modules/path-to-regexp": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", "license": "MIT" }, "node_modules/@vercel/node/node_modules/typescript": { "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -16591,8 +14679,6 @@ }, "node_modules/@vercel/static-config": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.0.0.tgz", - "integrity": "sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==", "license": "Apache-2.0", "dependencies": { "ajv": "8.6.3", @@ -16602,8 +14688,6 @@ }, "node_modules/@vercel/static-config/node_modules/ajv": { "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -16618,8 +14702,6 @@ }, "node_modules/@vitejs/plugin-react": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", - "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16644,8 +14726,6 @@ }, "node_modules/@vitest/browser": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.2.tgz", - "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16667,8 +14747,6 @@ }, "node_modules/@vitest/browser-playwright": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.2.tgz", - "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", "dev": true, "license": "MIT", "dependencies": { @@ -16691,8 +14769,6 @@ }, "node_modules/@vitest/coverage-v8": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.2.tgz", - "integrity": "sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==", "dev": true, "license": "MIT", "dependencies": { @@ -16722,8 +14798,6 @@ }, "node_modules/@vitest/expect": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", - "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16740,8 +14814,6 @@ }, "node_modules/@vitest/mocker": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", - "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -16767,8 +14839,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", - "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", "dev": true, "license": "MIT", "dependencies": { @@ -16780,8 +14850,6 @@ }, "node_modules/@vitest/runner": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", - "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16794,8 +14862,6 @@ }, "node_modules/@vitest/snapshot": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", - "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", "dev": true, "license": "MIT", "dependencies": { @@ -16810,8 +14876,6 @@ }, "node_modules/@vitest/spy": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", - "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", "dev": true, "license": "MIT", "funding": { @@ -16820,8 +14884,6 @@ }, "node_modules/@vitest/utils": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", - "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16835,8 +14897,6 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", @@ -16845,26 +14905,18 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", @@ -16874,14 +14926,10 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -16892,8 +14940,6 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -16901,8 +14947,6 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -16910,14 +14954,10 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -16932,8 +14972,6 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -16945,8 +14983,6 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -16957,8 +14993,6 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -16971,8 +15005,6 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -16981,20 +15013,14 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "license": "Apache-2.0" }, "node_modules/@xyflow/react": { "version": "12.10.1", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.1.tgz", - "integrity": "sha512-5eSWtIK/+rkldOuFbOOz44CRgQRjtS9v5nufk77DV+XBnfCGL9HAQ8PG00o2ZYKqkEU/Ak6wrKC95Tu+2zuK3Q==", "license": "MIT", "dependencies": { "@xyflow/system": "0.0.75", @@ -17008,8 +15034,6 @@ }, "node_modules/@xyflow/system": { "version": "0.0.75", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.75.tgz", - "integrity": "sha512-iXs+AGFLi8w/VlAoc/iSxk+CxfT6o64Uw/k0CKASOPqjqz6E0rb5jFZgJtXGZCpfQI6OQpu5EnumP5fGxQheaQ==", "license": "MIT", "dependencies": { "@types/d3-drag": "^3.0.7", @@ -17025,14 +15049,10 @@ }, "node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "license": "ISC" }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, "license": "MIT", "dependencies": { @@ -17044,14 +15064,10 @@ }, "node_modules/abstract-logging": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", "license": "MIT" }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -17063,8 +15079,6 @@ }, "node_modules/accepts/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -17072,8 +15086,6 @@ }, "node_modules/accepts/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -17084,8 +15096,6 @@ }, "node_modules/accepts/node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -17093,8 +15103,6 @@ }, "node_modules/acorn": { "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -17105,8 +15113,6 @@ }, "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==", "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -17114,8 +15120,6 @@ }, "node_modules/acorn-import-phases": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -17126,8 +15130,6 @@ }, "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==", "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -17135,8 +15137,6 @@ }, "node_modules/acorn-walk": { "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -17147,8 +15147,6 @@ }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -17156,8 +15154,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 14" @@ -17165,8 +15161,6 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -17178,8 +15172,6 @@ }, "node_modules/ajv": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -17194,8 +15186,6 @@ }, "node_modules/ajv-draft-04": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -17209,8 +15199,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -17226,8 +15214,6 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" @@ -17238,8 +15224,6 @@ }, "node_modules/algoliasearch": { "version": "5.49.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", - "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", "license": "MIT", "dependencies": { "@algolia/abtesting": "1.15.2", @@ -17263,8 +15247,6 @@ }, "node_modules/algoliasearch-helper": { "version": "3.28.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.0.tgz", - "integrity": "sha512-GBN0xsxGggaCPElZq24QzMdfphrjIiV2xA+hRXE4/UMpN3nsF2WrM8q+x80OGvGpJWtB7F+4Hq5eSfWwuejXrg==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -17279,8 +15261,6 @@ }, "node_modules/ansi-align": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "license": "ISC", "dependencies": { "string-width": "^4.1.0" @@ -17288,14 +15268,10 @@ }, "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/ansi-align/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -17308,8 +15284,6 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -17323,8 +15297,6 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -17335,8 +15307,6 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "engines": [ "node >= 0.8.0" ], @@ -17347,8 +15317,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -17356,8 +15324,6 @@ }, "node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -17369,15 +15335,11 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -17389,8 +15351,6 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -17401,14 +15361,10 @@ }, "node_modules/aproba": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", "license": "ISC" }, "node_modules/archiver": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17426,8 +15382,6 @@ }, "node_modules/archiver-utils": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, "license": "MIT", "dependencies": { @@ -17445,15 +15399,11 @@ }, "node_modules/archiver-utils/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/archiver-utils/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17462,8 +15412,6 @@ }, "node_modules/archiver-utils/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -17487,9 +15435,6 @@ }, "node_modules/archiver-utils/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -17509,15 +15454,11 @@ }, "node_modules/archiver-utils/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/archiver-utils/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { @@ -17532,8 +15473,6 @@ }, "node_modules/archiver-utils/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -17549,8 +15488,6 @@ }, "node_modules/archiver-utils/node_modules/readable-stream": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "license": "MIT", "dependencies": { @@ -17566,8 +15503,6 @@ }, "node_modules/archiver/node_modules/b4a": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -17581,8 +15516,6 @@ }, "node_modules/archiver/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -17606,8 +15539,6 @@ }, "node_modules/archiver/node_modules/readable-stream": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "license": "MIT", "dependencies": { @@ -17623,8 +15554,6 @@ }, "node_modules/archiver/node_modules/tar-stream": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", - "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17636,9 +15565,6 @@ }, "node_modules/are-we-there-yet": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { "delegates": "^1.0.0", @@ -17650,14 +15576,10 @@ }, "node_modules/arg": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -17665,8 +15587,6 @@ }, "node_modules/aria-query": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -17675,8 +15595,6 @@ }, "node_modules/array-back": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "license": "MIT", "engines": { "node": ">=12.17" @@ -17684,14 +15602,10 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "license": "MIT", "engines": { "node": ">=8" @@ -17699,8 +15613,6 @@ }, "node_modules/asn1": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17709,8 +15621,6 @@ }, "node_modules/asn1js": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.6", @@ -17723,8 +15633,6 @@ }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -17737,8 +15645,6 @@ }, "node_modules/ast-types": { "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "license": "MIT", "dependencies": { @@ -17750,8 +15656,6 @@ }, "node_modules/ast-v8-to-istanbul": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", - "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -17762,15 +15666,11 @@ }, "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/astring": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "license": "MIT", "bin": { "astring": "bin/astring" @@ -17778,15 +15678,11 @@ }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, "node_modules/async-listen": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz", - "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==", "license": "MIT", "engines": { "node": ">= 14" @@ -17794,15 +15690,11 @@ }, "node_modules/async-lock": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", "dev": true, "license": "MIT" }, "node_modules/async-mutex": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", - "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", "dev": true, "license": "MIT", "dependencies": { @@ -17811,14 +15703,10 @@ }, "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==", "license": "MIT" }, "node_modules/atomic-sleep": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -17826,8 +15714,6 @@ }, "node_modules/attr-accept": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", - "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", "license": "MIT", "engines": { "node": ">=4" @@ -17835,8 +15721,6 @@ }, "node_modules/autoprefixer": { "version": "10.4.27", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", - "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "funding": [ { "type": "opencollective", @@ -17871,8 +15755,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -17886,8 +15768,6 @@ }, "node_modules/avvio": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", - "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", "funding": [ { "type": "github", @@ -17906,15 +15786,11 @@ }, "node_modules/await-lock": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", - "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", "dev": true, "license": "MIT" }, "node_modules/aws-ssl-profiles": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", "dev": true, "license": "MIT", "engines": { @@ -17923,8 +15799,6 @@ }, "node_modules/babel-loader": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", @@ -17940,8 +15814,6 @@ }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "license": "MIT", "dependencies": { "object.assign": "^4.1.0" @@ -17949,8 +15821,6 @@ }, "node_modules/babel-plugin-jsx-dom-expressions": { "version": "0.40.5", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.5.tgz", - "integrity": "sha512-8TFKemVLDYezqqv4mWz+PhRrkryTzivTGu0twyLrOkVZ0P63COx2Y04eVsUjFlwSOXui1z3P3Pn209dokWnirg==", "dev": true, "license": "MIT", "dependencies": { @@ -17966,8 +15836,6 @@ }, "node_modules/babel-plugin-jsx-dom-expressions/node_modules/@babel/helper-module-imports": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "license": "MIT", "dependencies": { @@ -17979,8 +15847,6 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.17", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", - "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", @@ -17993,8 +15859,6 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -18002,8 +15866,6 @@ }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", @@ -18015,8 +15877,6 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", - "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.8" @@ -18027,8 +15887,6 @@ }, "node_modules/babel-preset-solid": { "version": "1.9.10", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.10.tgz", - "integrity": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18046,15 +15904,11 @@ }, "node_modules/backo2": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", "dev": true, "license": "MIT" }, "node_modules/bail": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "license": "MIT", "funding": { "type": "github", @@ -18063,8 +15917,6 @@ }, "node_modules/bare-events": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -18078,8 +15930,6 @@ }, "node_modules/bare-fs": { "version": "4.5.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.5.tgz", - "integrity": "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -18103,8 +15953,6 @@ }, "node_modules/bare-os": { "version": "3.8.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz", - "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -18113,8 +15961,6 @@ }, "node_modules/bare-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -18123,8 +15969,6 @@ }, "node_modules/bare-stream": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.1.tgz", - "integrity": "sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -18146,8 +15990,6 @@ }, "node_modules/bare-url": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -18156,8 +15998,6 @@ }, "node_modules/base64-arraybuffer": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", "dev": true, "engines": { "node": ">= 0.6.0" @@ -18165,8 +16005,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -18185,8 +16023,6 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.10.11", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.11.tgz", - "integrity": "sha512-DAKrHphkJyiGuau/cFieRYhcTFeK/lBuD++C7cZ6KZHbMhBrisoi+EvhQ5RZrIfV5qwsW8kgQ07JIC+MDJRAhg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -18197,8 +16033,6 @@ }, "node_modules/basic-auth": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", "dependencies": { "safe-buffer": "5.1.2" @@ -18209,8 +16043,6 @@ }, "node_modules/basic-ftp": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", - "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", "dev": true, "license": "MIT", "engines": { @@ -18219,14 +16051,10 @@ }, "node_modules/batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -18235,14 +16063,10 @@ }, "node_modules/before-after-hook": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", "license": "Apache-2.0" }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", "engines": { "node": "*" @@ -18250,8 +16074,6 @@ }, "node_modules/bignumber.js": { "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", "engines": { "node": "*" @@ -18259,8 +16081,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", "engines": { "node": ">=8" @@ -18271,8 +16091,6 @@ }, "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==", "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" @@ -18280,8 +16098,6 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -18291,8 +16107,6 @@ }, "node_modules/body-parser": { "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -18315,8 +16129,6 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -18324,8 +16136,6 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -18333,14 +16143,10 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -18349,20 +16155,14 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/bowser": { "version": "2.14.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", - "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", "license": "MIT" }, "node_modules/boxen": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", @@ -18383,8 +16183,6 @@ }, "node_modules/boxen/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -18398,8 +16196,6 @@ }, "node_modules/boxen/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -18414,8 +16210,6 @@ }, "node_modules/boxen/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -18426,8 +16220,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -18438,8 +16230,6 @@ }, "node_modules/brotli-wasm": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-3.0.1.tgz", - "integrity": "sha512-U3K72/JAi3jITpdhZBqzSUq+DUY697tLxOuFXB+FpAE/Ug+5C3VZrv4uA674EUZHxNAuQ9wETXNqQkxZD6oL4A==", "dev": true, "license": "Apache-2.0", "engines": { @@ -18448,8 +16238,6 @@ }, "node_modules/browserslist": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -18481,8 +16269,6 @@ }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -18505,8 +16291,6 @@ }, "node_modules/buffer-crc32": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, "license": "MIT", "engines": { @@ -18515,14 +16299,10 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, "node_modules/buildcheck": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz", - "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==", "dev": true, "optional": true, "engines": { @@ -18531,8 +16311,6 @@ }, "node_modules/bundle-name": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" @@ -18546,8 +16324,6 @@ }, "node_modules/byline": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", "dev": true, "license": "MIT", "engines": { @@ -18556,8 +16332,6 @@ }, "node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -18565,8 +16339,6 @@ }, "node_modules/bytestreamjs": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", "license": "BSD-3-Clause", "engines": { "node": ">=6.0.0" @@ -18574,8 +16346,6 @@ }, "node_modules/cacheable-lookup": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "license": "MIT", "engines": { "node": ">=14.16" @@ -18583,8 +16353,6 @@ }, "node_modules/cacheable-request": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", @@ -18601,8 +16369,6 @@ }, "node_modules/cacheable-request/node_modules/mimic-response": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -18613,8 +16379,6 @@ }, "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -18631,8 +16395,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -18644,8 +16406,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -18660,8 +16420,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -18669,8 +16427,6 @@ }, "node_modules/camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", @@ -18679,8 +16435,6 @@ }, "node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", "engines": { "node": ">=10" @@ -18691,8 +16445,6 @@ }, "node_modules/camelcase-css": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, "license": "MIT", "engines": { @@ -18701,8 +16453,6 @@ }, "node_modules/caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "license": "MIT", "dependencies": { "browserslist": "^4.0.0", @@ -18713,8 +16463,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001780", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", - "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", "funding": [ { "type": "opencollective", @@ -18733,8 +16481,6 @@ }, "node_modules/ccount": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "license": "MIT", "funding": { "type": "github", @@ -18743,8 +16489,6 @@ }, "node_modules/chai": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { @@ -18753,8 +16497,6 @@ }, "node_modules/chalk": { "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -18765,8 +16507,6 @@ }, "node_modules/chalk-template": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", - "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", "license": "MIT", "dependencies": { "chalk": "^5.2.0" @@ -18780,8 +16520,6 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "license": "MIT", "engines": { "node": ">=10" @@ -18789,8 +16527,6 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", "funding": { "type": "github", @@ -18799,8 +16535,6 @@ }, "node_modules/character-entities-html4": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "license": "MIT", "funding": { "type": "github", @@ -18809,8 +16543,6 @@ }, "node_modules/character-entities-legacy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "license": "MIT", "funding": { "type": "github", @@ -18819,8 +16551,6 @@ }, "node_modules/character-reference-invalid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "license": "MIT", "funding": { "type": "github", @@ -18829,8 +16559,6 @@ }, "node_modules/cheerio": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", @@ -18850,8 +16578,6 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -18867,8 +16593,6 @@ }, "node_modules/chevrotain": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz", - "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -18882,15 +16606,11 @@ }, "node_modules/chevrotain/node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, "license": "MIT" }, "node_modules/chokidar": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -18904,14 +16624,10 @@ }, "node_modules/chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC" }, "node_modules/chrome-trace-event": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", "engines": { "node": ">=6.0" @@ -18919,8 +16635,6 @@ }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", @@ -18934,8 +16648,6 @@ }, "node_modules/citty": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18944,26 +16656,18 @@ }, "node_modules/cjs-module-lexer": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "license": "MIT" }, "node_modules/classcat": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", "license": "MIT" }, "node_modules/classnames": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, "node_modules/clean-css": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "license": "MIT", "dependencies": { "source-map": "~0.6.0" @@ -18974,8 +16678,6 @@ }, "node_modules/clean-css/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -18983,8 +16685,6 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", "engines": { "node": ">=6" @@ -18992,8 +16692,6 @@ }, "node_modules/cli-boxes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "license": "MIT", "engines": { "node": ">=10" @@ -19004,8 +16702,6 @@ }, "node_modules/cli-table3": { "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "license": "MIT", "dependencies": { "string-width": "^4.2.0" @@ -19019,14 +16715,10 @@ }, "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/cli-table3/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -19043,8 +16735,6 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -19057,8 +16747,6 @@ }, "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -19072,14 +16760,10 @@ }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -19092,8 +16776,6 @@ }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -19109,8 +16791,6 @@ }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", @@ -19123,8 +16803,6 @@ }, "node_modules/cloudevents": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-10.0.0.tgz", - "integrity": "sha512-uyzC+PpMMRawbouHO+3mlisr3QfEDObmo2pN4oTTF6dZncZgpIzdasZx0tRBFI1dMsqCLZZXMtz8cUuvYqHdbw==", "license": "Apache-2.0", "dependencies": { "ajv": "^8.11.0", @@ -19140,8 +16818,6 @@ }, "node_modules/cloudevents/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -19157,8 +16833,6 @@ }, "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" @@ -19166,14 +16840,10 @@ }, "node_modules/code-block-writer": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", - "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", "license": "MIT" }, "node_modules/collapse-white-space": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", "license": "MIT", "funding": { "type": "github", @@ -19182,8 +16852,6 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -19194,14 +16862,10 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "license": "ISC", "bin": { "color-support": "bin.js" @@ -19209,20 +16873,14 @@ }, "node_modules/colord": { "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "license": "MIT" }, "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/combine-promises": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", "license": "MIT", "engines": { "node": ">=10" @@ -19230,8 +16888,6 @@ }, "node_modules/comma-separated-tokens": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "license": "MIT", "funding": { "type": "github", @@ -19240,8 +16896,6 @@ }, "node_modules/command-line-args": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz", - "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==", "license": "MIT", "dependencies": { "array-back": "^6.2.2", @@ -19263,8 +16917,6 @@ }, "node_modules/command-line-usage": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.4.tgz", - "integrity": "sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==", "license": "MIT", "dependencies": { "array-back": "^6.2.2", @@ -19278,8 +16930,6 @@ }, "node_modules/command-line-usage/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -19293,8 +16943,6 @@ }, "node_modules/command-line-usage/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -19309,8 +16957,6 @@ }, "node_modules/command-line-usage/node_modules/chalk-template": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", "license": "MIT", "dependencies": { "chalk": "^4.1.2" @@ -19324,8 +16970,6 @@ }, "node_modules/command-line-usage/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -19336,8 +16980,6 @@ }, "node_modules/commander": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "license": "MIT", "engines": { "node": ">= 6" @@ -19345,14 +16987,10 @@ }, "node_modules/common-path-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "license": "ISC" }, "node_modules/common-tags": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, "license": "MIT", "engines": { @@ -19361,14 +16999,10 @@ }, "node_modules/compare-utf8": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/compare-utf8/-/compare-utf8-0.2.0.tgz", - "integrity": "sha512-5BjVs4Be9AwMm4le3Qb3crp44OAn+uuJhvrjPWA8Es/DfVPq5lSc8JaRg/clrrHOMCU+CdDfv/9eBSPh6OOiUQ==", "license": "Apache-2.0" }, "node_modules/compress-commons": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dev": true, "license": "MIT", "dependencies": { @@ -19384,8 +17018,6 @@ }, "node_modules/compress-commons/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -19409,8 +17041,6 @@ }, "node_modules/compress-commons/node_modules/readable-stream": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "license": "MIT", "dependencies": { @@ -19426,8 +17056,6 @@ }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -19438,8 +17066,6 @@ }, "node_modules/compressible/node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -19447,8 +17073,6 @@ }, "node_modules/compression": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -19465,8 +17089,6 @@ }, "node_modules/compression/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -19474,8 +17096,6 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -19483,14 +17103,10 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -19509,21 +17125,15 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/confbox": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "dev": true, "license": "MIT" }, "node_modules/config-chain": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "license": "MIT", "dependencies": { "ini": "^1.3.4", @@ -19532,8 +17142,6 @@ }, "node_modules/configstore": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^6.0.1", @@ -19551,8 +17159,6 @@ }, "node_modules/connect": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19567,8 +17173,6 @@ }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "license": "MIT", "engines": { "node": ">=0.8" @@ -19576,8 +17180,6 @@ }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -19586,8 +17188,6 @@ }, "node_modules/connect/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "license": "MIT", "engines": { @@ -19596,8 +17196,6 @@ }, "node_modules/connect/node_modules/finalhandler": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "license": "MIT", "dependencies": { @@ -19615,15 +17213,11 @@ }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/connect/node_modules/on-finished": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "license": "MIT", "dependencies": { @@ -19635,8 +17229,6 @@ }, "node_modules/connect/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", "engines": { @@ -19645,8 +17237,6 @@ }, "node_modules/consola": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" @@ -19654,14 +17244,10 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC" }, "node_modules/content-disposition": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -19669,8 +17255,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -19678,8 +17262,6 @@ }, "node_modules/convert-hrtime": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", "license": "MIT", "engines": { "node": ">=8" @@ -19687,14 +17269,10 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, "node_modules/cookie": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", "engines": { "node": ">=18" @@ -19706,8 +17284,6 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -19715,8 +17291,6 @@ }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", @@ -19739,8 +17313,6 @@ }, "node_modules/copy-webpack-plugin/node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", @@ -19758,8 +17330,6 @@ }, "node_modules/copy-webpack-plugin/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "license": "MIT", "engines": { "node": ">=12" @@ -19770,8 +17340,6 @@ }, "node_modules/core-js": { "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", - "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -19781,8 +17349,6 @@ }, "node_modules/core-js-compat": { "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", - "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "license": "MIT", "dependencies": { "browserslist": "^4.28.1" @@ -19794,8 +17360,6 @@ }, "node_modules/core-js-pure": { "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.49.0.tgz", - "integrity": "sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -19805,14 +17369,10 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, "node_modules/cors": { "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "dev": true, "license": "MIT", "dependencies": { @@ -19829,15 +17389,11 @@ }, "node_modules/cors-gate": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cors-gate/-/cors-gate-1.1.3.tgz", - "integrity": "sha512-RFqvbbpj02lqKDhqasBEkgzmT3RseCH3DKy5sT2W9S1mhctABKQP3ktKcnKN0h8t4pJ2SneI3hPl3TGNi/VmZA==", "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", @@ -19862,8 +17418,6 @@ }, "node_modules/cpu-features": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", - "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", "dev": true, "hasInstallScript": true, "optional": true, @@ -19877,8 +17431,6 @@ }, "node_modules/crc-32": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -19890,8 +17442,6 @@ }, "node_modules/crc32-stream": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dev": true, "license": "MIT", "dependencies": { @@ -19904,8 +17454,6 @@ }, "node_modules/crc32-stream/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -19929,8 +17477,6 @@ }, "node_modules/crc32-stream/node_modules/readable-stream": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "license": "MIT", "dependencies": { @@ -19946,14 +17492,10 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "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", @@ -19966,14 +17508,10 @@ }, "node_modules/cross-spawn/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/cross-spawn/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" @@ -19987,8 +17525,6 @@ }, "node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "license": "MIT", "dependencies": { "type-fest": "^1.0.1" @@ -20002,8 +17538,6 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -20014,8 +17548,6 @@ }, "node_modules/css-blank-pseudo": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -20033,8 +17565,6 @@ }, "node_modules/css-declaration-sorter": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz", - "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==", "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" @@ -20045,8 +17575,6 @@ }, "node_modules/css-has-pseudo": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -20064,8 +17592,6 @@ }, "node_modules/css-loader": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", @@ -20099,8 +17625,6 @@ }, "node_modules/css-minimizer-webpack-plugin": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", @@ -20143,8 +17667,6 @@ }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "dev": true, "license": "CC0-1.0", "bin": { @@ -20159,8 +17681,6 @@ }, "node_modules/css-select": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -20175,8 +17695,6 @@ }, "node_modules/css-tree": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "license": "MIT", "dependencies": { "mdn-data": "2.0.30", @@ -20188,8 +17706,6 @@ }, "node_modules/css-what": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -20200,8 +17716,6 @@ }, "node_modules/cssdb": { "version": "7.11.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", - "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", "dev": true, "funding": [ { @@ -20217,8 +17731,6 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -20229,8 +17741,6 @@ }, "node_modules/cssnano": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "license": "MIT", "dependencies": { "cssnano-preset-default": "^6.1.2", @@ -20249,8 +17759,6 @@ }, "node_modules/cssnano-preset-advanced": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", "license": "MIT", "dependencies": { "autoprefixer": "^10.4.19", @@ -20270,8 +17778,6 @@ }, "node_modules/cssnano-preset-default": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -20314,8 +17820,6 @@ }, "node_modules/cssnano-utils": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -20326,8 +17830,6 @@ }, "node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "license": "MIT", "dependencies": { "css-tree": "~2.2.0" @@ -20339,8 +17841,6 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "license": "MIT", "dependencies": { "mdn-data": "2.0.28", @@ -20353,20 +17853,14 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "license": "CC0-1.0" }, "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==", "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "license": "ISC", "engines": { "node": ">=12" @@ -20374,8 +17868,6 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "license": "ISC", "engines": { "node": ">=12" @@ -20383,8 +17875,6 @@ }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -20396,8 +17886,6 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "license": "BSD-3-Clause", "engines": { "node": ">=12" @@ -20405,8 +17893,6 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "license": "ISC", "dependencies": { "d3-color": "1 - 3" @@ -20417,8 +17903,6 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", "engines": { "node": ">=12" @@ -20426,8 +17910,6 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "license": "ISC", "engines": { "node": ">=12" @@ -20435,8 +17917,6 @@ }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -20454,8 +17934,6 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -20470,8 +17948,6 @@ }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, "license": "MIT", "engines": { @@ -20484,14 +17960,10 @@ }, "node_modules/debounce": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -20507,8 +17979,6 @@ }, "node_modules/decode-named-character-reference": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -20520,8 +17990,6 @@ }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" @@ -20535,8 +18003,6 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", "engines": { "node": ">=4.0.0" @@ -20544,8 +18010,6 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -20553,8 +18017,6 @@ }, "node_modules/deepmerge-ts": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -20563,8 +18025,6 @@ }, "node_modules/default-browser": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -20579,8 +18039,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=18" @@ -20591,8 +18049,6 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "license": "MIT", "engines": { "node": ">=10" @@ -20600,8 +18056,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -20617,8 +18071,6 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "license": "MIT", "engines": { "node": ">=8" @@ -20626,8 +18078,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -20643,14 +18093,10 @@ }, "node_modules/defu": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "license": "MIT" }, "node_modules/degenerator": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20664,14 +18110,10 @@ }, "node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "license": "MIT" }, "node_modules/denque": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -20680,8 +18122,6 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -20689,8 +18129,6 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { "node": ">=6" @@ -20698,15 +18136,11 @@ }, "node_modules/destr": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", "dev": true, "license": "MIT" }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "engines": { "node": ">= 0.8", @@ -20715,8 +18149,6 @@ }, "node_modules/destroyable-server": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/destroyable-server/-/destroyable-server-1.1.1.tgz", - "integrity": "sha512-7tjgU/99QVuYSqkMXr6XdQSvXj+8TjC9NiRVWNSyGytxklZ88m+qcSvWTJ3VysE3I9wurph7dTciLEEj8aUlaQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -20727,8 +18159,6 @@ }, "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" @@ -20736,14 +18166,10 @@ }, "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT" }, "node_modules/detect-port": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", "license": "MIT", "dependencies": { "address": "^1.0.1", @@ -20759,8 +18185,6 @@ }, "node_modules/devlop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "license": "MIT", "dependencies": { "dequal": "^2.0.0" @@ -20772,15 +18196,11 @@ }, "node_modules/didyoumean": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true, "license": "Apache-2.0" }, "node_modules/diff": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", - "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -20789,8 +18209,6 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -20801,15 +18219,11 @@ }, "node_modules/dlv": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true, "license": "MIT" }, "node_modules/dns-packet": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -20820,8 +18234,6 @@ }, "node_modules/docker-compose": { "version": "0.24.8", - "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", - "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", "dev": true, "license": "MIT", "dependencies": { @@ -20833,8 +18245,6 @@ }, "node_modules/docker-modem": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", - "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20849,8 +18259,6 @@ }, "node_modules/dockerode": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.9.tgz", - "integrity": "sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20868,8 +18276,6 @@ }, "node_modules/dockerode/node_modules/@grpc/proto-loader": { "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20887,8 +18293,6 @@ }, "node_modules/dockerode/node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", @@ -20901,14 +18305,10 @@ }, "node_modules/docusaurus-plugin-script-tags": { "version": "2.0.0-beta.6", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-script-tags/-/docusaurus-plugin-script-tags-2.0.0-beta.6.tgz", - "integrity": "sha512-kUJ9DS7cK7RTt1pqfmQG0lDjmuIq52y87l4lM7EmfdBvZowi1wTQ6eDszxjn8Oo9Lpv0g1MP8g+uTudUIWp0hQ==", "license": "MIT" }, "node_modules/docusaurus-plugin-typedoc": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-typedoc/-/docusaurus-plugin-typedoc-1.4.2.tgz", - "integrity": "sha512-1qerRejLSYxEWdyVPLDMMeKFPLA/37yZAsdwJy9ThHFQR78+v3b5spSbk67VHGLr2mAn4FVHu0aGJ6p7iWotSg==", "dev": true, "license": "MIT", "dependencies": { @@ -20920,15 +18320,11 @@ }, "node_modules/dom-accessibility-api": { "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, "license": "MIT" }, "node_modules/dom-converter": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "license": "MIT", "dependencies": { "utila": "~0.4" @@ -20936,8 +18332,6 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -20950,8 +18344,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -20962,8 +18354,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -20977,8 +18367,6 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -20991,8 +18379,6 @@ }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -21001,8 +18387,6 @@ }, "node_modules/dot-prop": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "license": "MIT", "dependencies": { "is-obj": "^2.0.0" @@ -21016,8 +18400,6 @@ }, "node_modules/dot-prop/node_modules/is-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "license": "MIT", "engines": { "node": ">=8" @@ -21025,8 +18407,6 @@ }, "node_modules/dotenv": { "version": "17.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", - "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -21037,8 +18417,6 @@ }, "node_modules/drizzle-kit": { "version": "0.31.10", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", - "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", "dev": true, "license": "MIT", "dependencies": { @@ -21051,10 +18429,433 @@ "drizzle-kit": "bin.cjs" } }, + "node_modules/drizzle-kit/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/drizzle-kit/node_modules/esbuild": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -21095,8 +18896,6 @@ }, "node_modules/drizzle-orm": { "version": "0.45.1", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", - "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -21221,8 +19020,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -21235,14 +19032,10 @@ }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "license": "MIT" }, "node_modules/duplexify": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", @@ -21253,14 +19046,10 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, "node_modules/eciesjs": { "version": "0.4.18", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.18.tgz", - "integrity": "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==", "license": "MIT", "dependencies": { "@ecies/ciphers": "^0.2.5", @@ -21276,8 +19065,6 @@ }, "node_modules/edge-runtime": { "version": "2.5.9", - "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.9.tgz", - "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==", "license": "MPL-2.0", "dependencies": { "@edge-runtime/format": "2.2.1", @@ -21299,8 +19086,6 @@ }, "node_modules/edge-runtime/node_modules/async-listen": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz", - "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==", "license": "MIT", "engines": { "node": ">= 14" @@ -21308,14 +19093,10 @@ }, "node_modules/edge-runtime/node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "license": "ISC" }, "node_modules/edge-runtime/node_modules/signal-exit": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", "license": "ISC", "engines": { "node": ">=14" @@ -21326,14 +19107,10 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/effect": { "version": "3.18.4", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", - "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", "dev": true, "license": "MIT", "dependencies": { @@ -21343,38 +19120,26 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.313", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", - "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", "license": "ISC" }, "node_modules/emoji-picker-element": { "version": "1.29.1", - "resolved": "https://registry.npmjs.org/emoji-picker-element/-/emoji-picker-element-1.29.1.tgz", - "integrity": "sha512-TOiHzu9Dqib3x4MwcAi3wi3RdyT4SoeB4b15AvH1ks4SBwTl7DeebhZ0d3x6dNi4XfNU7IGRZ7NBQllj0RqwrQ==", "license": "Apache-2.0" }, "node_modules/emoji-picker-element-data": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/emoji-picker-element-data/-/emoji-picker-element-data-1.8.0.tgz", - "integrity": "sha512-VfRuRJNEDLS1JKlNS4olaqhjX5S1nnZ+ZHG73b/dV8QeZyi0yPruTPEE72EmF6XO3k/9hj3lybMIYMOYXb/57A==", "license": "Apache-2.0" }, "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==", "license": "MIT" }, "node_modules/emojilib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "license": "MIT", "engines": { "node": ">= 4" @@ -21382,8 +19147,6 @@ }, "node_modules/emoticon": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", "license": "MIT", "funding": { "type": "github", @@ -21392,8 +19155,6 @@ }, "node_modules/empathic": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", "dev": true, "license": "MIT", "engines": { @@ -21402,8 +19163,6 @@ }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -21411,8 +19170,6 @@ }, "node_modules/end-of-stream": { "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -21420,8 +19177,6 @@ }, "node_modules/enhanced-resolve": { "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -21433,8 +19188,6 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -21445,8 +19198,6 @@ }, "node_modules/error-ex": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -21454,8 +19205,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -21463,8 +19212,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -21472,14 +19219,10 @@ }, "node_modules/es-module-lexer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -21490,8 +19233,6 @@ }, "node_modules/esast-util-from-estree": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -21506,8 +19247,6 @@ }, "node_modules/esast-util-from-js": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -21522,8 +19261,6 @@ }, "node_modules/esbuild": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", - "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -21561,58 +19298,8 @@ "@esbuild/win32-x64": "0.27.4" } }, - "node_modules/esbuild-android-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", - "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", - "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", - "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-darwin-arm64": { "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", - "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", "cpu": [ "arm64" ], @@ -21625,330 +19312,8 @@ "node": ">=12" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", - "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", - "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", - "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", - "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", - "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", - "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", - "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", - "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", - "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", - "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", - "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", - "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", - "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", - "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", - "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", - "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", - "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", - "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", - "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", - "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", - "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "cpu": [ "arm64" ], @@ -21961,346 +19326,8 @@ "node": ">=18" } }, - "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", - "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", - "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", - "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", - "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", - "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", - "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", - "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", - "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", - "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", - "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", - "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", - "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", - "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", - "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", - "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", - "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", - "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", - "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", - "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", - "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/win32-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", - "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, "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" @@ -22308,8 +19335,6 @@ }, "node_modules/escape-goat": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", "license": "MIT", "engines": { "node": ">=12" @@ -22320,14 +19345,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -22338,8 +19359,6 @@ }, "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -22360,8 +19379,6 @@ }, "node_modules/escodegen/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": { @@ -22370,8 +19387,6 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "optional": true, @@ -22381,8 +19396,6 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -22394,8 +19407,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -22407,8 +19418,6 @@ }, "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==", "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -22419,8 +19428,6 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -22428,8 +19435,6 @@ }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -22437,8 +19442,6 @@ }, "node_modules/estree-util-attach-comments": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -22450,8 +19453,6 @@ }, "node_modules/estree-util-build-jsx": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -22466,8 +19467,6 @@ }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "license": "MIT", "funding": { "type": "opencollective", @@ -22476,8 +19475,6 @@ }, "node_modules/estree-util-scope": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", - "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -22490,8 +19487,6 @@ }, "node_modules/estree-util-to-js": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -22505,8 +19500,6 @@ }, "node_modules/estree-util-value-to-estree": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -22517,8 +19510,6 @@ }, "node_modules/estree-util-visit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -22531,8 +19522,6 @@ }, "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" @@ -22540,8 +19529,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -22549,8 +19536,6 @@ }, "node_modules/eta": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -22561,8 +19546,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -22570,8 +19553,6 @@ }, "node_modules/eval": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", "dependencies": { "@types/node": "*", "require-like": ">= 0.1.1" @@ -22582,8 +19563,6 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, "license": "MIT", "engines": { @@ -22592,14 +19571,10 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { "node": ">=0.8.x" @@ -22607,8 +19582,6 @@ }, "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": { @@ -22617,8 +19590,6 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -22640,8 +19611,6 @@ }, "node_modules/expand-template": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "license": "(MIT OR WTFPL)", "engines": { "node": ">=6" @@ -22649,8 +19618,6 @@ }, "node_modules/expect-type": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -22659,8 +19626,6 @@ }, "node_modules/express": { "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -22705,8 +19670,6 @@ }, "node_modules/express/node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -22717,8 +19680,6 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -22726,14 +19687,10 @@ }, "node_modules/express/node_modules/cookie-signature": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -22741,20 +19698,14 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -22762,8 +19713,6 @@ }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -22782,21 +19731,15 @@ }, "node_modules/exsolve": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", "dev": true, "license": "MIT" }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" @@ -22807,8 +19750,6 @@ }, "node_modules/fast-check": { "version": "3.23.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", - "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", "dev": true, "funding": [ { @@ -22830,8 +19771,6 @@ }, "node_modules/fast-content-type-parse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", "funding": [ { "type": "github", @@ -22846,27 +19785,19 @@ }, "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.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -22881,8 +19812,6 @@ }, "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==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -22893,21 +19822,15 @@ }, "node_modules/fast-json-patch": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", "dev": true, "license": "MIT" }, "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==", "license": "MIT" }, "node_modules/fast-json-stringify": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz", - "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==", "funding": [ { "type": "github", @@ -22930,8 +19853,6 @@ }, "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" @@ -22939,8 +19860,6 @@ }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -22955,8 +19874,6 @@ }, "node_modules/fast-xml-builder": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", - "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", "funding": [ { "type": "github", @@ -22970,8 +19887,6 @@ }, "node_modules/fast-xml-parser": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", - "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", "funding": [ { "type": "github", @@ -22989,8 +19904,6 @@ }, "node_modules/fastify": { "version": "5.8.2", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.2.tgz", - "integrity": "sha512-lZmt3navvZG915IE+f7/TIVamxIwmBd+OMB+O9WBzcpIwOo6F0LTh0sluoMFk5VkrKTvvrwIaoJPkir4Z+jtAg==", "funding": [ { "type": "github", @@ -23022,8 +19935,6 @@ }, "node_modules/fastify-plugin": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", - "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", "funding": [ { "type": "github", @@ -23038,8 +19949,6 @@ }, "node_modules/fastq": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -23047,8 +19956,6 @@ }, "node_modules/fault": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", "license": "MIT", "dependencies": { "format": "^0.2.0" @@ -23060,8 +19967,6 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" @@ -23072,8 +19977,6 @@ }, "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" @@ -23089,8 +19992,6 @@ }, "node_modules/feed": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", "license": "MIT", "dependencies": { "xml-js": "^1.6.11" @@ -23101,8 +20002,6 @@ }, "node_modules/figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -23116,8 +20015,6 @@ }, "node_modules/figures/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -23125,8 +20022,6 @@ }, "node_modules/file-loader": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -23145,8 +20040,6 @@ }, "node_modules/file-loader/node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -23161,8 +20054,6 @@ }, "node_modules/file-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -23170,14 +20061,10 @@ }, "node_modules/file-loader/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==", "license": "MIT" }, "node_modules/file-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -23194,8 +20081,6 @@ }, "node_modules/file-selector": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", - "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", "license": "MIT", "dependencies": { "tslib": "^2.7.0" @@ -23206,14 +20091,10 @@ }, "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==", "license": "MIT" }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -23224,8 +20105,6 @@ }, "node_modules/finalhandler": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -23242,8 +20121,6 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -23251,14 +20128,10 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/find-cache-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", @@ -23273,8 +20146,6 @@ }, "node_modules/find-my-way": { "version": "9.5.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz", - "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -23287,8 +20158,6 @@ }, "node_modules/find-process": { "version": "1.4.11", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.11.tgz", - "integrity": "sha512-mAOh9gGk9WZ4ip5UjV0o6Vb4SrfnAmtsFNzkMRH9HQiFXVQnDyQFrSHTK5UoG6E+KV+s+cIznbtwpfN41l2nFA==", "license": "MIT", "dependencies": { "chalk": "~4.1.2", @@ -23301,8 +20170,6 @@ }, "node_modules/find-process/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -23316,8 +20183,6 @@ }, "node_modules/find-process/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -23332,8 +20197,6 @@ }, "node_modules/find-process/node_modules/commander": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", "engines": { "node": ">=18" @@ -23341,8 +20204,6 @@ }, "node_modules/find-process/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -23353,8 +20214,6 @@ }, "node_modules/find-replace": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", - "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", "license": "MIT", "engines": { "node": ">=14" @@ -23370,8 +20229,6 @@ }, "node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "license": "MIT", "dependencies": { "locate-path": "^7.1.0", @@ -23386,8 +20243,6 @@ }, "node_modules/find-up-simple": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, "license": "MIT", "engines": { @@ -23399,8 +20254,6 @@ }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "license": "BSD-3-Clause", "bin": { "flat": "cli.js" @@ -23408,8 +20261,6 @@ }, "node_modules/follow-redirects": { "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -23428,8 +20279,6 @@ }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -23443,8 +20292,6 @@ }, "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==", "dev": true, "license": "ISC", "dependencies": { @@ -23460,8 +20307,6 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -23473,8 +20318,6 @@ }, "node_modules/form-data-encoder": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "license": "MIT", "engines": { "node": ">= 14.17" @@ -23482,16 +20325,12 @@ }, "node_modules/format": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "engines": { "node": ">=0.4.x" } }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -23499,14 +20338,10 @@ }, "node_modules/forwarded-parse": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", - "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", "license": "MIT" }, "node_modules/fraction.js": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "license": "MIT", "engines": { "node": "*" @@ -23518,8 +20353,6 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -23527,14 +20360,10 @@ }, "node_modules/fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, "node_modules/fs-extra": { "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -23547,8 +20376,6 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -23559,8 +20386,6 @@ }, "node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -23571,21 +20396,14 @@ }, "node_modules/fs-minipass/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -23597,8 +20415,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -23606,9 +20422,6 @@ }, "node_modules/gauge": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -23627,14 +20440,10 @@ }, "node_modules/gauge/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/gauge/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -23647,8 +20456,6 @@ }, "node_modules/gaxios": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -23663,8 +20470,6 @@ }, "node_modules/gaxios/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -23676,8 +20481,6 @@ }, "node_modules/gcp-metadata": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", "license": "Apache-2.0", "dependencies": { "gaxios": "^6.1.1", @@ -23690,8 +20493,6 @@ }, "node_modules/generate-function": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -23700,8 +20501,6 @@ }, "node_modules/generator-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -23709,8 +20508,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -23718,8 +20515,6 @@ }, "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.*" @@ -23727,8 +20522,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -23751,14 +20544,10 @@ }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "license": "ISC" }, "node_modules/get-port": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", "license": "MIT", "engines": { "node": ">=16" @@ -23769,15 +20558,11 @@ }, "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==", "dev": true, "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==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -23789,8 +20574,6 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", "engines": { "node": ">=10" @@ -23801,8 +20584,6 @@ }, "node_modules/get-tsconfig": { "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -23813,8 +20594,6 @@ }, "node_modules/get-uri": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", "dev": true, "license": "MIT", "dependencies": { @@ -23828,8 +20607,6 @@ }, "node_modules/giget": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", "dev": true, "license": "MIT", "dependencies": { @@ -23846,20 +20623,14 @@ }, "node_modules/github-from-package": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "license": "MIT" }, "node_modules/github-slugger": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", "license": "ISC" }, "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==", "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -23870,8 +20641,6 @@ }, "node_modules/glob-to-regex.js": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -23886,14 +20655,10 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, "node_modules/global-dirs": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "license": "MIT", "dependencies": { "ini": "2.0.0" @@ -23907,8 +20672,6 @@ }, "node_modules/global-dirs/node_modules/ini": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "license": "ISC", "engines": { "node": ">=10" @@ -23916,8 +20679,6 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "license": "MIT", "dependencies": { "array-union": "^2.1.0", @@ -23936,8 +20697,6 @@ }, "node_modules/google-logging-utils": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -23945,8 +20704,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -23957,8 +20714,6 @@ }, "node_modules/got": { "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", @@ -23982,8 +20737,6 @@ }, "node_modules/got/node_modules/@sindresorhus/is": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "license": "MIT", "engines": { "node": ">=14.16" @@ -23994,28 +20747,20 @@ }, "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.12", - "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.12.tgz", - "integrity": "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==", "dev": true, "license": "MIT" }, "node_modules/graphmatch": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/graphmatch/-/graphmatch-1.1.1.tgz", - "integrity": "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==", "dev": true, "license": "MIT" }, "node_modules/graphql": { "version": "15.10.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", - "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", "dev": true, "license": "MIT", "engines": { @@ -24024,8 +20769,6 @@ }, "node_modules/graphql-http": { "version": "1.22.4", - "resolved": "https://registry.npmjs.org/graphql-http/-/graphql-http-1.22.4.tgz", - "integrity": "sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==", "dev": true, "license": "MIT", "workspaces": [ @@ -24040,8 +20783,6 @@ }, "node_modules/graphql-subscriptions": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", - "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", "dev": true, "license": "MIT", "dependencies": { @@ -24053,8 +20794,6 @@ }, "node_modules/graphql-tag": { "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", "dev": true, "license": "MIT", "dependencies": { @@ -24069,8 +20808,6 @@ }, "node_modules/gray-matter": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", @@ -24084,8 +20821,6 @@ }, "node_modules/gray-matter/node_modules/js-yaml": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -24097,8 +20832,6 @@ }, "node_modules/gzip-size": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "license": "MIT", "dependencies": { "duplexer": "^0.1.2" @@ -24112,14 +20845,10 @@ }, "node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -24127,8 +20856,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -24139,8 +20866,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -24151,8 +20876,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -24166,14 +20889,10 @@ }, "node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "license": "ISC" }, "node_modules/has-yarn": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -24184,14 +20903,10 @@ }, "node_modules/hash-wasm": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.12.0.tgz", - "integrity": "sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==", "license": "MIT" }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -24202,8 +20917,6 @@ }, "node_modules/hast-util-from-parse5": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -24222,8 +20935,6 @@ }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -24235,8 +20946,6 @@ }, "node_modules/hast-util-raw": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -24260,8 +20969,6 @@ }, "node_modules/hast-util-sanitize": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", - "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -24275,8 +20982,6 @@ }, "node_modules/hast-util-to-estree": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -24303,8 +21008,6 @@ }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -24330,8 +21033,6 @@ }, "node_modules/hast-util-to-parse5": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -24349,8 +21050,6 @@ }, "node_modules/hast-util-whitespace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -24362,8 +21061,6 @@ }, "node_modules/hastscript": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -24379,8 +21076,6 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "license": "MIT", "bin": { "he": "bin/he" @@ -24388,8 +21083,6 @@ }, "node_modules/history": { "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", @@ -24402,8 +21095,6 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -24411,14 +21102,10 @@ }, "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/hono": { "version": "4.11.4", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", - "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "dev": true, "license": "MIT", "engines": { @@ -24427,8 +21114,6 @@ }, "node_modules/hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "dependencies": { "inherits": "^2.0.1", @@ -24439,14 +21124,10 @@ }, "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -24460,8 +21141,6 @@ }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -24469,21 +21148,15 @@ }, "node_modules/html-entities": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true, "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "license": "MIT", "dependencies": { "camel-case": "^4.1.2", @@ -24503,8 +21176,6 @@ }, "node_modules/html-minifier-terser/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "license": "MIT", "engines": { "node": ">=14" @@ -24512,8 +21183,6 @@ }, "node_modules/html-tags": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "license": "MIT", "engines": { "node": ">=8" @@ -24524,8 +21193,6 @@ }, "node_modules/html-url-attributes": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", "license": "MIT", "funding": { "type": "opencollective", @@ -24534,8 +21201,6 @@ }, "node_modules/html-void-elements": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "license": "MIT", "funding": { "type": "github", @@ -24544,8 +21209,6 @@ }, "node_modules/html-webpack-plugin": { "version": "5.6.6", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", - "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -24576,8 +21239,6 @@ }, "node_modules/html-webpack-plugin/node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "license": "MIT", "engines": { "node": ">= 12" @@ -24585,8 +21246,6 @@ }, "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "license": "MIT", "dependencies": { "camel-case": "^4.1.2", @@ -24606,8 +21265,6 @@ }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -24625,20 +21282,14 @@ }, "node_modules/http-cache-semantics": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT" }, "node_modules/http-encoding": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http-encoding/-/http-encoding-2.2.0.tgz", - "integrity": "sha512-sotL89NNHWS7TjaoswmKkNKf57+nAYCg3fbGCclpNLriVGkOSgrAWQ9DLqahnwacY+gednJk+HFdZrpKw/Ff6w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -24652,8 +21303,6 @@ }, "node_modules/http-encoding/node_modules/pify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true, "license": "MIT", "engines": { @@ -24665,8 +21314,6 @@ }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -24685,14 +21332,10 @@ }, "node_modules/http-parser-js": { "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", @@ -24705,8 +21348,6 @@ }, "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { @@ -24719,8 +21360,6 @@ }, "node_modules/http-proxy-middleware": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -24743,8 +21382,6 @@ }, "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "license": "MIT", "engines": { "node": ">=10" @@ -24755,21 +21392,15 @@ }, "node_modules/http-proxy/node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "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==", "dev": true, "license": "MIT" }, "node_modules/http2-wrapper": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", @@ -24781,8 +21412,6 @@ }, "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==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -24794,8 +21423,6 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "license": "Apache-2.0", "engines": { "node": ">=10.17.0" @@ -24803,8 +21430,6 @@ }, "node_modules/hyperdyperid": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "license": "MIT", "engines": { "node": ">=10.18" @@ -24812,8 +21437,6 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -24824,8 +21447,6 @@ }, "node_modules/icss-utils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -24836,14 +21457,10 @@ }, "node_modules/idb": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", "license": "ISC" }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -24862,8 +21479,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" @@ -24871,8 +21486,6 @@ }, "node_modules/image-size": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", "license": "MIT", "bin": { "image-size": "bin/image-size.js" @@ -24883,8 +21496,6 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -24899,8 +21510,6 @@ }, "node_modules/import-in-the-middle": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", "license": "Apache-2.0", "dependencies": { "acorn": "^8.14.0", @@ -24911,8 +21520,6 @@ }, "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "license": "MIT", "engines": { "node": ">=8" @@ -24920,8 +21527,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -24929,8 +21534,6 @@ }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "license": "MIT", "engines": { "node": ">=8" @@ -24938,8 +21541,6 @@ }, "node_modules/infima": { "version": "0.2.0-alpha.45", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", - "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", "license": "MIT", "engines": { "node": ">=12" @@ -24947,9 +21548,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -24958,26 +21556,18 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, "node_modules/inline-style-parser": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -24985,8 +21575,6 @@ }, "node_modules/ip-address": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, "license": "MIT", "engines": { @@ -24995,8 +21583,6 @@ }, "node_modules/ipaddr.js": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", "license": "MIT", "engines": { "node": ">= 10" @@ -25004,8 +21590,6 @@ }, "node_modules/is-alphabetical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "license": "MIT", "funding": { "type": "github", @@ -25014,8 +21598,6 @@ }, "node_modules/is-alphanumerical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", @@ -25028,8 +21610,6 @@ }, "node_modules/is-arguments": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -25044,14 +21624,10 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -25062,8 +21638,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -25074,8 +21648,6 @@ }, "node_modules/is-ci": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "license": "MIT", "dependencies": { "ci-info": "^3.2.0" @@ -25086,8 +21658,6 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -25101,8 +21671,6 @@ }, "node_modules/is-decimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "license": "MIT", "funding": { "type": "github", @@ -25111,8 +21679,6 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -25126,8 +21692,6 @@ }, "node_modules/is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -25135,8 +21699,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -25144,8 +21706,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -25153,8 +21713,6 @@ }, "node_modules/is-generator-function": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.4", @@ -25172,8 +21730,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -25184,8 +21740,6 @@ }, "node_modules/is-hexadecimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "license": "MIT", "funding": { "type": "github", @@ -25194,8 +21748,6 @@ }, "node_modules/is-in-subnet": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-in-subnet/-/is-in-subnet-4.0.1.tgz", - "integrity": "sha512-D3mAuAo6vZ+/AxsLkEIZ3moTx7AIGQLLzLQslV6n0RRO/CzdUemXap+lj3OPAehKCbdkGPikxOVUYqRo0GGJAA==", "license": "MIT", "engines": { "node": ">=10.23.0" @@ -25203,8 +21755,6 @@ }, "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==", "license": "MIT", "dependencies": { "is-docker": "^3.0.0" @@ -25221,8 +21771,6 @@ }, "node_modules/is-inside-container/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==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -25236,8 +21784,6 @@ }, "node_modules/is-installed-globally": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "license": "MIT", "dependencies": { "global-dirs": "^3.0.0", @@ -25252,8 +21798,6 @@ }, "node_modules/is-network-error": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", - "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", "license": "MIT", "engines": { "node": ">=16" @@ -25264,15 +21808,11 @@ }, "node_modules/is-node-process": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true, "license": "MIT" }, "node_modules/is-npm": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", - "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -25283,8 +21823,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -25292,8 +21830,6 @@ }, "node_modules/is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -25301,8 +21837,6 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -25310,8 +21844,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=12" @@ -25322,8 +21854,6 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "license": "MIT", "dependencies": { "isobject": "^3.0.1" @@ -25334,15 +21864,11 @@ }, "node_modules/is-property": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", "dev": true, "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -25359,8 +21885,6 @@ }, "node_modules/is-regexp": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -25368,8 +21892,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -25380,8 +21902,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -25395,14 +21915,10 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "license": "MIT" }, "node_modules/is-what": { "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, "license": "MIT", "engines": { @@ -25414,8 +21930,6 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -25426,8 +21940,6 @@ }, "node_modules/is-yarn-global": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", "license": "MIT", "engines": { "node": ">=12" @@ -25435,14 +21947,10 @@ }, "node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "license": "MIT" }, "node_modules/isexe": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "license": "BlueOak-1.0.0", "engines": { "node": ">=18" @@ -25450,8 +21958,6 @@ }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -25459,8 +21965,6 @@ }, "node_modules/isomorphic-ws": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", "dev": true, "license": "MIT", "peerDependencies": { @@ -25469,8 +21973,6 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -25479,8 +21981,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -25494,8 +21994,6 @@ }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -25507,8 +22005,6 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -25521,15 +22017,11 @@ }, "node_modules/iterall": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==", "dev": true, "license": "MIT" }, "node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -25544,8 +22036,6 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -25561,8 +22051,6 @@ }, "node_modules/jest-util/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -25576,8 +22064,6 @@ }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -25592,8 +22078,6 @@ }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -25604,8 +22088,6 @@ }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -25616,8 +22098,6 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -25631,8 +22111,6 @@ }, "node_modules/jiti": { "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -25640,15 +22118,11 @@ }, "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/joi": { "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", @@ -25660,8 +22134,6 @@ }, "node_modules/jose": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -25669,8 +22141,6 @@ }, "node_modules/js-cookie": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", "license": "MIT", "engines": { "node": ">=14" @@ -25678,14 +22148,10 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-xxhash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-xxhash/-/js-xxhash-4.0.0.tgz", - "integrity": "sha512-3Q2eIqG6s1KEBBmkj9tGM9lef8LJbuRyTVBdI3GpTnrvtytunjLPO0wqABp5qhtMzfA32jYn1FlnIV7GH1RAHQ==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -25693,8 +22159,6 @@ }, "node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -25705,14 +22169,10 @@ }, "node_modules/js-yaml/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -25723,8 +22183,6 @@ }, "node_modules/json-bigint": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" @@ -25732,26 +22190,18 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "license": "MIT" }, "node_modules/json-custom-numbers": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/json-custom-numbers/-/json-custom-numbers-3.1.1.tgz", - "integrity": "sha512-rYIAIuiIRy58aax2tuZb7HawKFATBG848PiguybJh/R+pvC8jxjEOVBQHj4J3U2D4/Y4acBCO4A/glILW8wPoA==", "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/json-schema-ref-resolver": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", - "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", "funding": [ { "type": "github", @@ -25769,8 +22219,6 @@ }, "node_modules/json-schema-to-ts": { "version": "1.6.4", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", - "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.6", @@ -25779,21 +22227,15 @@ }, "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-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -25804,8 +22246,6 @@ }, "node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -25816,14 +22256,10 @@ }, "node_modules/kasi": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/kasi/-/kasi-1.1.2.tgz", - "integrity": "sha512-Q2N8EHdkJFKdzq8fxzDNSXb4RE8xzcPHwZuT7N1/wJY3XaMkoGXkzGZcEnNODzQXJNOd9inReEW2V1V4svAf/Q==", "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -25831,8 +22267,6 @@ }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -25840,8 +22274,6 @@ }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "license": "MIT", "engines": { "node": ">=6" @@ -25849,8 +22281,6 @@ }, "node_modules/latest-version": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", "license": "MIT", "dependencies": { "package-json": "^8.1.0" @@ -25864,8 +22294,6 @@ }, "node_modules/launch-editor": { "version": "2.13.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.1.tgz", - "integrity": "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==", "license": "MIT", "dependencies": { "picocolors": "^1.1.1", @@ -25874,8 +22302,6 @@ }, "node_modules/lazystream": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, "license": "MIT", "dependencies": { @@ -25887,15 +22313,11 @@ }, "node_modules/lazystream/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -25910,8 +22332,6 @@ }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { @@ -25920,8 +22340,6 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "license": "MIT", "engines": { "node": ">=6" @@ -25929,8 +22347,6 @@ }, "node_modules/light-my-request": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", - "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", "funding": [ { "type": "github", @@ -25950,8 +22366,6 @@ }, "node_modules/light-my-request/node_modules/process-warning": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", - "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", "funding": [ { "type": "github", @@ -25966,8 +22380,6 @@ }, "node_modules/lightningcss": { "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -26015,8 +22427,6 @@ }, "node_modules/lightningcss-darwin-arm64": { "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], @@ -26100,6 +22510,9 @@ "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -26120,6 +22533,9 @@ "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -26140,6 +22556,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -26160,6 +22579,9 @@ "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -26215,8 +22637,6 @@ }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", "engines": { "node": ">=14" @@ -26227,14 +22647,10 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { @@ -26247,8 +22663,6 @@ }, "node_modules/loader-runner": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", "engines": { "node": ">=6.11.5" @@ -26260,8 +22674,6 @@ }, "node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -26274,8 +22686,6 @@ }, "node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "license": "MIT", "dependencies": { "p-locate": "^6.0.0" @@ -26289,38 +22699,26 @@ }, "node_modules/lodash": { "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "license": "MIT" }, "node_modules/loglevel": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -26332,14 +22730,10 @@ }, "node_modules/long": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, "node_modules/longest-streak": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "license": "MIT", "funding": { "type": "github", @@ -26348,8 +22742,6 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -26360,8 +22752,6 @@ }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -26369,8 +22759,6 @@ }, "node_modules/lowercase-keys": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -26381,8 +22769,6 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -26390,8 +22776,6 @@ }, "node_modules/lru.min": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", - "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", "dev": true, "license": "MIT", "engines": { @@ -26406,8 +22790,6 @@ }, "node_modules/lucide-react": { "version": "0.539.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.539.0.tgz", - "integrity": "sha512-VVISr+VF2krO91FeuCrm1rSOLACQUYVy7NQkzrOty52Y8TlTPcXcMdQFj9bYzBgXbWCiywlwSZ3Z8u6a+6bMlg==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -26415,15 +22797,11 @@ }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/lz-string": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", "bin": { @@ -26432,8 +22810,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -26442,8 +22818,6 @@ }, "node_modules/magicast": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", - "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", "dependencies": { @@ -26454,8 +22828,6 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -26470,14 +22842,10 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "license": "ISC" }, "node_modules/markdown-extensions": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", "license": "MIT", "engines": { "node": ">=16" @@ -26488,8 +22856,6 @@ }, "node_modules/markdown-it": { "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "dev": true, "license": "MIT", "dependencies": { @@ -26506,15 +22872,11 @@ }, "node_modules/markdown-it/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/markdown-table": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "license": "MIT", "funding": { "type": "github", @@ -26523,8 +22885,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -26532,8 +22892,6 @@ }, "node_modules/mdast-util-directive": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", - "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26553,8 +22911,6 @@ }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26569,8 +22925,6 @@ }, "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { "node": ">=12" @@ -26581,8 +22935,6 @@ }, "node_modules/mdast-util-from-markdown": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26605,8 +22957,6 @@ }, "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -26621,8 +22971,6 @@ }, "node_modules/mdast-util-frontmatter": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26639,8 +22987,6 @@ }, "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { "node": ">=12" @@ -26651,8 +22997,6 @@ }, "node_modules/mdast-util-gfm": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -26670,8 +23014,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26687,8 +23029,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -26707,8 +23047,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -26723,8 +23061,6 @@ }, "node_modules/mdast-util-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26740,8 +23076,6 @@ }, "node_modules/mdast-util-gfm-strikethrough": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26755,8 +23089,6 @@ }, "node_modules/mdast-util-gfm-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26772,8 +23104,6 @@ }, "node_modules/mdast-util-gfm-task-list-item": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26788,8 +23118,6 @@ }, "node_modules/mdast-util-mdx": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -26805,8 +23133,6 @@ }, "node_modules/mdast-util-mdx-expression": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -26823,8 +23149,6 @@ }, "node_modules/mdast-util-mdx-jsx": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -26847,8 +23171,6 @@ }, "node_modules/mdast-util-mdxjs-esm": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -26865,8 +23187,6 @@ }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26879,8 +23199,6 @@ }, "node_modules/mdast-util-to-hast": { "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -26900,8 +23218,6 @@ }, "node_modules/mdast-util-to-markdown": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -26921,8 +23237,6 @@ }, "node_modules/mdast-util-to-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" @@ -26934,21 +23248,15 @@ }, "node_modules/mdn-data": { "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "license": "CC0-1.0" }, "node_modules/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -26956,8 +23264,6 @@ }, "node_modules/memfs": { "version": "4.56.11", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.56.11.tgz", - "integrity": "sha512-/GodtwVeKVIHZKLUSr2ZdOxKBC5hHki4JNCU22DoCGPEHr5o2PD5U721zvESKyWwCfTfavFl9WZYgA13OAYK0g==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-core": "4.56.11", @@ -26985,8 +23291,6 @@ }, "node_modules/merge-anything": { "version": "5.1.7", - "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", - "integrity": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==", "dev": true, "license": "MIT", "dependencies": { @@ -27001,8 +23305,6 @@ }, "node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -27010,14 +23312,10 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -27025,8 +23323,6 @@ }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -27034,8 +23330,6 @@ }, "node_modules/micromark": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "funding": [ { "type": "GitHub Sponsors", @@ -27069,8 +23363,6 @@ }, "node_modules/micromark-core-commonmark": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "funding": [ { "type": "GitHub Sponsors", @@ -27103,8 +23395,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -27123,8 +23413,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27143,8 +23431,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27159,8 +23445,6 @@ }, "node_modules/micromark-extension-directive": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -27178,8 +23462,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -27198,8 +23480,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27218,8 +23498,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27234,8 +23512,6 @@ }, "node_modules/micromark-extension-frontmatter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", "license": "MIT", "dependencies": { "fault": "^2.0.0", @@ -27250,8 +23526,6 @@ }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27270,8 +23544,6 @@ }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27286,8 +23558,6 @@ }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", @@ -27306,8 +23576,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", @@ -27322,8 +23590,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27342,8 +23608,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27358,8 +23622,6 @@ }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -27378,8 +23640,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -27398,8 +23658,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27418,8 +23676,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27434,8 +23690,6 @@ }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -27452,8 +23706,6 @@ }, "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27468,8 +23720,6 @@ }, "node_modules/micromark-extension-gfm-table": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -27485,8 +23735,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -27505,8 +23753,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27525,8 +23771,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27541,8 +23785,6 @@ }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -27554,8 +23796,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -27571,8 +23811,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -27591,8 +23829,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27611,8 +23847,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27627,8 +23861,6 @@ }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27653,8 +23885,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -27673,8 +23903,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27693,8 +23921,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27709,8 +23935,6 @@ }, "node_modules/micromark-extension-mdx-jsx": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -27731,8 +23955,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -27751,8 +23973,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27771,8 +23991,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27787,8 +24005,6 @@ }, "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -27800,8 +24016,6 @@ }, "node_modules/micromark-extension-mdxjs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "license": "MIT", "dependencies": { "acorn": "^8.0.0", @@ -27820,8 +24034,6 @@ }, "node_modules/micromark-extension-mdxjs-esm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -27841,8 +24053,6 @@ }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27861,8 +24071,6 @@ }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27877,8 +24085,6 @@ }, "node_modules/micromark-factory-destination": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "funding": [ { "type": "GitHub Sponsors", @@ -27898,8 +24104,6 @@ }, "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27918,8 +24122,6 @@ }, "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27934,8 +24136,6 @@ }, "node_modules/micromark-factory-label": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "funding": [ { "type": "GitHub Sponsors", @@ -27956,8 +24156,6 @@ }, "node_modules/micromark-factory-label/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27976,8 +24174,6 @@ }, "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -27992,8 +24188,6 @@ }, "node_modules/micromark-factory-mdx-expression": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", "funding": [ { "type": "GitHub Sponsors", @@ -28019,8 +24213,6 @@ }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -28039,8 +24231,6 @@ }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28059,8 +24249,6 @@ }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28075,8 +24263,6 @@ }, "node_modules/micromark-factory-space": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "funding": [ { "type": "GitHub Sponsors", @@ -28095,8 +24281,6 @@ }, "node_modules/micromark-factory-space/node_modules/micromark-util-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -28111,8 +24295,6 @@ }, "node_modules/micromark-factory-title": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "funding": [ { "type": "GitHub Sponsors", @@ -28133,8 +24315,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -28153,8 +24333,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28173,8 +24351,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28189,8 +24365,6 @@ }, "node_modules/micromark-factory-whitespace": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "funding": [ { "type": "GitHub Sponsors", @@ -28211,8 +24385,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -28231,8 +24403,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28251,8 +24421,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28267,8 +24435,6 @@ }, "node_modules/micromark-util-character": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", "funding": [ { "type": "GitHub Sponsors", @@ -28287,8 +24453,6 @@ }, "node_modules/micromark-util-character/node_modules/micromark-util-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -28303,8 +24467,6 @@ }, "node_modules/micromark-util-chunked": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "funding": [ { "type": "GitHub Sponsors", @@ -28322,8 +24484,6 @@ }, "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28338,8 +24498,6 @@ }, "node_modules/micromark-util-classify-character": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28359,8 +24517,6 @@ }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28379,8 +24535,6 @@ }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28395,8 +24549,6 @@ }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "funding": [ { "type": "GitHub Sponsors", @@ -28415,8 +24567,6 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "funding": [ { "type": "GitHub Sponsors", @@ -28434,8 +24584,6 @@ }, "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28450,8 +24598,6 @@ }, "node_modules/micromark-util-decode-string": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -28472,8 +24618,6 @@ }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28492,8 +24636,6 @@ }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28508,8 +24650,6 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { "type": "GitHub Sponsors", @@ -28524,8 +24664,6 @@ }, "node_modules/micromark-util-events-to-acorn": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", "funding": [ { "type": "GitHub Sponsors", @@ -28549,8 +24687,6 @@ }, "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28565,8 +24701,6 @@ }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "funding": [ { "type": "GitHub Sponsors", @@ -28581,8 +24715,6 @@ }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28600,8 +24732,6 @@ }, "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28616,8 +24746,6 @@ }, "node_modules/micromark-util-resolve-all": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "funding": [ { "type": "GitHub Sponsors", @@ -28635,8 +24763,6 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "funding": [ { "type": "GitHub Sponsors", @@ -28656,8 +24782,6 @@ }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28676,8 +24800,6 @@ }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28692,8 +24814,6 @@ }, "node_modules/micromark-util-subtokenize": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "funding": [ { "type": "GitHub Sponsors", @@ -28714,8 +24834,6 @@ }, "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28730,8 +24848,6 @@ }, "node_modules/micromark-util-symbol": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", "funding": [ { "type": "GitHub Sponsors", @@ -28746,8 +24862,6 @@ }, "node_modules/micromark-util-types": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -28762,8 +24876,6 @@ }, "node_modules/micromark/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -28782,8 +24894,6 @@ }, "node_modules/micromark/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28802,8 +24912,6 @@ }, "node_modules/micromark/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -28818,8 +24926,6 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -28831,8 +24937,6 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -28843,8 +24947,6 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { "mime": "cli.js" @@ -28855,8 +24957,6 @@ }, "node_modules/mime-db": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -28864,8 +24964,6 @@ }, "node_modules/mime-types": { "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "license": "MIT", "dependencies": { "mime-db": "~1.33.0" @@ -28876,8 +24974,6 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { "node": ">=6" @@ -28885,8 +24981,6 @@ }, "node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", "engines": { "node": ">=10" @@ -28897,8 +24991,6 @@ }, "node_modules/mini-css-extract-plugin": { "version": "2.10.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.1.tgz", - "integrity": "sha512-k7G3Y5QOegl380tXmZ68foBRRjE9Ljavx835ObdvmZjQ639izvZD8CS7BkWw1qKPPzHsGL/JDhl0uyU1zc2rJw==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", @@ -28917,8 +25009,6 @@ }, "node_modules/mini-svg-data-uri": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", "dev": true, "license": "MIT", "bin": { @@ -28927,14 +25017,10 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC" }, "node_modules/minimatch": { "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, "license": "ISC", "dependencies": { @@ -28949,8 +25035,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -28958,8 +25042,6 @@ }, "node_modules/minipass": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -28968,8 +25050,6 @@ }, "node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { "minipass": "^3.0.0", @@ -28981,8 +25061,6 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -28993,27 +25071,19 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/mitata": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/mitata/-/mitata-1.0.34.tgz", - "integrity": "sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA==", "dev": true, "license": "MIT" }, "node_modules/mitt": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, "node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -29024,14 +25094,10 @@ }, "node_modules/mkdirp-classic": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "license": "MIT" }, "node_modules/mnemonist": { "version": "0.40.0", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.40.0.tgz", - "integrity": "sha512-kdd8AFNig2AD5Rkih7EPCXhu/iMvwevQFX/uEiGhZyPZi7fHqOoF4V4kHLpCfysxXMgQ4B52kdPMCwARshKvEg==", "license": "MIT", "dependencies": { "obliterator": "^2.0.4" @@ -29039,8 +25105,6 @@ }, "node_modules/mockttp": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/mockttp/-/mockttp-4.2.3.tgz", - "integrity": "sha512-UZoO+wQqptZNBnCxvmtUKALeRZTryhDB/viFWS0Dg584WwXvAeacvFmkwa5+lxbdh8AihnEoUcD61Oy1V0N75A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -29098,8 +25162,6 @@ }, "node_modules/mockttp/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -29111,8 +25173,6 @@ }, "node_modules/mockttp/node_modules/cacheable-lookup": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", "dev": true, "license": "MIT", "engines": { @@ -29121,8 +25181,6 @@ }, "node_modules/mockttp/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "license": "MIT", "dependencies": { @@ -29135,8 +25193,6 @@ }, "node_modules/mockttp/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -29145,15 +25201,11 @@ }, "node_modules/mockttp/node_modules/urlpattern-polyfill": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", - "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", "dev": true, "license": "MIT" }, "node_modules/module-details-from-path": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", - "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", "license": "MIT" }, "node_modules/monaco-editor": { @@ -29164,8 +25216,6 @@ }, "node_modules/mri": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "license": "MIT", "engines": { "node": ">=4" @@ -29173,8 +25223,6 @@ }, "node_modules/mrmime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "license": "MIT", "engines": { "node": ">=10" @@ -29182,14 +25230,10 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", @@ -29201,8 +25245,6 @@ }, "node_modules/mysql2": { "version": "3.15.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", - "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "dev": true, "license": "MIT", "dependencies": { @@ -29222,8 +25264,6 @@ }, "node_modules/mysql2/node_modules/iconv-lite": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "dependencies": { @@ -29239,8 +25279,6 @@ }, "node_modules/mz": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "license": "MIT", "dependencies": { @@ -29251,8 +25289,6 @@ }, "node_modules/named-placeholders": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", - "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", "dev": true, "license": "MIT", "dependencies": { @@ -29264,16 +25300,12 @@ }, "node_modules/nan": { "version": "2.25.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", - "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", "dev": true, "license": "MIT", "optional": true }, "node_modules/nanoid": { "version": "5.1.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.7.tgz", - "integrity": "sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==", "funding": [ { "type": "github", @@ -29290,21 +25322,15 @@ }, "node_modules/napi-build-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "license": "MIT" }, "node_modules/native-duplexpair": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", - "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", "dev": true, "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -29312,14 +25338,10 @@ }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, "license": "MIT", "engines": { @@ -29328,8 +25350,6 @@ }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "license": "MIT", "dependencies": { "lower-case": "^2.0.2", @@ -29338,8 +25358,6 @@ }, "node_modules/nock": { "version": "14.0.11", - "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.11.tgz", - "integrity": "sha512-u5xUnYE+UOOBA6SpELJheMCtj2Laqx15Vl70QxKo43Wz/6nMHXS7PrEioXLjXAwhmawdEMNImwKCcPhBJWbKVw==", "dev": true, "license": "MIT", "dependencies": { @@ -29353,8 +25371,6 @@ }, "node_modules/node-abi": { "version": "3.89.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", - "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -29365,8 +25381,6 @@ }, "node_modules/node-emoji": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", @@ -29380,8 +25394,6 @@ }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -29400,15 +25412,11 @@ }, "node_modules/node-fetch-native": { "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", "dev": true, "license": "MIT" }, "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==", "license": "MIT", "bin": { "node-gyp-build": "bin.js", @@ -29418,14 +25426,10 @@ }, "node_modules/node-releases": { "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "license": "MIT" }, "node_modules/nopt": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "license": "ISC", "dependencies": { "abbrev": "1" @@ -29439,8 +25443,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -29448,8 +25450,6 @@ }, "node_modules/normalize-url": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -29460,8 +25460,6 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -29472,9 +25470,6 @@ }, "node_modules/npmlog": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { "are-we-there-yet": "^2.0.0", @@ -29485,14 +25480,10 @@ }, "node_modules/nprogress": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", "license": "MIT" }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -29503,8 +25494,6 @@ }, "node_modules/null-loader": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -29523,8 +25512,6 @@ }, "node_modules/null-loader/node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -29539,8 +25526,6 @@ }, "node_modules/null-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -29548,14 +25533,10 @@ }, "node_modules/null-loader/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==", "license": "MIT" }, "node_modules/null-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -29572,8 +25553,6 @@ }, "node_modules/nypm": { "version": "0.6.5", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", - "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -29590,15 +25569,11 @@ }, "node_modules/nypm/node_modules/citty": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz", - "integrity": "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==", "dev": true, "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -29606,8 +25581,6 @@ }, "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, "license": "MIT", "engines": { @@ -29616,8 +25589,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -29628,8 +25599,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -29637,8 +25606,6 @@ }, "node_modules/object-treeify": { "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", "license": "MIT", "engines": { "node": ">= 10" @@ -29646,8 +25613,6 @@ }, "node_modules/object.assign": { "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -29666,20 +25631,14 @@ }, "node_modules/obliterator": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", - "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", "license": "MIT" }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT" }, "node_modules/obug": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -29689,15 +25648,11 @@ }, "node_modules/ohash": { "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "dev": true, "license": "MIT" }, "node_modules/on-exit-leak-free": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -29705,8 +25660,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -29717,8 +25670,6 @@ }, "node_modules/on-headers": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -29726,8 +25677,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -29735,8 +25684,6 @@ }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -29750,8 +25697,6 @@ }, "node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", @@ -29767,8 +25712,6 @@ }, "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" @@ -29784,15 +25727,11 @@ }, "node_modules/outvariant": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true, "license": "MIT" }, "node_modules/oxc-parser": { "version": "0.94.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.94.0.tgz", - "integrity": "sha512-refms9HQoAlTYIazONYkuX5A3rFGPddbD6Otyc+A0/pj1WTttR8TsZRlMzQxCfhexxfrbinqd7ebkEoYNuCmLQ==", "license": "MIT", "dependencies": { "@oxc-project/types": "^0.94.0" @@ -29823,8 +25762,6 @@ }, "node_modules/oxc-parser/node_modules/@oxc-project/types": { "version": "0.94.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.94.0.tgz", - "integrity": "sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" @@ -29832,8 +25769,6 @@ }, "node_modules/oxfmt": { "version": "0.43.0", - "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.43.0.tgz", - "integrity": "sha512-KTYNG5ISfHSdmeZ25Xzb3qgz9EmQvkaGAxgBY/p38+ZiAet3uZeu7FnMwcSQJg152Qwl0wnYAxDc+Z/H6cvrwA==", "license": "MIT", "dependencies": { "tinypool": "2.1.0" @@ -29871,8 +25806,6 @@ }, "node_modules/oxfmt/node_modules/tinypool": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", - "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", "license": "MIT", "engines": { "node": "^20.0.0 || >=22.0.0" @@ -29880,8 +25813,6 @@ }, "node_modules/oxlint": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.57.0.tgz", - "integrity": "sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==", "dev": true, "license": "MIT", "bin": { @@ -29925,8 +25856,6 @@ }, "node_modules/oxlint-tsgolint": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.17.4.tgz", - "integrity": "sha512-4F/NXJiK2KnK4LQiULUPXRzVq0LOfextGvwCVRW1VKQbF5epI3MDMEGVAl5XjAGL6IFc7xBc/eVA95wczPeEQg==", "dev": true, "license": "MIT", "bin": { @@ -29943,8 +25872,6 @@ }, "node_modules/p-cancelable": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "license": "MIT", "engines": { "node": ">=12.20" @@ -29952,8 +25879,6 @@ }, "node_modules/p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "license": "MIT", "engines": { "node": ">=4" @@ -29961,8 +25886,6 @@ }, "node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" @@ -29976,8 +25899,6 @@ }, "node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "license": "MIT", "dependencies": { "p-limit": "^4.0.0" @@ -29991,8 +25912,6 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -30006,8 +25925,6 @@ }, "node_modules/p-queue": { "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "license": "MIT", "dependencies": { "eventemitter3": "^4.0.4", @@ -30022,14 +25939,10 @@ }, "node_modules/p-queue/node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, "node_modules/p-retry": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "license": "MIT", "dependencies": { "@types/retry": "0.12.2", @@ -30045,8 +25958,6 @@ }, "node_modules/p-timeout": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "license": "MIT", "dependencies": { "p-finally": "^1.0.0" @@ -30057,8 +25968,6 @@ }, "node_modules/pac-proxy-agent": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", "dev": true, "license": "MIT", "dependencies": { @@ -30077,8 +25986,6 @@ }, "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "license": "MIT", "dependencies": { @@ -30092,8 +25999,6 @@ }, "node_modules/pac-resolver": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, "license": "MIT", "dependencies": { @@ -30106,8 +26011,6 @@ }, "node_modules/package-json": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", "license": "MIT", "dependencies": { "got": "^12.1.0", @@ -30124,15 +26027,11 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/package-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/package-up/-/package-up-5.0.0.tgz", - "integrity": "sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA==", "dev": true, "license": "MIT", "dependencies": { @@ -30147,8 +26046,6 @@ }, "node_modules/param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -30157,8 +26054,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -30169,8 +26064,6 @@ }, "node_modules/parse-entities": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", @@ -30188,14 +26081,10 @@ }, "node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -30212,8 +26101,6 @@ }, "node_modules/parse-ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", "license": "MIT", "engines": { "node": ">=6" @@ -30221,21 +26108,15 @@ }, "node_modules/parse-multipart-data": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/parse-multipart-data/-/parse-multipart-data-1.5.0.tgz", - "integrity": "sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==", "dev": true, "license": "MIT" }, "node_modules/parse-numeric-range": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", "license": "ISC" }, "node_modules/parse-prometheus-text-format": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-prometheus-text-format/-/parse-prometheus-text-format-1.1.1.tgz", - "integrity": "sha512-dBlhYVACjRdSqLMFe4/Q1l/Gd3UmXm8ruvsTi7J6ul3ih45AkzkVpI5XHV4aZ37juGZW5+3dGU5lwk+QLM9XJA==", "license": "Apache-2.0", "dependencies": { "shallow-equal": "^1.2.0" @@ -30243,8 +26124,6 @@ }, "node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -30255,8 +26134,6 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "license": "MIT", "dependencies": { "domhandler": "^5.0.3", @@ -30268,8 +26145,6 @@ }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -30280,8 +26155,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -30289,8 +26162,6 @@ }, "node_modules/pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -30299,14 +26170,10 @@ }, "node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "license": "MIT" }, "node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -30314,8 +26181,6 @@ }, "node_modules/path-expression-matcher": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", "funding": [ { "type": "github", @@ -30329,8 +26194,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -30338,14 +26201,10 @@ }, "node_modules/path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "license": "(WTFPL OR MIT)" }, "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" @@ -30353,14 +26212,10 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-to-regexp": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "license": "MIT", "dependencies": { "isarray": "0.0.1" @@ -30368,8 +26223,6 @@ }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -30377,29 +26230,21 @@ }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/perfect-debounce": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "dev": true, "license": "MIT" }, "node_modules/performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true, "license": "MIT" }, "node_modules/pg": { "version": "8.20.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", - "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", "dependencies": { "pg-connection-string": "^2.12.0", @@ -30425,22 +26270,16 @@ }, "node_modules/pg-cloudflare": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", - "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", - "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", "license": "MIT" }, "node_modules/pg-format": { "name": "pg-format-fix", "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pg-format-fix/-/pg-format-fix-1.0.5.tgz", - "integrity": "sha512-HcXVy9Zk4kn87P0+U9XSxGtenNyknbPB87NreixSBk0lYJy89u+d/zQbS+f/aTTxABQ/B6FH1KdBB5EsGzRS2w==", "license": "MIT", "engines": { "node": ">=4.0" @@ -30448,8 +26287,6 @@ }, "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" @@ -30457,8 +26294,6 @@ }, "node_modules/pg-numeric": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", - "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", "dev": true, "license": "ISC", "engines": { @@ -30467,8 +26302,6 @@ }, "node_modules/pg-pool": { "version": "3.13.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", - "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" @@ -30476,14 +26309,10 @@ }, "node_modules/pg-protocol": { "version": "1.13.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", - "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", "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", @@ -30498,8 +26327,6 @@ }, "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" @@ -30507,14 +26334,10 @@ }, "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.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -30525,8 +26348,6 @@ }, "node_modules/pidusage": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-4.0.1.tgz", - "integrity": "sha512-yCH2dtLHfEBnzlHUJymR/Z1nN2ePG3m392Mv8TFlTP1B0xkpMQNHAnfkY0n2tAi6ceKO6YWhxYfZ96V4vVkh/g==", "license": "MIT", "dependencies": { "safe-buffer": "^5.2.1" @@ -30537,8 +26358,6 @@ }, "node_modules/pidusage/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -30557,8 +26376,6 @@ }, "node_modules/pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "license": "MIT", "engines": { @@ -30567,8 +26384,6 @@ }, "node_modules/pino": { "version": "10.3.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", - "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", "license": "MIT", "dependencies": { "@pinojs/redact": "^0.4.0", @@ -30589,8 +26404,6 @@ }, "node_modules/pino-abstract-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", "license": "MIT", "dependencies": { "split2": "^4.0.0" @@ -30598,14 +26411,10 @@ }, "node_modules/pino-std-serializers": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", - "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "license": "MIT" }, "node_modules/pirates": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { @@ -30614,8 +26423,6 @@ }, "node_modules/pkg-dir": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "license": "MIT", "dependencies": { "find-up": "^6.3.0" @@ -30629,8 +26436,6 @@ }, "node_modules/pkg-types": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, "license": "MIT", "dependencies": { @@ -30641,8 +26446,6 @@ }, "node_modules/pkijs": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", - "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", "license": "BSD-3-Clause", "dependencies": { "@noble/hashes": "1.4.0", @@ -30658,8 +26461,6 @@ }, "node_modules/pkijs/node_modules/@noble/hashes": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "license": "MIT", "engines": { "node": ">= 16" @@ -30670,8 +26471,6 @@ }, "node_modules/playwright": { "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", - "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", "license": "Apache-2.0", "dependencies": { "playwright-core": "1.58.2" @@ -30688,8 +26487,6 @@ }, "node_modules/playwright-core": { "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", - "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -30700,9 +26497,6 @@ }, "node_modules/playwright/node_modules/fsevents": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -30714,8 +26508,6 @@ }, "node_modules/pngjs": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", "dev": true, "license": "MIT", "engines": { @@ -30724,8 +26516,6 @@ }, "node_modules/portfinder": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", - "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", "dev": true, "license": "MIT", "dependencies": { @@ -30738,8 +26528,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -30747,8 +26535,6 @@ }, "node_modules/postcss": { "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "funding": [ { "type": "opencollective", @@ -30775,8 +26561,6 @@ }, "node_modules/postcss-attribute-case-insensitive": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", "dev": true, "license": "MIT", "dependencies": { @@ -30795,8 +26579,6 @@ }, "node_modules/postcss-calc": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11", @@ -30811,8 +26593,6 @@ }, "node_modules/postcss-clamp": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -30826,8 +26606,6 @@ }, "node_modules/postcss-color-functional-notation": { "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -30846,8 +26624,6 @@ }, "node_modules/postcss-color-hex-alpha": { "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", "dev": true, "license": "MIT", "dependencies": { @@ -30866,8 +26642,6 @@ }, "node_modules/postcss-color-rebeccapurple": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -30886,8 +26660,6 @@ }, "node_modules/postcss-colormin": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -30904,8 +26676,6 @@ }, "node_modules/postcss-convert-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -30920,8 +26690,6 @@ }, "node_modules/postcss-custom-media": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", "dev": true, "license": "MIT", "dependencies": { @@ -30940,8 +26708,6 @@ }, "node_modules/postcss-custom-properties": { "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -30960,8 +26726,6 @@ }, "node_modules/postcss-custom-selectors": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", "dev": true, "license": "MIT", "dependencies": { @@ -30980,8 +26744,6 @@ }, "node_modules/postcss-dir-pseudo-class": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31000,8 +26762,6 @@ }, "node_modules/postcss-discard-comments": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -31012,8 +26772,6 @@ }, "node_modules/postcss-discard-duplicates": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -31024,8 +26782,6 @@ }, "node_modules/postcss-discard-empty": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -31036,8 +26792,6 @@ }, "node_modules/postcss-discard-overridden": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -31048,8 +26802,6 @@ }, "node_modules/postcss-discard-unused": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" @@ -31063,8 +26815,6 @@ }, "node_modules/postcss-double-position-gradients": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31084,8 +26834,6 @@ }, "node_modules/postcss-env-function": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31100,8 +26848,6 @@ }, "node_modules/postcss-focus-visible": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31116,8 +26862,6 @@ }, "node_modules/postcss-focus-within": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31132,8 +26876,6 @@ }, "node_modules/postcss-font-variant": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" @@ -31141,8 +26883,6 @@ }, "node_modules/postcss-gap-properties": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", "dev": true, "license": "CC0-1.0", "engines": { @@ -31158,8 +26898,6 @@ }, "node_modules/postcss-image-set-function": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31178,8 +26916,6 @@ }, "node_modules/postcss-import": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "license": "MIT", "dependencies": { @@ -31196,8 +26932,6 @@ }, "node_modules/postcss-initial": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -31206,8 +26940,6 @@ }, "node_modules/postcss-js": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", "dev": true, "funding": [ { @@ -31232,8 +26964,6 @@ }, "node_modules/postcss-lab-function": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31253,8 +26983,6 @@ }, "node_modules/postcss-load-config": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, "funding": [ { @@ -31296,8 +27024,6 @@ }, "node_modules/postcss-loader": { "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", "license": "MIT", "dependencies": { "cosmiconfig": "^8.3.5", @@ -31318,8 +27044,6 @@ }, "node_modules/postcss-logical": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "dev": true, "license": "CC0-1.0", "engines": { @@ -31331,8 +27055,6 @@ }, "node_modules/postcss-media-minmax": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "dev": true, "license": "MIT", "engines": { @@ -31344,8 +27066,6 @@ }, "node_modules/postcss-merge-idents": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", @@ -31360,8 +27080,6 @@ }, "node_modules/postcss-merge-longhand": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", @@ -31376,8 +27094,6 @@ }, "node_modules/postcss-merge-rules": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -31394,8 +27110,6 @@ }, "node_modules/postcss-minify-font-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31409,8 +27123,6 @@ }, "node_modules/postcss-minify-gradients": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "license": "MIT", "dependencies": { "colord": "^2.9.3", @@ -31426,8 +27138,6 @@ }, "node_modules/postcss-minify-params": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -31443,8 +27153,6 @@ }, "node_modules/postcss-minify-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" @@ -31458,8 +27166,6 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -31470,8 +27176,6 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", @@ -31487,8 +27191,6 @@ }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -31500,8 +27202,6 @@ }, "node_modules/postcss-modules-scope": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" @@ -31515,8 +27215,6 @@ }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -31528,8 +27226,6 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" @@ -31543,8 +27239,6 @@ }, "node_modules/postcss-nested": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, "funding": [ { @@ -31569,8 +27263,6 @@ }, "node_modules/postcss-nesting": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31590,8 +27282,6 @@ }, "node_modules/postcss-normalize-charset": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -31602,8 +27292,6 @@ }, "node_modules/postcss-normalize-display-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31617,8 +27305,6 @@ }, "node_modules/postcss-normalize-positions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31632,8 +27318,6 @@ }, "node_modules/postcss-normalize-repeat-style": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31647,8 +27331,6 @@ }, "node_modules/postcss-normalize-string": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31662,8 +27344,6 @@ }, "node_modules/postcss-normalize-timing-functions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31677,8 +27357,6 @@ }, "node_modules/postcss-normalize-unicode": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -31693,8 +27371,6 @@ }, "node_modules/postcss-normalize-url": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31708,8 +27384,6 @@ }, "node_modules/postcss-normalize-whitespace": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31723,8 +27397,6 @@ }, "node_modules/postcss-opacity-percentage": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", "dev": true, "funding": [ { @@ -31746,8 +27418,6 @@ }, "node_modules/postcss-ordered-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", @@ -31762,8 +27432,6 @@ }, "node_modules/postcss-overflow-shorthand": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31782,8 +27450,6 @@ }, "node_modules/postcss-page-break": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "license": "MIT", "peerDependencies": { "postcss": "^8" @@ -31791,8 +27457,6 @@ }, "node_modules/postcss-place": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31811,8 +27475,6 @@ }, "node_modules/postcss-preset-env": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31879,8 +27541,6 @@ }, "node_modules/postcss-pseudo-class-any-link": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -31899,8 +27559,6 @@ }, "node_modules/postcss-reduce-idents": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31914,8 +27572,6 @@ }, "node_modules/postcss-reduce-initial": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -31930,8 +27586,6 @@ }, "node_modules/postcss-reduce-transforms": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -31945,8 +27599,6 @@ }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" @@ -31954,8 +27606,6 @@ }, "node_modules/postcss-selector-not": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", "dev": true, "license": "MIT", "dependencies": { @@ -31974,8 +27624,6 @@ }, "node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -31987,8 +27635,6 @@ }, "node_modules/postcss-sort-media-queries": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", "license": "MIT", "dependencies": { "sort-css-media-queries": "2.2.0" @@ -32002,8 +27648,6 @@ }, "node_modules/postcss-svgo": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", @@ -32018,8 +27662,6 @@ }, "node_modules/postcss-unique-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" @@ -32033,14 +27675,10 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, "node_modules/postcss-zindex": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -32051,8 +27689,6 @@ }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -32069,8 +27705,6 @@ }, "node_modules/postgres": { "version": "3.4.7", - "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", - "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", "license": "Unlicense", "engines": { "node": ">=12" @@ -32082,8 +27716,6 @@ }, "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" @@ -32091,8 +27723,6 @@ }, "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" @@ -32100,8 +27730,6 @@ }, "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" @@ -32109,8 +27737,6 @@ }, "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" @@ -32121,16 +27747,11 @@ }, "node_modules/postgres-range": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", - "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", "dev": true, "license": "MIT" }, "node_modules/prebuild-install": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", @@ -32155,8 +27776,6 @@ }, "node_modules/pretty-error": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "license": "MIT", "dependencies": { "lodash": "^4.17.20", @@ -32165,8 +27784,6 @@ }, "node_modules/pretty-format": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -32180,8 +27797,6 @@ }, "node_modules/pretty-ms": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", "license": "MIT", "dependencies": { "parse-ms": "^2.1.0" @@ -32195,8 +27810,6 @@ }, "node_modules/pretty-time": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", "license": "MIT", "engines": { "node": ">=4" @@ -32204,8 +27817,6 @@ }, "node_modules/prism-react-renderer": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", "license": "MIT", "dependencies": { "@types/prismjs": "^1.26.0", @@ -32217,8 +27828,6 @@ }, "node_modules/prisma": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.5.0.tgz", - "integrity": "sha512-n30qZpWehaYQzigLjmuPisyEsvOzHt7bZeRyg8gZ5DvJo9FGjD+gNaY59Ns3hlLD5/jZH5GBeftIss0jDbUoLg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -32251,8 +27860,6 @@ }, "node_modules/prismjs": { "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", "engines": { "node": ">=6" @@ -32260,8 +27867,6 @@ }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -32269,8 +27874,6 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, "node_modules/process-tracker": { @@ -32279,8 +27882,6 @@ }, "node_modules/process-warning": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", "funding": [ { "type": "github", @@ -32299,8 +27900,6 @@ }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "license": "MIT", "dependencies": { "kleur": "^3.0.3", @@ -32312,8 +27911,6 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -32323,14 +27920,10 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/propagate": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", "dev": true, "license": "MIT", "engines": { @@ -32339,8 +27932,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -32351,8 +27942,6 @@ }, "node_modules/proper-lockfile/node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", "engines": { @@ -32361,8 +27950,6 @@ }, "node_modules/properties-reader": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.3.0.tgz", - "integrity": "sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==", "dev": true, "license": "MIT", "dependencies": { @@ -32378,8 +27965,6 @@ }, "node_modules/property-information": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "license": "MIT", "funding": { "type": "github", @@ -32388,14 +27973,10 @@ }, "node_modules/proto-list": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "license": "ISC" }, "node_modules/protobufjs": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -32418,8 +27999,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -32431,8 +28010,6 @@ }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -32440,8 +28017,6 @@ }, "node_modules/pump": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -32450,8 +28025,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -32459,8 +28032,6 @@ }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "license": "MIT", "engines": { @@ -32469,8 +28040,6 @@ }, "node_modules/pupa": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", - "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" @@ -32484,8 +28053,6 @@ }, "node_modules/pure-rand": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -32501,8 +28068,6 @@ }, "node_modules/pvtsutils": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", "license": "MIT", "dependencies": { "tslib": "^2.8.1" @@ -32510,8 +28075,6 @@ }, "node_modules/pvutils": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", "license": "MIT", "engines": { "node": ">=16.0.0" @@ -32519,8 +28082,6 @@ }, "node_modules/qs": { "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -32534,8 +28095,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -32554,14 +28113,10 @@ }, "node_modules/quick-format-unescaped": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "license": "MIT", "engines": { "node": ">=10" @@ -32572,8 +28127,6 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" @@ -32581,8 +28134,6 @@ }, "node_modules/range-parser": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -32590,8 +28141,6 @@ }, "node_modules/raw-body": { "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -32605,8 +28154,6 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -32614,8 +28161,6 @@ }, "node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -32629,8 +28174,6 @@ }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -32638,8 +28181,6 @@ }, "node_modules/rc9": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", "dev": true, "license": "MIT", "dependencies": { @@ -32649,8 +28190,6 @@ }, "node_modules/react": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -32661,8 +28200,6 @@ }, "node_modules/react-dom": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -32674,8 +28211,6 @@ }, "node_modules/react-dropzone": { "version": "14.4.1", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.4.1.tgz", - "integrity": "sha512-QDuV76v3uKbHiH34SpwifZ+gOLi1+RdsCO1kl5vxMT4wW8R82+sthjvBw4th3NHF/XX6FBsqDYZVNN+pnhaw0g==", "license": "MIT", "dependencies": { "attr-accept": "^2.2.4", @@ -32691,15 +28226,11 @@ }, "node_modules/react-fast-compare": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, "node_modules/react-helmet-async": { "name": "@slorber/react-helmet-async", "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.12.5", @@ -32715,15 +28246,11 @@ }, "node_modules/react-is": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, "license": "MIT" }, "node_modules/react-json-view-lite": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", - "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", "license": "MIT", "engines": { "node": ">=18" @@ -32735,8 +28262,6 @@ "node_modules/react-loadable": { "name": "@docusaurus/react-loadable", "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", "dependencies": { "@types/react": "*" @@ -32747,8 +28272,6 @@ }, "node_modules/react-loadable-ssr-addon-v5-slorber": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.3" @@ -32763,8 +28286,6 @@ }, "node_modules/react-markdown": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", - "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -32790,8 +28311,6 @@ }, "node_modules/react-resizable-panels": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.6.tgz", - "integrity": "sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==", "license": "MIT", "peerDependencies": { "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", @@ -32800,8 +28319,6 @@ }, "node_modules/react-router": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", @@ -32820,8 +28337,6 @@ }, "node_modules/react-router-config": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" @@ -32833,8 +28348,6 @@ }, "node_modules/react-router-dom": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", @@ -32851,14 +28364,10 @@ }, "node_modules/react-router/node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/react-textarea-autosize": { "version": "8.5.9", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", - "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", @@ -32874,8 +28383,6 @@ }, "node_modules/react-toastify": { "version": "10.0.6", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.6.tgz", - "integrity": "sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A==", "license": "MIT", "dependencies": { "clsx": "^2.1.0" @@ -32887,8 +28394,6 @@ }, "node_modules/read-cache": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "license": "MIT", "dependencies": { @@ -32897,8 +28402,6 @@ }, "node_modules/read-tls-client-hello": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-tls-client-hello/-/read-tls-client-hello-1.1.0.tgz", - "integrity": "sha512-htV8ph2jXGCVnKRwW12V1UQdfwC2jPFrDrk8Qh9P+4R/t/Jef/BNmfdX5jsxlcakUMPskwiPZT/enVbjRQqtGQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -32909,8 +28412,6 @@ }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -32923,8 +28424,6 @@ }, "node_modules/readdir-glob": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -32933,15 +28432,11 @@ }, "node_modules/readdir-glob/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/readdir-glob/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -32950,8 +28445,6 @@ }, "node_modules/readdir-glob/node_modules/minimatch": { "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -32963,8 +28456,6 @@ }, "node_modules/readdirp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "license": "MIT", "engines": { "node": ">= 14.18.0" @@ -32976,8 +28467,6 @@ }, "node_modules/real-require": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -32985,8 +28474,6 @@ }, "node_modules/recma-build-jsx": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -33000,8 +28487,6 @@ }, "node_modules/recma-jsx": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", - "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", "license": "MIT", "dependencies": { "acorn-jsx": "^5.0.0", @@ -33020,8 +28505,6 @@ }, "node_modules/recma-parse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -33036,8 +28519,6 @@ }, "node_modules/recma-stringify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -33052,20 +28533,14 @@ }, "node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -33076,15 +28551,11 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/regexparam": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", - "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -33092,8 +28563,6 @@ }, "node_modules/regexpu-core": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", @@ -33109,8 +28578,6 @@ }, "node_modules/registry-auth-token": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", - "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", "license": "MIT", "dependencies": { "@pnpm/npm-conf": "^3.0.2" @@ -33121,8 +28588,6 @@ }, "node_modules/registry-url": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", "license": "MIT", "dependencies": { "rc": "1.2.8" @@ -33136,14 +28601,10 @@ }, "node_modules/regjsgen": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "license": "MIT" }, "node_modules/regjsparser": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.1.0" @@ -33154,8 +28615,6 @@ }, "node_modules/rehype-raw": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -33169,8 +28628,6 @@ }, "node_modules/rehype-recma": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -33184,8 +28641,6 @@ }, "node_modules/rehype-sanitize": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", - "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -33198,8 +28653,6 @@ }, "node_modules/rehype-video": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/rehype-video/-/rehype-video-2.3.1.tgz", - "integrity": "sha512-KnDlv9s2KpsI1B9/HGMpe49GDRpfXjJZhQTiSuvsLlYSSmdUDqAhojdprQLms4d3SmQty4jysSy3abGkX1aQcA==", "dev": true, "license": "MIT", "dependencies": { @@ -33215,8 +28668,6 @@ }, "node_modules/relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -33224,8 +28675,6 @@ }, "node_modules/remark-directive": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", - "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -33240,8 +28689,6 @@ }, "node_modules/remark-emoji": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.2", @@ -33256,8 +28703,6 @@ }, "node_modules/remark-frontmatter": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -33272,8 +28717,6 @@ }, "node_modules/remark-gfm": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -33290,8 +28733,6 @@ }, "node_modules/remark-mdx": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", - "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", @@ -33304,8 +28745,6 @@ }, "node_modules/remark-parse": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -33320,8 +28759,6 @@ }, "node_modules/remark-rehype": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -33337,8 +28774,6 @@ }, "node_modules/remark-stringify": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -33352,8 +28787,6 @@ }, "node_modules/remeda": { "version": "2.33.4", - "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.33.4.tgz", - "integrity": "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==", "dev": true, "license": "MIT", "funding": { @@ -33362,8 +28795,6 @@ }, "node_modules/renderkid": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "license": "MIT", "dependencies": { "css-select": "^4.1.3", @@ -33375,8 +28806,6 @@ }, "node_modules/renderkid/node_modules/css-select": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -33391,8 +28820,6 @@ }, "node_modules/renderkid/node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", @@ -33405,8 +28832,6 @@ }, "node_modules/renderkid/node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" @@ -33420,8 +28845,6 @@ }, "node_modules/renderkid/node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", @@ -33434,8 +28857,6 @@ }, "node_modules/renderkid/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -33443,8 +28864,6 @@ }, "node_modules/renderkid/node_modules/htmlparser2": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -33462,8 +28881,6 @@ }, "node_modules/repeat-string": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "license": "MIT", "engines": { "node": ">=0.10" @@ -33483,8 +28900,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -33492,8 +28907,6 @@ }, "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" @@ -33501,8 +28914,6 @@ }, "node_modules/require-in-the-middle": { "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -33515,22 +28926,16 @@ }, "node_modules/require-like": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", "engines": { "node": "*" } }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, "node_modules/resolve": { "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { "is-core-module": "^2.16.1", @@ -33549,14 +28954,10 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -33564,14 +28965,10 @@ }, "node_modules/resolve-pathname": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", "license": "MIT" }, "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" @@ -33579,8 +28976,6 @@ }, "node_modules/responselike": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" @@ -33594,8 +28989,6 @@ }, "node_modules/ret": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", - "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", "license": "MIT", "engines": { "node": ">=10" @@ -33603,8 +28996,6 @@ }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "engines": { "node": ">= 4" @@ -33612,8 +29003,6 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -33622,15 +29011,10 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -33644,14 +29028,10 @@ }, "node_modules/rimraf/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -33660,9 +29040,6 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -33681,8 +29058,6 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -33693,8 +29068,6 @@ }, "node_modules/rolldown": { "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", - "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -33727,15 +29100,11 @@ }, "node_modules/rolldown/node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", - "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", "dev": true, "license": "MIT" }, "node_modules/rtlcss": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "license": "MIT", "dependencies": { "escalade": "^3.1.1", @@ -33752,8 +29121,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=18" @@ -33764,8 +29131,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -33787,14 +29152,10 @@ }, "node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -33810,8 +29171,6 @@ }, "node_modules/safe-regex2": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.0.tgz", - "integrity": "sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw==", "funding": [ { "type": "github", @@ -33832,8 +29191,6 @@ }, "node_modules/safe-stable-stringify": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", "engines": { "node": ">=10" @@ -33841,14 +29198,10 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sax": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -33856,8 +29209,6 @@ }, "node_modules/scheduler": { "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -33865,14 +29216,10 @@ }, "node_modules/schema-dts": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", "license": "Apache-2.0" }, "node_modules/schema-utils": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -33890,8 +29237,6 @@ }, "node_modules/schema-utils/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -33907,8 +29252,6 @@ }, "node_modules/section-matter": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", @@ -33920,8 +29263,6 @@ }, "node_modules/secure-json-parse": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", - "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", "funding": [ { "type": "github", @@ -33936,14 +29277,10 @@ }, "node_modules/select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT" }, "node_modules/selfsigned": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "license": "MIT", "dependencies": { "@peculiar/x509": "^1.14.2", @@ -33955,8 +29292,6 @@ }, "node_modules/semver": { "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -33967,8 +29302,6 @@ }, "node_modules/semver-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -33982,8 +29315,6 @@ }, "node_modules/send": { "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -34006,8 +29337,6 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -34015,14 +29344,10 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -34030,14 +29355,10 @@ }, "node_modules/seq-queue": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==", "dev": true }, "node_modules/serialize-javascript": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -34045,8 +29366,6 @@ }, "node_modules/seroval": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.1.tgz", - "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", "dev": true, "license": "MIT", "engines": { @@ -34055,8 +29374,6 @@ }, "node_modules/seroval-plugins": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.1.tgz", - "integrity": "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw==", "dev": true, "license": "MIT", "engines": { @@ -34068,8 +29385,6 @@ }, "node_modules/serve-handler": { "version": "6.1.7", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", - "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", "license": "MIT", "dependencies": { "bytes": "3.0.0", @@ -34083,14 +29398,10 @@ }, "node_modules/serve-handler/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/serve-handler/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -34099,8 +29410,6 @@ }, "node_modules/serve-handler/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -34111,14 +29420,10 @@ }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", "license": "MIT" }, "node_modules/serve-index": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -34139,8 +29444,6 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -34148,8 +29451,6 @@ }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -34157,8 +29458,6 @@ }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "license": "MIT", "dependencies": { "depd": "~1.1.2", @@ -34173,8 +29472,6 @@ }, "node_modules/serve-index/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -34182,8 +29479,6 @@ }, "node_modules/serve-index/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -34194,14 +29489,10 @@ }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -34209,8 +29500,6 @@ }, "node_modules/serve-static": { "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", @@ -34224,20 +29513,14 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "license": "ISC" }, "node_modules/set-cookie-parser": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -34253,14 +29536,10 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "license": "MIT", "dependencies": { "kind-of": "^6.0.2" @@ -34271,14 +29550,10 @@ }, "node_modules/shallow-equal": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", "license": "MIT" }, "node_modules/shallowequal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", "license": "MIT" }, "node_modules/shared": { @@ -34287,8 +29562,6 @@ }, "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" @@ -34299,8 +29572,6 @@ }, "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" @@ -34308,8 +29579,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -34320,8 +29589,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -34339,8 +29606,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -34355,8 +29620,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -34373,8 +29636,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -34392,21 +29653,15 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/simple-concat": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "funding": [ { "type": "github", @@ -34425,8 +29680,6 @@ }, "node_modules/simple-get": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "funding": [ { "type": "github", @@ -34450,8 +29703,6 @@ }, "node_modules/simple-oauth2": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/simple-oauth2/-/simple-oauth2-5.1.0.tgz", - "integrity": "sha512-gWDa38Ccm4MwlG5U7AlcJxPv3lvr80dU7ARJWrGdgvOKyzSj1gr3GBPN1rABTedAYvC/LsGYoFuFxwDBPtGEbw==", "license": "Apache-2.0", "dependencies": { "@hapi/hoek": "^11.0.4", @@ -34462,14 +29713,10 @@ }, "node_modules/simple-oauth2/node_modules/@hapi/hoek": { "version": "11.0.7", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", - "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", "license": "BSD-3-Clause" }, "node_modules/sirv": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, "license": "MIT", "dependencies": { @@ -34483,14 +29730,10 @@ }, "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/sitemap": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", - "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", "license": "MIT", "dependencies": { "@types/node": "^17.0.5", @@ -34508,14 +29751,10 @@ }, "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", "license": "MIT" }, "node_modules/skin-tone": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "license": "MIT", "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" @@ -34526,8 +29765,6 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "license": "MIT", "engines": { "node": ">=8" @@ -34535,8 +29772,6 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", "engines": { @@ -34546,8 +29781,6 @@ }, "node_modules/snake-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -34556,8 +29789,6 @@ }, "node_modules/sockjs": { "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", @@ -34567,8 +29798,6 @@ }, "node_modules/socks": { "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "dev": true, "license": "MIT", "dependencies": { @@ -34582,8 +29811,6 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "license": "MIT", "dependencies": { @@ -34597,8 +29824,6 @@ }, "node_modules/socks-proxy-agent/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -34610,8 +29835,6 @@ }, "node_modules/solid-js": { "version": "1.9.11", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.11.tgz", - "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -34622,8 +29845,6 @@ }, "node_modules/solid-refresh": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz", - "integrity": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==", "dev": true, "license": "MIT", "dependencies": { @@ -34637,8 +29858,6 @@ }, "node_modules/sonic-boom": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", - "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" @@ -34646,8 +29865,6 @@ }, "node_modules/sort-css-media-queries": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", "license": "MIT", "engines": { "node": ">= 6.3.0" @@ -34655,8 +29872,6 @@ }, "node_modules/source-map": { "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -34664,8 +29879,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -34673,8 +29886,6 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -34683,8 +29894,6 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -34692,8 +29901,6 @@ }, "node_modules/space-separated-tokens": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "license": "MIT", "funding": { "type": "github", @@ -34702,8 +29909,6 @@ }, "node_modules/spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "dependencies": { "debug": "^4.1.0", @@ -34718,8 +29923,6 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "dependencies": { "debug": "^4.1.0", @@ -34732,15 +29935,11 @@ }, "node_modules/split-ca": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", "dev": true, "license": "ISC" }, "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" @@ -34748,8 +29947,6 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/sqlite-io-yield-simulator": { @@ -34758,8 +29955,6 @@ }, "node_modules/sqlstring": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", "dev": true, "license": "MIT", "engines": { @@ -34768,8 +29963,6 @@ }, "node_modules/srcset": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", "license": "MIT", "engines": { "node": ">=12" @@ -34780,8 +29973,6 @@ }, "node_modules/ssh-remote-port-forward": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ssh-remote-port-forward/-/ssh-remote-port-forward-1.0.4.tgz", - "integrity": "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -34791,8 +29982,6 @@ }, "node_modules/ssh-remote-port-forward/node_modules/@types/ssh2": { "version": "0.5.52", - "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", - "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", "dev": true, "license": "MIT", "dependencies": { @@ -34802,8 +29991,6 @@ }, "node_modules/ssh2": { "version": "1.17.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz", - "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -34820,21 +30007,15 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/state-local": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -34842,21 +30023,15 @@ }, "node_modules/std-env": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", - "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", "dev": true, "license": "MIT" }, "node_modules/stream-shift": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "license": "MIT" }, "node_modules/streamx": { "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, "license": "MIT", "dependencies": { @@ -34867,15 +30042,11 @@ }, "node_modules/strict-event-emitter": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true, "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -34883,8 +30054,6 @@ }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -34903,8 +30072,6 @@ }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", "engines": { @@ -34913,8 +30080,6 @@ }, "node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -34931,8 +30096,6 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -34946,15 +30109,11 @@ }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -34965,8 +30124,6 @@ }, "node_modules/string-width/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" @@ -34980,8 +30137,6 @@ }, "node_modules/stringify-entities": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", @@ -34994,8 +30149,6 @@ }, "node_modules/stringify-object": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", @@ -35008,8 +30161,6 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -35021,8 +30172,6 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -35034,8 +30183,6 @@ }, "node_modules/strip-bom-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -35043,8 +30190,6 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "license": "MIT", "engines": { "node": ">=6" @@ -35052,8 +30197,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "license": "MIT", "engines": { "node": ">=8" @@ -35064,8 +30207,6 @@ }, "node_modules/strnum": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", "funding": [ { "type": "github", @@ -35076,8 +30217,6 @@ }, "node_modules/style-to-js": { "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", "license": "MIT", "dependencies": { "style-to-object": "1.0.14" @@ -35085,8 +30224,6 @@ }, "node_modules/style-to-object": { "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", "license": "MIT", "dependencies": { "inline-style-parser": "0.2.7" @@ -35094,8 +30231,6 @@ }, "node_modules/stylehacks": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -35110,8 +30245,6 @@ }, "node_modules/sucrase": { "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "dev": true, "license": "MIT", "dependencies": { @@ -35133,8 +30266,6 @@ }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "license": "MIT", "engines": { @@ -35143,8 +30274,6 @@ }, "node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -35158,8 +30287,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -35170,14 +30297,10 @@ }, "node_modules/svg-parser": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "license": "MIT" }, "node_modules/svgo": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", - "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", "license": "MIT", "dependencies": { "commander": "^7.2.0", @@ -35201,8 +30324,6 @@ }, "node_modules/svgo/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", "engines": { "node": ">= 10" @@ -35210,8 +30331,6 @@ }, "node_modules/symbol-observable": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true, "license": "MIT", "engines": { @@ -35220,8 +30339,6 @@ }, "node_modules/syncpack": { "version": "14.2.1", - "resolved": "https://registry.npmjs.org/syncpack/-/syncpack-14.2.1.tgz", - "integrity": "sha512-9CE0+MCThNPt0/yXD5cFaJQw2jxslaB3Ck1ASeP9uFji+lE3KWmfGRBzy8x5sjhygUz6Vt+a84w+ycIzATQicA==", "dev": true, "license": "MIT", "bin": { @@ -35246,8 +30363,6 @@ }, "node_modules/syncpack-darwin-arm64": { "version": "14.2.1", - "resolved": "https://registry.npmjs.org/syncpack-darwin-arm64/-/syncpack-darwin-arm64-14.2.1.tgz", - "integrity": "sha512-SGrC163UWiL68TRo8rmPQFgbT83ieT7zQ1GKyoPZ3TAGNQ+6a/3GMXlZQ+HKV3ydVyB2t60H5CsQFlz13QHTqA==", "cpu": [ "arm64" ], @@ -35382,14 +30497,10 @@ }, "node_modules/tabbable": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT" }, "node_modules/table-layout": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", - "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "license": "MIT", "dependencies": { "array-back": "^6.2.2", @@ -35401,8 +30512,6 @@ }, "node_modules/tailwindcss": { "version": "3.4.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", - "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -35439,8 +30548,6 @@ }, "node_modules/tailwindcss/node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -35464,8 +30571,6 @@ }, "node_modules/tailwindcss/node_modules/chokidar/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": { @@ -35477,8 +30582,6 @@ }, "node_modules/tailwindcss/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -35490,8 +30593,6 @@ }, "node_modules/tailwindcss/node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -35503,8 +30604,6 @@ }, "node_modules/tapable": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "license": "MIT", "engines": { "node": ">=6" @@ -35516,9 +30615,6 @@ }, "node_modules/tar": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -35534,8 +30630,6 @@ }, "node_modules/tar-fs": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "license": "MIT", "dependencies": { "chownr": "^1.1.1", @@ -35546,8 +30640,6 @@ }, "node_modules/tar-stream": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "license": "MIT", "dependencies": { "bl": "^4.0.3", @@ -35562,8 +30654,6 @@ }, "node_modules/tar/node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", "engines": { "node": ">=10" @@ -35571,8 +30661,6 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", "engines": { "node": ">=8" @@ -35580,14 +30668,10 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/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": { @@ -35596,8 +30680,6 @@ }, "node_modules/terser": { "version": "5.46.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", - "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -35614,8 +30696,6 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", - "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -35647,8 +30727,6 @@ }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -35661,14 +30739,10 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/testcontainers": { "version": "10.28.0", - "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.28.0.tgz", - "integrity": "sha512-1fKrRRCsgAQNkarjHCMKzBKXSJFmzNTiTbhb5E/j5hflRXChEtHvkefjaHlgkNUjfw92/Dq8LTgwQn6RDBFbMg==", "dev": true, "license": "MIT", "dependencies": { @@ -35691,8 +30765,6 @@ }, "node_modules/testcontainers/node_modules/b4a": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -35706,8 +30778,6 @@ }, "node_modules/testcontainers/node_modules/tar-fs": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", - "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", "dev": true, "license": "MIT", "dependencies": { @@ -35721,8 +30791,6 @@ }, "node_modules/testcontainers/node_modules/tar-stream": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", - "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -35734,8 +30802,6 @@ }, "node_modules/testcontainers/node_modules/undici": { "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", "dev": true, "license": "MIT", "dependencies": { @@ -35747,8 +30813,6 @@ }, "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": { @@ -35757,8 +30821,6 @@ }, "node_modules/text-decoder/node_modules/b4a": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -35772,8 +30834,6 @@ }, "node_modules/thenify": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "license": "MIT", "dependencies": { @@ -35782,8 +30842,6 @@ }, "node_modules/thenify-all": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "license": "MIT", "dependencies": { @@ -35795,8 +30853,6 @@ }, "node_modules/thingies": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", - "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", "license": "MIT", "engines": { "node": ">=10.18" @@ -35811,8 +30867,6 @@ }, "node_modules/thread-stream": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", - "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", "license": "MIT", "dependencies": { "real-require": "^0.2.0" @@ -35823,14 +30877,10 @@ }, "node_modules/thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "license": "MIT" }, "node_modules/time-span": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", - "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", "license": "MIT", "dependencies": { "convert-hrtime": "^3.0.0" @@ -35844,27 +30894,19 @@ }, "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==", "license": "MIT" }, "node_modules/tiny-warning": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", - "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true, "license": "MIT", "engines": { @@ -35873,8 +30915,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -35889,8 +30929,6 @@ }, "node_modules/tinypool": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" @@ -35898,8 +30936,6 @@ }, "node_modules/tinyrainbow": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -35908,8 +30944,6 @@ }, "node_modules/tmp": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "dev": true, "license": "MIT", "engines": { @@ -35918,8 +30952,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -35930,8 +30962,6 @@ }, "node_modules/toad-cache": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", - "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", "license": "MIT", "engines": { "node": ">=12" @@ -35939,8 +30969,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -35948,8 +30976,6 @@ }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "license": "MIT", "engines": { "node": ">=6" @@ -35957,14 +30983,10 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/tree-dump": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -35979,8 +31001,6 @@ }, "node_modules/trim-lines": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "license": "MIT", "funding": { "type": "github", @@ -35989,8 +31009,6 @@ }, "node_modules/trough": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "license": "MIT", "funding": { "type": "github", @@ -35999,15 +31017,11 @@ }, "node_modules/ts-interface-checker": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true, "license": "Apache-2.0" }, "node_modules/ts-morph": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", - "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", "license": "MIT", "dependencies": { "@ts-morph/common": "~0.11.0", @@ -36016,8 +31030,6 @@ }, "node_modules/ts-node": { "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -36059,14 +31071,10 @@ }, "node_modules/ts-node/node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "license": "MIT" }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -36074,8 +31082,6 @@ }, "node_modules/ts-toolbelt": { "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", "license": "Apache-2.0" }, "node_modules/tslib": { @@ -36086,8 +31092,6 @@ }, "node_modules/tsx": { "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", "dependencies": { "esbuild": "~0.27.0", @@ -36105,8 +31109,6 @@ }, "node_modules/tsyringe": { "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", "license": "MIT", "dependencies": { "tslib": "^1.9.3" @@ -36117,14 +31119,10 @@ }, "node_modules/tsyringe/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -36135,8 +31133,6 @@ }, "node_modules/turbo": { "version": "2.8.17", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.8.17.tgz", - "integrity": "sha512-YwPsNSqU2f/RXU/+Kcb7cPkPZARxom4+me7LKEdN5jsvy2tpfze3zDZ4EiGrJnvOm9Avu9rK0aaYsP7qZ3iz7A==", "dev": true, "license": "MIT", "bin": { @@ -36167,8 +31163,6 @@ }, "node_modules/turbo-darwin-arm64": { "version": "2.8.17", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.8.17.tgz", - "integrity": "sha512-5DXqhQUt24ycEryXDfMNKEkW5TBHs+QmU23a2qxXwwFDaJsWcPo2obEhBxxdEPOv7qmotjad+09RGeWCcJ9JDw==", "cpu": [ "arm64" ], @@ -36237,15 +31231,11 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true, "license": "Unlicense" }, "node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" @@ -36256,8 +31246,6 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -36269,8 +31257,6 @@ }, "node_modules/type-is/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -36278,8 +31264,6 @@ }, "node_modules/type-is/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -36290,8 +31274,6 @@ }, "node_modules/typed-error": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/typed-error/-/typed-error-3.2.3.tgz", - "integrity": "sha512-xmXIbAyEOYeRg11jY3AzjyB9clkxVfzBlHs3JgD3N6vPMMVBX+xNtQft4pKb1oM9lASdTISA+pOj1EejFr2SgQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -36301,8 +31283,6 @@ }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" @@ -36310,8 +31290,6 @@ }, "node_modules/typedoc": { "version": "0.28.17", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", - "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -36334,8 +31312,6 @@ }, "node_modules/typedoc-docusaurus-theme": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/typedoc-docusaurus-theme/-/typedoc-docusaurus-theme-1.4.2.tgz", - "integrity": "sha512-i9YYDcScLD0WUiX8I+LXHX3ZVvRDlJsmRo9l/uWrFT37cHlMz4Ay0GOnWzHUBnnwAo1uzYOw9RjUXznbWozBEA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -36344,8 +31320,6 @@ }, "node_modules/typedoc-plugin-markdown": { "version": "4.10.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.10.0.tgz", - "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", "dev": true, "license": "MIT", "engines": { @@ -36357,15 +31331,11 @@ }, "node_modules/typedoc/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/typedoc/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -36374,8 +31344,6 @@ }, "node_modules/typedoc/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { @@ -36390,9 +31358,8 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -36403,8 +31370,6 @@ }, "node_modules/typical": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", - "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", "license": "MIT", "engines": { "node": ">=12.17" @@ -36412,15 +31377,11 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, "node_modules/undici": { "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" @@ -36431,14 +31392,10 @@ }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "license": "MIT", "engines": { "node": ">=4" @@ -36446,8 +31403,6 @@ }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "license": "MIT", "engines": { "node": ">=4" @@ -36455,8 +31410,6 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", @@ -36468,8 +31421,6 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "license": "MIT", "engines": { "node": ">=4" @@ -36477,8 +31428,6 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "license": "MIT", "engines": { "node": ">=4" @@ -36486,8 +31435,6 @@ }, "node_modules/unified": { "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -36505,8 +31452,6 @@ }, "node_modules/unique-string": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" @@ -36520,8 +31465,6 @@ }, "node_modules/unist-util-is": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -36533,8 +31476,6 @@ }, "node_modules/unist-util-position": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -36546,8 +31487,6 @@ }, "node_modules/unist-util-position-from-estree": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -36559,8 +31498,6 @@ }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -36572,8 +31509,6 @@ }, "node_modules/unist-util-visit": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -36587,8 +31522,6 @@ }, "node_modules/unist-util-visit-parents": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -36601,14 +31534,10 @@ }, "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/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -36616,8 +31545,6 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -36625,8 +31552,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -36655,8 +31580,6 @@ }, "node_modules/update-notifier": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", "license": "BSD-2-Clause", "dependencies": { "boxen": "^7.0.0", @@ -36683,8 +31606,6 @@ }, "node_modules/update-notifier/node_modules/boxen": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", @@ -36705,8 +31626,6 @@ }, "node_modules/update-notifier/node_modules/camelcase": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "license": "MIT", "engines": { "node": ">=14.16" @@ -36717,8 +31636,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -36726,8 +31643,6 @@ }, "node_modules/url-loader": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -36753,8 +31668,6 @@ }, "node_modules/url-loader/node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -36769,8 +31682,6 @@ }, "node_modules/url-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -36778,14 +31689,10 @@ }, "node_modules/url-loader/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==", "license": "MIT" }, "node_modules/url-loader/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -36793,8 +31700,6 @@ }, "node_modules/url-loader/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -36805,8 +31710,6 @@ }, "node_modules/url-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -36823,8 +31726,6 @@ }, "node_modules/url-pattern": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/url-pattern/-/url-pattern-1.0.3.tgz", - "integrity": "sha512-uQcEj/2puA4aq1R3A2+VNVBgaWYR24FdWjl7VNW83rnWftlhyzOZ/tBjezRiC2UkIzuxC8Top3IekN3vUf1WxA==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -36832,14 +31733,10 @@ }, "node_modules/urlpattern-polyfill": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", - "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", "license": "MIT" }, "node_modules/use-composed-ref": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", - "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -36852,8 +31749,6 @@ }, "node_modules/use-debounce": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.1.0.tgz", - "integrity": "sha512-lu87Za35V3n/MyMoEpD5zJv0k7hCn0p+V/fK2kWD+3k2u3kOCwO593UArbczg1fhfs2rqPEnHpULJ3KmGdDzvg==", "license": "MIT", "engines": { "node": ">= 16.0.0" @@ -36864,8 +31759,6 @@ }, "node_modules/use-isomorphic-layout-effect": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", - "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -36878,8 +31771,6 @@ }, "node_modules/use-latest": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", - "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", "license": "MIT", "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" @@ -36895,8 +31786,6 @@ }, "node_modules/use-sync-external-store": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -36904,8 +31793,6 @@ }, "node_modules/usehooks-ts": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-3.1.1.tgz", - "integrity": "sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA==", "license": "MIT", "dependencies": { "lodash.debounce": "^4.0.8" @@ -36919,8 +31806,6 @@ }, "node_modules/util": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -36932,20 +31817,14 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "license": "MIT" }, "node_modules/utility-types": { "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", "license": "MIT", "engines": { "node": ">= 4" @@ -36953,8 +31832,6 @@ }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -36962,8 +31839,6 @@ }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -36971,14 +31846,10 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "license": "MIT" }, "node_modules/valibot": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz", - "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -36992,14 +31863,10 @@ }, "node_modules/value-equal": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", "license": "MIT" }, "node_modules/value-or-promise": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", - "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==", "dev": true, "license": "MIT", "engines": { @@ -37008,8 +31875,6 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -37021,8 +31886,6 @@ }, "node_modules/vfile": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -37035,8 +31898,6 @@ }, "node_modules/vfile-location": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -37049,8 +31910,6 @@ }, "node_modules/vfile-message": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -37063,8 +31922,6 @@ }, "node_modules/vite": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", - "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -37142,8 +31999,6 @@ }, "node_modules/vite-bundle-analyzer": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-1.3.6.tgz", - "integrity": "sha512-elFXkF9oGy4CJEeOdP1DSEHRDKWfmaEDfT9/GuF4jmyfmUF6nC//iN+ythqMEVvrtchOEHGKLumZwnu1NjoI0w==", "dev": true, "license": "MIT", "bin": { @@ -37152,8 +32007,6 @@ }, "node_modules/vite-plugin-solid": { "version": "2.11.11", - "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.11.tgz", - "integrity": "sha512-YMZCXsLw9kyuvQFEdwLP27fuTQJLmjNoHy90AOJnbRuJ6DwShUxKFo38gdFrWn9v11hnGicKCZEaeI/TFs6JKw==", "dev": true, "license": "MIT", "dependencies": { @@ -37177,8 +32030,6 @@ }, "node_modules/vite-plugin-svgr": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.5.0.tgz", - "integrity": "sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==", "dev": true, "license": "MIT", "dependencies": { @@ -37192,8 +32043,6 @@ }, "node_modules/vitefu": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", - "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", "dev": true, "license": "MIT", "workspaces": [ @@ -37212,8 +32061,6 @@ }, "node_modules/vitest": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", - "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, "license": "MIT", "dependencies": { @@ -37294,8 +32141,6 @@ }, "node_modules/watchpack": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -37307,8 +32152,6 @@ }, "node_modules/wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" @@ -37316,8 +32159,6 @@ }, "node_modules/web-namespaces": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "license": "MIT", "funding": { "type": "github", @@ -37326,14 +32167,10 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/webpack": { "version": "5.105.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", - "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -37380,8 +32217,6 @@ }, "node_modules/webpack-bundle-analyzer": { "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", @@ -37406,8 +32241,6 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", "engines": { "node": ">= 10" @@ -37415,8 +32248,6 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/sirv": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", @@ -37429,8 +32260,6 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", "engines": { "node": ">=8.3.0" @@ -37450,8 +32279,6 @@ }, "node_modules/webpack-dev-middleware": { "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "license": "MIT", "dependencies": { "colorette": "^2.0.10", @@ -37479,8 +32306,6 @@ }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -37488,8 +32313,6 @@ }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -37504,8 +32327,6 @@ }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -37513,8 +32334,6 @@ }, "node_modules/webpack-dev-server": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", - "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", @@ -37570,8 +32389,6 @@ }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -37594,8 +32411,6 @@ }, "node_modules/webpack-dev-server/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==", "license": "MIT", "engines": { "node": ">=12" @@ -37606,8 +32421,6 @@ }, "node_modules/webpack-dev-server/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -37618,8 +32431,6 @@ }, "node_modules/webpack-dev-server/node_modules/open": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "license": "MIT", "dependencies": { "default-browser": "^5.2.1", @@ -37636,8 +32447,6 @@ }, "node_modules/webpack-dev-server/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -37648,8 +32457,6 @@ }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -37660,8 +32467,6 @@ }, "node_modules/webpack-merge": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -37674,8 +32479,6 @@ }, "node_modules/webpack-sources": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", - "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -37683,8 +32486,6 @@ }, "node_modules/webpack/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -37692,8 +32493,6 @@ }, "node_modules/webpack/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -37704,8 +32503,6 @@ }, "node_modules/webpackbar": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", @@ -37726,8 +32523,6 @@ }, "node_modules/webpackbar/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -37741,8 +32536,6 @@ }, "node_modules/webpackbar/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -37757,14 +32550,10 @@ }, "node_modules/webpackbar/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/webpackbar/node_modules/markdown-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", "license": "MIT", "dependencies": { "repeat-string": "^1.0.0" @@ -37776,14 +32565,10 @@ }, "node_modules/webpackbar/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/webpackbar/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -37796,8 +32581,6 @@ }, "node_modules/webpackbar/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -37808,8 +32591,6 @@ }, "node_modules/webpackbar/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -37825,8 +32606,6 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", @@ -37839,8 +32618,6 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "license": "Apache-2.0", "engines": { "node": ">=0.8.0" @@ -37848,8 +32625,6 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -37858,8 +32633,6 @@ }, "node_modules/which": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -37873,8 +32646,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -37894,8 +32665,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -37911,8 +32680,6 @@ }, "node_modules/wide-align": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" @@ -37920,14 +32687,10 @@ }, "node_modules/wide-align/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/wide-align/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -37940,8 +32703,6 @@ }, "node_modules/widest-line": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "license": "MIT", "dependencies": { "string-width": "^5.0.1" @@ -37955,14 +32716,10 @@ }, "node_modules/wildcard": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" }, "node_modules/wordwrapjs": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", - "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", "license": "MIT", "engines": { "node": ">=12.17" @@ -37970,8 +32727,6 @@ }, "node_modules/wouter": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.9.0.tgz", - "integrity": "sha512-sF/od/PIgqEQBQcrN7a2x3MX6MQE6nW0ygCfy9hQuUkuB28wEZuu/6M5GyqkrrEu9M6jxdkgE12yDFsQMKos4Q==", "license": "Unlicense", "dependencies": { "mitt": "^3.0.1", @@ -37984,8 +32739,6 @@ }, "node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -38002,8 +32755,6 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -38020,8 +32771,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -38036,15 +32785,11 @@ }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -38058,8 +32803,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -38070,8 +32813,6 @@ }, "node_modules/wrap-ansi/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" @@ -38082,8 +32823,6 @@ }, "node_modules/wrap-ansi/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" @@ -38097,14 +32836,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -38115,8 +32850,6 @@ }, "node_modules/ws": { "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -38136,8 +32869,6 @@ }, "node_modules/wsl-utils": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", "license": "MIT", "dependencies": { "is-wsl": "^3.1.0" @@ -38151,8 +32882,6 @@ }, "node_modules/wsl-utils/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==", "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -38166,8 +32895,6 @@ }, "node_modules/xbytes": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/xbytes/-/xbytes-1.9.1.tgz", - "integrity": "sha512-29E0ygMFWrM5JW2W1ypmezjyR2FOS5aCszdLe620ymSJBoZzL0/RCLJKCoUFu3DfQGhZ/FWykEBp5dfEy6+hjA==", "license": "Apache-2.0", "engines": { "node": ">=1" @@ -38175,8 +32902,6 @@ }, "node_modules/xdg-basedir": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "license": "MIT", "engines": { "node": ">=12" @@ -38187,8 +32912,6 @@ }, "node_modules/xml-js": { "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", "license": "MIT", "dependencies": { "sax": "^1.2.4" @@ -38199,8 +32922,6 @@ }, "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" @@ -38208,8 +32929,6 @@ }, "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" @@ -38217,14 +32936,10 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "devOptional": true, "license": "ISC", "bin": { @@ -38239,8 +32954,6 @@ }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -38257,8 +32970,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { "node": ">=12" @@ -38266,14 +32977,10 @@ }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -38286,8 +32993,6 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "license": "MIT", "engines": { "node": ">=6" @@ -38295,8 +33000,6 @@ }, "node_modules/yocto-queue": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" @@ -38315,8 +33018,6 @@ }, "node_modules/zeptomatch": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.1.0.tgz", - "integrity": "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==", "dev": true, "license": "MIT", "dependencies": { @@ -38366,8 +33067,6 @@ }, "node_modules/zip-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "dev": true, "license": "MIT", "dependencies": { @@ -38381,8 +33080,6 @@ }, "node_modules/zip-stream/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -38406,8 +33103,6 @@ }, "node_modules/zip-stream/node_modules/readable-stream": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "license": "MIT", "dependencies": { @@ -38423,8 +33118,6 @@ }, "node_modules/zod": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -38456,15 +33149,11 @@ }, "node_modules/zstd-codec": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.5.tgz", - "integrity": "sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==", "dev": true, "license": "MIT" }, "node_modules/zustand": { "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", "license": "MIT", "dependencies": { "use-sync-external-store": "^1.2.2" @@ -38491,8 +33180,6 @@ }, "node_modules/zwitch": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "license": "MIT", "funding": { "type": "github", @@ -38541,10 +33228,24 @@ "@vitest/runner": "4.1.2", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" } }, + "packages/datadog/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/otel": { "version": "0.0.0", "dependencies": { @@ -38580,7 +33281,7 @@ "oxfmt": "^0.43.0", "playwright": "^1.53.2", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" }, "peerDependencies": { @@ -38621,12 +33322,26 @@ "replicache": "15.2.1", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", - "typescript": "~5.9.3" + "typescript": "~6.0.2" }, "engines": { "node": ">=22" } }, + "packages/replicache-doc/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/replicache-perf": { "dependencies": { "@types/command-line-args": "^5.2.3", @@ -38641,7 +33356,7 @@ "replicache": "15.2.1", "shared": "0.0.0", "tsx": "^4.21.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vite": "8.0.3", "xbytes": "^1.7.0" }, @@ -38651,8 +33366,6 @@ }, "packages/replicache-perf/node_modules/@oxc-project/types": { "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" @@ -38676,8 +33389,6 @@ }, "packages/replicache-perf/node_modules/@rolldown/binding-darwin-arm64": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", "cpu": [ "arm64" ], @@ -38745,6 +33456,9 @@ "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -38761,6 +33475,9 @@ "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -38777,6 +33494,9 @@ "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -38793,6 +33513,9 @@ "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -38809,6 +33532,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -38825,6 +33551,9 @@ "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -38900,14 +33629,10 @@ }, "packages/replicache-perf/node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", - "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", "license": "MIT" }, "packages/replicache-perf/node_modules/rolldown": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", - "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "license": "MIT", "dependencies": { "@oxc-project/types": "=0.122.0", @@ -38937,10 +33662,21 @@ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" } }, + "packages/replicache-perf/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/replicache-perf/node_modules/vite": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", @@ -39016,8 +33752,6 @@ }, "packages/replicache/node_modules/@op-engineering/op-sqlite": { "version": "15.2.7", - "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.2.7.tgz", - "integrity": "sha512-rXpzEt6FL0syAHa2QqBaB7DhhXwxEOs05cTIhv0RI+iur66XcuM73SpUSD8gnh8opHJu+Hw6Nu3IM4EDWxEdng==", "dev": true, "license": "MIT", "workspaces": [ @@ -39031,8 +33765,6 @@ }, "packages/replicache/node_modules/expo-sqlite": { "version": "55.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-55.0.10.tgz", - "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -39044,6 +33776,20 @@ "react-native": "*" } }, + "packages/replicache/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/shared": { "version": "0.0.0", "dependencies": { @@ -39069,14 +33815,12 @@ "package-up": "^5.0.0", "playwright": "^1.53.2", "type-fest": "^4.30.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" } }, "packages/shared/node_modules/type-fest": { "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -39086,6 +33830,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/shared/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/z2s": { "version": "0.0.0", "dependencies": { @@ -39184,7 +33942,7 @@ "syncpack": "^14.2.1", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vite": "8.0.3", "vitest": "4.1.2", "zero-cache": "0.0.0", @@ -39270,13 +34028,27 @@ "otel": "0.0.0", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zql": "0.0.0" } }, + "packages/zero-cache/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/zero-client": { "version": "0.0.0", "dependencies": { @@ -39292,13 +34064,27 @@ "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zero-types": "0.0.0", "zql": "0.0.0" } }, + "packages/zero-client/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/zero-events": { "name": "@rocicorp/zero-events", "version": "0.0.4", @@ -39306,7 +34092,21 @@ "devDependencies": { "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3" + "typescript": "~6.0.2" + } + }, + "packages/zero-events/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, "packages/zero-pg": { @@ -39330,10 +34130,24 @@ "devDependencies": { "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-types": "0.0.0" } }, + "packages/zero-protocol/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/zero-react": { "version": "0.0.0", "devDependencies": { @@ -39416,14 +34230,26 @@ "devDependencies": { "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" } }, + "packages/zero-types/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/zero/node_modules/@op-engineering/op-sqlite": { "version": "15.2.7", - "resolved": "https://registry.npmjs.org/@op-engineering/op-sqlite/-/op-sqlite-15.2.7.tgz", - "integrity": "sha512-rXpzEt6FL0syAHa2QqBaB7DhhXwxEOs05cTIhv0RI+iur66XcuM73SpUSD8gnh8opHJu+Hw6Nu3IM4EDWxEdng==", "dev": true, "license": "MIT", "workspaces": [ @@ -39437,8 +34263,6 @@ }, "packages/zero/node_modules/@oxc-project/types": { "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "dev": true, "license": "MIT", "funding": { @@ -39464,8 +34288,6 @@ }, "packages/zero/node_modules/@rolldown/binding-darwin-arm64": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", "cpu": [ "arm64" ], @@ -39538,6 +34360,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -39555,6 +34380,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -39572,6 +34400,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -39589,6 +34420,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -39606,6 +34440,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -39623,6 +34460,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -39702,15 +34542,11 @@ }, "packages/zero/node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", - "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", "dev": true, "license": "MIT" }, "packages/zero/node_modules/expo-sqlite": { "version": "55.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-55.0.10.tgz", - "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -39724,8 +34560,6 @@ }, "packages/zero/node_modules/rolldown": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", - "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dev": true, "license": "MIT", "dependencies": { @@ -39756,10 +34590,22 @@ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" } }, + "packages/zero/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/zero/node_modules/vite": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39848,7 +34694,7 @@ "nanoid": "^5.1.2", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-protocol": "0.0.0", "zero-types": "0.0.0" } @@ -39861,7 +34707,7 @@ "otel": "0.0.0", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", @@ -39871,6 +34717,20 @@ "zqlite": "0.0.0" } }, + "packages/zql-benchmarks/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/zql-integration-tests": { "version": "0.0.0", "devDependencies": { @@ -39878,7 +34738,7 @@ "otel": "0.0.0", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "z2s": "0.0.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", @@ -39889,6 +34749,34 @@ "zqlite": "0.0.0" } }, + "packages/zql-integration-tests/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/zql/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/zqlite": { "version": "0.0.0", "dependencies": { @@ -39905,7 +34793,7 @@ "otel": "0.0.0", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zero-types": "0.0.0", @@ -39922,10 +34810,38 @@ "@vitest/runner": "4.1.2", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" } }, + "packages/zqlite-zql-test/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/zqlite/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "prod": { "version": "0.0.0", "devDependencies": { @@ -39994,11 +34910,25 @@ "devDependencies": { "@types/node": "^22.10.5", "oxfmt": "^0.43.0", - "typescript": "~5.9.3" + "typescript": "~6.0.2" }, "engines": { "node": ">=22" } + }, + "tools/verify-package-deps/node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } } } } diff --git a/packages/datadog/package.json b/packages/datadog/package.json index 7039047182..6afe7739e2 100644 --- a/packages/datadog/package.json +++ b/packages/datadog/package.json @@ -9,7 +9,7 @@ "@vitest/runner": "4.1.2", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" }, "scripts": { diff --git a/packages/datadog/tsconfig.json b/packages/datadog/tsconfig.json index d9de87f1ea..09c94ceb11 100644 --- a/packages/datadog/tsconfig.json +++ b/packages/datadog/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "rootDir": "..", "outDir": "out" }, "include": ["src/**/*.ts"] diff --git a/packages/replicache-doc/package.json b/packages/replicache-doc/package.json index 338101a8b9..dcf855d111 100644 --- a/packages/replicache-doc/package.json +++ b/packages/replicache-doc/package.json @@ -33,7 +33,7 @@ "docusaurus-plugin-typedoc": "^1.4.2", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", - "typescript": "~5.9.3" + "typescript": "~6.0.2" }, "browserslist": { "production": [ diff --git a/packages/replicache-perf/package.json b/packages/replicache-perf/package.json index 5b73301627..e33161fda7 100644 --- a/packages/replicache-perf/package.json +++ b/packages/replicache-perf/package.json @@ -24,7 +24,7 @@ "replicache": "15.2.1", "shared": "0.0.0", "tsx": "^4.21.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vite": "8.0.3", "xbytes": "^1.7.0" }, diff --git a/packages/replicache/package.json b/packages/replicache/package.json index 337a1b46c3..99b187e51b 100644 --- a/packages/replicache/package.json +++ b/packages/replicache/package.json @@ -55,7 +55,7 @@ "oxfmt": "^0.43.0", "playwright": "^1.53.2", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" }, "peerDependencies": { diff --git a/packages/replicache/tsconfig.build.json b/packages/replicache/tsconfig.build.json index 68975006ff..dff383a800 100644 --- a/packages/replicache/tsconfig.build.json +++ b/packages/replicache/tsconfig.build.json @@ -3,6 +3,7 @@ "compilerOptions": { "noEmit": false, "emitDeclarationOnly": true, + "rootDir": "..", "outDir": "out" }, "include": [ diff --git a/packages/shared/package.json b/packages/shared/package.json index eeb32a1533..43c1524985 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -44,7 +44,7 @@ "package-up": "^5.0.0", "playwright": "^1.53.2", "type-fest": "^4.30.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" } } diff --git a/packages/z2s/src/sql.ts b/packages/z2s/src/sql.ts index e0fc9a73dd..4a935ceac5 100644 --- a/packages/z2s/src/sql.ts +++ b/packages/z2s/src/sql.ts @@ -3,7 +3,7 @@ import { escapeSQLiteIdentifier, } from '@databases/escape-identifier'; import type {FormatConfig, SQLItem, SQLQuery} from '@databases/sql'; -import baseSql, {SQLItemType} from '@databases/sql'; +import sql, {SQLItemType} from '@databases/sql'; import {assert, unreachable} from '../../shared/src/asserts.ts'; import { isPgNumberType, @@ -270,7 +270,7 @@ function pgTypeForLiteralType(type: Exclude) { } } -export const sql = baseSql.default; +export {sql}; const PREVIOUSLY_SEEN_VALUE = Symbol('PREVIOUSLY_SEEN_VALUE'); diff --git a/packages/zero-cache/package.json b/packages/zero-cache/package.json index 6debdbde07..88b4dde354 100644 --- a/packages/zero-cache/package.json +++ b/packages/zero-cache/package.json @@ -85,7 +85,7 @@ "otel": "0.0.0", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", diff --git a/packages/zero-client/package.json b/packages/zero-client/package.json index 69b920bfbf..f4e7889c8a 100644 --- a/packages/zero-client/package.json +++ b/packages/zero-client/package.json @@ -35,7 +35,7 @@ "playwright": "^1.53.2", "replicache": "15.2.1", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zero-types": "0.0.0", diff --git a/packages/zero-client/tsconfig.json b/packages/zero-client/tsconfig.json index a3f2816175..f7c1e51524 100644 --- a/packages/zero-client/tsconfig.json +++ b/packages/zero-client/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "rootDir": "..", "outDir": "out", "rootDir": "../", "noEmit": false, diff --git a/packages/zero-events/package.json b/packages/zero-events/package.json index ce2d6f429a..f2e2c0f6fa 100644 --- a/packages/zero-events/package.json +++ b/packages/zero-events/package.json @@ -34,6 +34,6 @@ "devDependencies": { "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3" + "typescript": "~6.0.2" } } diff --git a/packages/zero-events/tsconfig.json b/packages/zero-events/tsconfig.json index 1d3a57a6fd..7931d22d51 100644 --- a/packages/zero-events/tsconfig.json +++ b/packages/zero-events/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "noEmit": false, "emitDeclarationOnly": true, - "rootDir": "../", + "rootDir": "src", "outDir": "out" }, "include": ["src"], diff --git a/packages/zero-protocol/package.json b/packages/zero-protocol/package.json index e232527e89..44e05ac2b2 100644 --- a/packages/zero-protocol/package.json +++ b/packages/zero-protocol/package.json @@ -18,7 +18,7 @@ "devDependencies": { "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-types": "0.0.0" } } diff --git a/packages/zero-types/package.json b/packages/zero-types/package.json index b24ae79e35..6de62c9a5a 100644 --- a/packages/zero-types/package.json +++ b/packages/zero-types/package.json @@ -15,7 +15,7 @@ "devDependencies": { "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" } } diff --git a/packages/zero/package.json b/packages/zero/package.json index c6a4ebcfcf..b9e364c0d8 100644 --- a/packages/zero/package.json +++ b/packages/zero/package.json @@ -88,7 +88,7 @@ "syncpack": "^14.2.1", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vite": "8.0.3", "vitest": "4.1.2", "zero-cache": "0.0.0", diff --git a/packages/zero/tsconfig.json b/packages/zero/tsconfig.json index aeac490834..e38d268978 100644 --- a/packages/zero/tsconfig.json +++ b/packages/zero/tsconfig.json @@ -2,6 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "jsx": "react-jsx", + "rootDir": "..", "outDir": "out", "rootDir": "../", "noEmit": false, diff --git a/packages/zql-benchmarks/package.json b/packages/zql-benchmarks/package.json index e3a6fea4b6..c699f7cb2a 100644 --- a/packages/zql-benchmarks/package.json +++ b/packages/zql-benchmarks/package.json @@ -25,7 +25,7 @@ "otel": "0.0.0", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", diff --git a/packages/zql-benchmarks/src/chinook-push.bench.ts b/packages/zql-benchmarks/src/chinook-push.bench.ts index 5a2324e9da..9bd421e68e 100644 --- a/packages/zql-benchmarks/src/chinook-push.bench.ts +++ b/packages/zql-benchmarks/src/chinook-push.bench.ts @@ -111,7 +111,7 @@ await runBenchmarks( ), ], ]; - })(), + })() satisfies PushGenerator, }, ], ); diff --git a/packages/zql-benchmarks/tsconfig.json b/packages/zql-benchmarks/tsconfig.json index 280f82e782..3c94740c94 100644 --- a/packages/zql-benchmarks/tsconfig.json +++ b/packages/zql-benchmarks/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "rootDir": "..", "outDir": "dist" }, "include": ["src/**/*.ts"] diff --git a/packages/zql-integration-tests/package.json b/packages/zql-integration-tests/package.json index ad53168d42..648e9ebc80 100644 --- a/packages/zql-integration-tests/package.json +++ b/packages/zql-integration-tests/package.json @@ -23,7 +23,7 @@ "otel": "0.0.0", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "z2s": "0.0.0", "zero-cache": "0.0.0", "zero-protocol": "0.0.0", diff --git a/packages/zql-integration-tests/tsconfig.json b/packages/zql-integration-tests/tsconfig.json index 87463278e0..04aa039228 100644 --- a/packages/zql-integration-tests/tsconfig.json +++ b/packages/zql-integration-tests/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "rootDir": "..", "outDir": "dist" }, "include": ["src/**/*.ts", "../zql-benchmarks/src/chinook.bench.ts"] diff --git a/packages/zql/package.json b/packages/zql/package.json index c32c6a7a34..3844c32d0b 100644 --- a/packages/zql/package.json +++ b/packages/zql/package.json @@ -21,7 +21,7 @@ "nanoid": "^5.1.2", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-protocol": "0.0.0", "zero-types": "0.0.0" }, diff --git a/packages/zqlite-zql-test/package.json b/packages/zqlite-zql-test/package.json index 140b6829ee..eae3ec6103 100644 --- a/packages/zqlite-zql-test/package.json +++ b/packages/zqlite-zql-test/package.json @@ -18,7 +18,7 @@ "@vitest/runner": "4.1.2", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "vitest": "4.1.2" }, "dependencies": { diff --git a/packages/zqlite/package.json b/packages/zqlite/package.json index 1d69d49216..cd80b0288b 100644 --- a/packages/zqlite/package.json +++ b/packages/zqlite/package.json @@ -24,7 +24,7 @@ "otel": "0.0.0", "oxfmt": "^0.43.0", "shared": "0.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.2", "zero-protocol": "0.0.0", "zero-schema": "0.0.0", "zero-types": "0.0.0", diff --git a/packages/zqlite/src/internal/sql.ts b/packages/zqlite/src/internal/sql.ts index 4cf9188898..b937238cba 100644 --- a/packages/zqlite/src/internal/sql.ts +++ b/packages/zqlite/src/internal/sql.ts @@ -1,6 +1,6 @@ -import type {SQLQuery, FormatConfig} from '@databases/sql'; -import baseSql from '@databases/sql'; import {escapeSQLiteIdentifier} from '@databases/escape-identifier'; +import type {FormatConfig, SQLQuery} from '@databases/sql'; +import sql from '@databases/sql'; const sqliteFormat: FormatConfig = { escapeIdentifier: str => escapeSQLiteIdentifier(str), @@ -15,4 +15,4 @@ export function format(sql: SQLQuery) { return sql.format(sqliteFormat); } -export const sql = baseSql.default; +export {sql}; diff --git a/packages/zqlite/tsconfig.json b/packages/zqlite/tsconfig.json index 280f82e782..3c94740c94 100644 --- a/packages/zqlite/tsconfig.json +++ b/packages/zqlite/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "rootDir": "..", "outDir": "dist" }, "include": ["src/**/*.ts"] diff --git a/tools/verify-package-deps/package.json b/tools/verify-package-deps/package.json index d7e0870e34..08c0f816ff 100644 --- a/tools/verify-package-deps/package.json +++ b/tools/verify-package-deps/package.json @@ -21,6 +21,6 @@ "devDependencies": { "@types/node": "^22.10.5", "oxfmt": "^0.43.0", - "typescript": "~5.9.3" + "typescript": "~6.0.2" } } diff --git a/tsconfig.json b/tsconfig.json index 59da6fd5c2..2ac501e3da 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,13 +2,13 @@ "compilerOptions": { "target": "es2022", "lib": ["ES2022", "ES2023.Collection", "DOM", "DOM.Iterable"], - "module": "NodeNext", + "module": "preserve", "verbatimModuleSyntax": true, "erasableSyntaxOnly": true, "allowImportingTsExtensions": true, "rewriteRelativeImportExtensions": true, "esModuleInterop": true, - "moduleResolution": "NodeNext", + "moduleResolution": "bundler", "moduleDetection": "force", "strict": true, "exactOptionalPropertyTypes": true, From a933d549ab12bb9a014202ee97a13d9faa1cdc6e Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 3 Apr 2026 16:14:58 -0700 Subject: [PATCH 231/495] chore(zero-cache): support restoring from a v0.5.x litestream backup (#5755) Support using a different `litestream` executable for restoring backups, and package the `v0.5.10` binary in the zero-cache container to [support restoring from both](https://litestream.io/reference/restore/#format-detection) v0.3.x (WAL) and v0.5.x (LTX) backup formats. The executable used for `litestream replicate` still must be the rocicorp/litestream fork at v0.3.x. However, being able to restore from LTX backups facilitates forwards-compatibility (and rollback safety) with a future build that backs up the replica in the LTX format. --- .../zero-cache/src/config/zero-config.test.ts | 11 ++++++++++- packages/zero-cache/src/config/zero-config.ts | 16 +++++++++++++++- .../src/services/litestream/commands.ts | 10 ++++++++-- packages/zero/Dockerfile | 4 ++++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index 19bc737027..e34f301eed 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -459,7 +459,16 @@ test('zero-cache --help', () => { --litestream-executable string optional ZERO_LITESTREAM_EXECUTABLE env - Path to the litestream executable. + Path to the litestream executable. This must be built from the + rocicorp/litestream fork. Support for the official binary at v0.5.x + is planned. + + --litestream-executable-for-restore string optional + ZERO_LITESTREAM_EXECUTABLE_FOR_RESTORE env + Optionally override the ZERO_LITESTREAM_EXECUTABLE for restoring the backup. + Specify a litestream v0.5.8+ executable (which can restore from both v0.3.x + and v0.5.x backup formats) for forwards compatibility with a future zero-cache + version that will use litestream v0.5.x to backup the replica. --litestream-config-path string default: "./src/services/litestream/config.yml" ZERO_LITESTREAM_CONFIG_PATH env diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index 796d2fa49c..5de0b94ec5 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -699,7 +699,21 @@ export const zeroOptions = { litestream: { executable: { type: v.string().optional(), - desc: [`Path to the {bold litestream} executable.`], + desc: [ + `Path to the {bold litestream} executable. This must be built from the`, + `{bold rocicorp/litestream} fork. Support for the official binary at v0.5.x`, + `is planned.`, + ], + }, + + executableForRestore: { + type: v.string().optional(), + desc: [ + `Optionally override the {bold ZERO_LITESTREAM_EXECUTABLE} for restoring the backup.`, + `Specify a litestream v0.5.8+ executable (which can restore from both v0.3.x`, + `and v0.5.x backup formats) for forwards compatibility with a future zero-cache`, + `version that will use litestream v0.5.x to backup the replica.`, + ], }, configPath: { diff --git a/packages/zero-cache/src/services/litestream/commands.ts b/packages/zero-cache/src/services/litestream/commands.ts index 36d49e3eaf..e94c8ac168 100644 --- a/packages/zero-cache/src/services/litestream/commands.ts +++ b/packages/zero-cache/src/services/litestream/commands.ts @@ -58,6 +58,7 @@ export async function restoreReplica( } function getLitestream( + mode: 'restore' | 'replicate', config: ZeroConfig, logLevelOverride?: LogLevel, backupURLOverride?: string, @@ -67,6 +68,7 @@ function getLitestream( } { const { executable, + executableForRestore, backupURL, logLevel, configPath, @@ -85,8 +87,11 @@ function getLitestream( // the hourly check triggers on the hour, rather than the hour after. const snapshotBackupIntervalMinutes = snapshotBackupIntervalHours * 60 - 5; + const litestream = + (mode === 'restore' ? executableForRestore : executable) ?? + must(executable, `Missing --litestream-executable`); return { - litestream: must(executable, `Missing --litestream-executable`), + litestream, env: { ...process.env, ['ZERO_REPLICA_FILE']: config.replica.file, @@ -137,6 +142,7 @@ async function tryRestore(lc: LogContext, config: ZeroConfig) { } const {litestream, env} = getLitestream( + 'restore', config, 'debug', // Include all output from `litestream restore`, as it's minimal. snapshotStatus?.backupURL, @@ -220,7 +226,7 @@ export function startReplicaBackupProcess( lc: LogContext, config: ZeroConfig, ): ChildProcess { - const {litestream, env} = getLitestream(config); + const {litestream, env} = getLitestream('replicate', config); lc.info?.(`starting litestream backup to ${config.litestream.backupURL}`); return spawn(litestream, ['replicate'], { env, diff --git a/packages/zero/Dockerfile b/packages/zero/Dockerfile index 716b03a266..5b7a61729a 100644 --- a/packages/zero/Dockerfile +++ b/packages/zero/Dockerfile @@ -10,6 +10,8 @@ RUN --mount=type=cache,target=/root/.cache/go-build \ --mount=type=cache,target=/go/pkg \ go build -ldflags "-s -w -X 'main.Version=${LITESTREAM_VERSION}' -extldflags '-static'" -tags osusergo,netgo,sqlite_omit_load_extension -o /usr/local/bin/litestream ./cmd/litestream +FROM litestream/litestream:0.5.10 AS litestream-v5 + FROM node:22.15.0-alpine3.20 ARG ZERO_VERSION @@ -51,9 +53,11 @@ RUN ln -s /usr/local/lib/node_modules/@rocicorp/zero/node_modules/@rocicorp/zero # Copy litestream executable and config.yml COPY --from=litestream /usr/local/bin/litestream /usr/local/bin/litestream +COPY --from=litestream-v5 /usr/local/bin/litestream /usr/local/bin/litestream-v5 RUN cp /usr/local/lib/node_modules/@rocicorp/zero/out/zero-cache/src/services/litestream/config.yml /etc/litestream.yml ENV ZERO_LITESTREAM_EXECUTABLE=/usr/local/bin/litestream +ENV ZERO_LITESTREAM_EXECUTABLE_FOR_RESTORE=/usr/local/bin/litestream-v5 ENV ZERO_LITESTREAM_CONFIG_PATH=/etc/litestream.yml ENV ZERO_LOG_FORMAT=json ENV ZERO_SERVER_VERSION=${ZERO_VERSION} From 5c474cdd4c4b7f15243a9be88717a89b9d1893dc Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 3 Apr 2026 17:22:26 -0700 Subject: [PATCH 232/495] chore(zero-cache): rename v5 litestream option (#5757) Rename the litestream v5 option to indicate its version rather than its role. This will make things clearer when a new option is added to use v5 for replication as well. --- packages/zero-cache/src/config/zero-config.test.ts | 7 ++++--- packages/zero-cache/src/config/zero-config.ts | 5 +++-- packages/zero-cache/src/services/litestream/commands.ts | 7 +++++-- packages/zero/Dockerfile | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index e34f301eed..eb19d46c3e 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -463,9 +463,10 @@ test('zero-cache --help', () => { rocicorp/litestream fork. Support for the official binary at v0.5.x is planned. - --litestream-executable-for-restore string optional - ZERO_LITESTREAM_EXECUTABLE_FOR_RESTORE env - Optionally override the ZERO_LITESTREAM_EXECUTABLE for restoring the backup. + --litestream-executable-v5 string optional + ZERO_LITESTREAM_EXECUTABLE_V5 env + The v0.5.x litestream executable which, when specified, will be used for + restoring the backup instead of the ZERO_LITESTREAM_EXECUTABLE. Specify a litestream v0.5.8+ executable (which can restore from both v0.3.x and v0.5.x backup formats) for forwards compatibility with a future zero-cache version that will use litestream v0.5.x to backup the replica. diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index 5de0b94ec5..2338d337fe 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -706,10 +706,11 @@ export const zeroOptions = { ], }, - executableForRestore: { + executableV5: { type: v.string().optional(), desc: [ - `Optionally override the {bold ZERO_LITESTREAM_EXECUTABLE} for restoring the backup.`, + `The v0.5.x litestream executable which, when specified, will be used for`, + `restoring the backup instead of the {bold ZERO_LITESTREAM_EXECUTABLE}.`, `Specify a litestream v0.5.8+ executable (which can restore from both v0.3.x`, `and v0.5.x backup formats) for forwards compatibility with a future zero-cache`, `version that will use litestream v0.5.x to backup the replica.`, diff --git a/packages/zero-cache/src/services/litestream/commands.ts b/packages/zero-cache/src/services/litestream/commands.ts index e94c8ac168..6464b9746e 100644 --- a/packages/zero-cache/src/services/litestream/commands.ts +++ b/packages/zero-cache/src/services/litestream/commands.ts @@ -68,7 +68,7 @@ function getLitestream( } { const { executable, - executableForRestore, + executableV5, backupURL, logLevel, configPath, @@ -88,7 +88,10 @@ function getLitestream( const snapshotBackupIntervalMinutes = snapshotBackupIntervalHours * 60 - 5; const litestream = - (mode === 'restore' ? executableForRestore : executable) ?? + // The v0.5.8+ litestream executable can restore from either the new LTX + // format or the legacy WAL format, allowing forwards-compatibility / + // rollback safety with zero-cache versions that backup to LTX. + (mode === 'restore' ? executableV5 : executable) ?? must(executable, `Missing --litestream-executable`); return { litestream, diff --git a/packages/zero/Dockerfile b/packages/zero/Dockerfile index 5b7a61729a..35a0d00f2d 100644 --- a/packages/zero/Dockerfile +++ b/packages/zero/Dockerfile @@ -57,7 +57,7 @@ COPY --from=litestream-v5 /usr/local/bin/litestream /usr/local/bin/litestream-v5 RUN cp /usr/local/lib/node_modules/@rocicorp/zero/out/zero-cache/src/services/litestream/config.yml /etc/litestream.yml ENV ZERO_LITESTREAM_EXECUTABLE=/usr/local/bin/litestream -ENV ZERO_LITESTREAM_EXECUTABLE_FOR_RESTORE=/usr/local/bin/litestream-v5 +ENV ZERO_LITESTREAM_EXECUTABLE_V5=/usr/local/bin/litestream-v5 ENV ZERO_LITESTREAM_CONFIG_PATH=/etc/litestream.yml ENV ZERO_LOG_FORMAT=json ENV ZERO_SERVER_VERSION=${ZERO_VERSION} From b258801e910db837f2d9ece4d8b2642b4358cbe1 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Fri, 3 Apr 2026 20:31:21 -0700 Subject: [PATCH 233/495] chore(zero-cache): gate v5 restoration behind a flag (#5758) --- .../zero-cache/src/config/zero-config.test.ts | 12 ++++++++---- packages/zero-cache/src/config/zero-config.ts | 15 +++++++++++---- .../src/services/litestream/commands.ts | 3 ++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index eb19d46c3e..d4a786fe3d 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -465,12 +465,16 @@ test('zero-cache --help', () => { --litestream-executable-v5 string optional ZERO_LITESTREAM_EXECUTABLE_V5 env - The v0.5.x litestream executable which, when specified, will be used for - restoring the backup instead of the ZERO_LITESTREAM_EXECUTABLE. - Specify a litestream v0.5.8+ executable (which can restore from both v0.3.x - and v0.5.x backup formats) for forwards compatibility with a future zero-cache + The v0.5.x litestream executable which is used for restoring the backup + backup when ZERO_LITESTREAM_RESTORE_USING_V5 is specified. + litestream v0.5.8+ can restore from both v0.3.x and v0.5.x backup formats, + affording forwards compatibility with a future zero-cache version that will use litestream v0.5.x to backup the replica. + --litestream-restore-using-v5 boolean default: false + ZERO_LITESTREAM_RESTORE_USING_V5 env + Restores the backup using the ZERO_LITESTREAM_EXECUTABLE_V5 if specified. + --litestream-config-path string default: "./src/services/litestream/config.yml" ZERO_LITESTREAM_CONFIG_PATH env Path to the litestream yaml config file. zero-cache will run this with its diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index 2338d337fe..22ca6baf63 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -709,14 +709,21 @@ export const zeroOptions = { executableV5: { type: v.string().optional(), desc: [ - `The v0.5.x litestream executable which, when specified, will be used for`, - `restoring the backup instead of the {bold ZERO_LITESTREAM_EXECUTABLE}.`, - `Specify a litestream v0.5.8+ executable (which can restore from both v0.3.x`, - `and v0.5.x backup formats) for forwards compatibility with a future zero-cache`, + `The v0.5.x litestream executable which is used for restoring the backup`, + `backup when {bold ZERO_LITESTREAM_RESTORE_USING_V5} is specified.`, + `litestream v0.5.8+ can restore from both v0.3.x and v0.5.x backup formats,`, + `affording forwards compatibility with a future zero-cache`, `version that will use litestream v0.5.x to backup the replica.`, ], }, + restoreUsingV5: { + type: v.boolean().default(false), + desc: [ + `Restores the backup using the {bold ZERO_LITESTREAM_EXECUTABLE_V5} if specified.`, + ], + }, + configPath: { type: v.string().default('./src/services/litestream/config.yml'), desc: [ diff --git a/packages/zero-cache/src/services/litestream/commands.ts b/packages/zero-cache/src/services/litestream/commands.ts index 6464b9746e..f062d2cae4 100644 --- a/packages/zero-cache/src/services/litestream/commands.ts +++ b/packages/zero-cache/src/services/litestream/commands.ts @@ -69,6 +69,7 @@ function getLitestream( const { executable, executableV5, + restoreUsingV5, backupURL, logLevel, configPath, @@ -91,7 +92,7 @@ function getLitestream( // The v0.5.8+ litestream executable can restore from either the new LTX // format or the legacy WAL format, allowing forwards-compatibility / // rollback safety with zero-cache versions that backup to LTX. - (mode === 'restore' ? executableV5 : executable) ?? + (mode === 'restore' && restoreUsingV5 ? executableV5 : executable) ?? must(executable, `Missing --litestream-executable`); return { litestream, From a925e30b7141a0656201ab0ecf16f2646a7e0368 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Mon, 6 Apr 2026 10:14:28 -0400 Subject: [PATCH 234/495] chore(zero-cache): span around xform query (#5760) Something unmeasured is taking up a bunch of time. This is the most likely candidate. CleanShot 2026-04-06 at 09 27 54@2x --- .../src/custom-queries/transform-query.ts | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/zero-cache/src/custom-queries/transform-query.ts b/packages/zero-cache/src/custom-queries/transform-query.ts index a9bf63ae87..469aaf23a5 100644 --- a/packages/zero-cache/src/custom-queries/transform-query.ts +++ b/packages/zero-cache/src/custom-queries/transform-query.ts @@ -1,4 +1,6 @@ +import {trace} from '@opentelemetry/api'; import type {LogContext} from '@rocicorp/logger'; +import {startAsyncSpan} from '../../../otel/src/span.ts'; import {TimedCache} from '../../../shared/src/cache.ts'; import {getErrorMessage} from '../../../shared/src/error.ts'; import {must} from '../../../shared/src/must.ts'; @@ -25,6 +27,8 @@ import { import type {CustomQueryRecord} from '../services/view-syncer/schema/types.ts'; import type {ShardID} from '../types/shards.ts'; +const tracer = trace.getTracer('custom-query-transformer'); + /** * Transforms a custom query by calling the user's API server. * Caches the transformed queries for 5 seconds to avoid unnecessary API calls. @@ -108,19 +112,24 @@ export class CustomQueryTransformer { const queryIDs = request.map(r => r.id); try { - const transformResponse = await fetchFromAPIServer( - transformResponseMessageSchema, - 'transform', - this.#lc, - userQueryURL ?? - must( - this.#config.url[0], - 'A ZERO_QUERY_URL must be configured for custom queries', + const transformResponse = await startAsyncSpan( + tracer, + 'customQueryTransformer.fetchFromAPIServer', + () => + fetchFromAPIServer( + transformResponseMessageSchema, + 'transform', + this.#lc, + userQueryURL ?? + must( + this.#config.url[0], + 'A ZERO_QUERY_URL must be configured for custom queries', + ), + this.#urlPatterns, + this.#shard, + headerOptions, + ['transform', request] satisfies TransformRequestMessage, ), - this.#urlPatterns, - this.#shard, - headerOptions, - ['transform', request] satisfies TransformRequestMessage, ); if (transformResponse[0] === 'transformFailed') { From e19978bd4d544419dd370bbf51c4a981f9ba015f Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Mon, 6 Apr 2026 10:31:32 -0400 Subject: [PATCH 235/495] chore(zero-cache): extra tracing inside `processBatch` (#5722) To determine if flushing to the client is what is consuming all the time --- .../services/view-syncer/row-record-cache.ts | 34 +++++++++------ .../src/services/view-syncer/view-syncer.ts | 43 ++++++++++++++----- 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/packages/zero-cache/src/services/view-syncer/row-record-cache.ts b/packages/zero-cache/src/services/view-syncer/row-record-cache.ts index 338491c3dc..99512e5942 100644 --- a/packages/zero-cache/src/services/view-syncer/row-record-cache.ts +++ b/packages/zero-cache/src/services/view-syncer/row-record-cache.ts @@ -1,6 +1,7 @@ import type {LogContext} from '@rocicorp/logger'; import {type Resolver, resolver} from '@rocicorp/resolver'; import type {PendingQuery, Row} from 'postgres'; +import {startAsyncSpan} from '../../../../otel/src/span.ts'; import {CustomKeyMap} from '../../../../shared/src/custom-key-map.ts'; import {must} from '../../../../shared/src/must.ts'; import {promiseVoid} from '../../../../shared/src/resolved-promises.ts'; @@ -21,6 +22,7 @@ import { type RowsRow, rowsRowToRowRecord, } from './schema/cvr.ts'; +import {tracer} from './tracer.ts'; import { cmpVersions, type CVRVersion, @@ -163,19 +165,27 @@ export class RowRecordCache { // query is made even if there are multiple callers. this.#cache = r.promise; try { - const cache: CustomKeyMap = new CustomKeyMap( - rowIDString, + const cache = await startAsyncSpan( + tracer, + 'RowRecordCache.load', + async span => { + const cache: CustomKeyMap = new CustomKeyMap( + rowIDString, + ); + for await (const rows of this.#db` + SELECT * FROM ${this.#cvr(`rows`)} + WHERE "clientGroupID" = ${this.#cvrID} AND "refCounts" IS NOT NULL` + // TODO(arv): Arbitrary page size + .cursor(5000)) { + for (const row of rows) { + const rowRecord = rowsRowToRowRecord(row); + cache.set(rowRecord.id, rowRecord); + } + } + span.setAttribute('rows', cache.size); + return cache; + }, ); - for await (const rows of this.#db` - SELECT * FROM ${this.#cvr(`rows`)} - WHERE "clientGroupID" = ${this.#cvrID} AND "refCounts" IS NOT NULL` - // TODO(arv): Arbitrary page size - .cursor(5000)) { - for (const row of rows) { - const rowRecord = rowsRowToRowRecord(row); - cache.set(rowRecord.id, rowRecord); - } - } this.#lc.info?.( `Loaded ${cache.size} row records in ${Date.now() - start} ms`, ); diff --git a/packages/zero-cache/src/services/view-syncer/view-syncer.ts b/packages/zero-cache/src/services/view-syncer/view-syncer.ts index 1838f3db54..dcd15143b0 100644 --- a/packages/zero-cache/src/services/view-syncer/view-syncer.ts +++ b/packages/zero-cache/src/services/view-syncer/view-syncer.ts @@ -990,7 +990,9 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { return startAsyncSpan( tracer, `vs.#runInLockForClient(${cmd})`, - async () => { + async span => { + span.setAttribute('clientGroupID', this.id); + span.setAttribute('clientID', clientID); let client: ClientHandler | undefined; let result: R | undefined; try { @@ -1480,7 +1482,8 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { cvr: CVRSnapshot, customQueryTransformMode: CustomQueryTransformMode, ) { - return startAsyncSpan(tracer, 'vs.#syncQueryPipelineSet', async () => { + return startAsyncSpan(tracer, 'vs.#syncQueryPipelineSet', async span => { + span.setAttribute('clientGroupID', this.id); assert( this.#pipelines.initialized(), 'pipelines must be initialized (syncQueryPipelineSet)', @@ -1829,9 +1832,15 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { pokers, ); - for (const patch of await updater.deleteUnreferencedRows(lc)) { - await pokers.addPatch(patch); - } + await startAsyncSpan( + tracer, + 'vs.#syncQueryPipelineSet.deleteUnreferencedRows', + async () => { + for (const patch of await updater.deleteUnreferencedRows(lc)) { + await pokers.addPatch(patch); + } + }, + ); // Commit the changes and update the CVR snapshot. this.#cvr = await this.#flushUpdater(lc, updater); @@ -1848,7 +1857,9 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { ); // Signal clients to commit. - await pokers.end(finalVersion); + await startAsyncSpan(tracer, 'vs.#syncQueryPipelineSet.pokeEnd', () => + pokers.end(finalVersion), + ); const wallTime = performance.now() - start; lc.info?.( @@ -1979,9 +1990,16 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { ); const patches = await updater.received(lc, rows); - for (const patch of patches) { - await pokers.addPatch(patch); - } + await startAsyncSpan( + tracer, + 'processBatch.flushToClient', + async span => { + span.setAttribute('patches', patches.length); + for (const patch of patches) { + await pokers.addPatch(patch); + } + }, + ); rows.clear(); }); @@ -2049,7 +2067,8 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { lc: LogContext, cvr: CVRSnapshot, ): Promise<'success' | ResetPipelinesSignal> { - return startAsyncSpan(tracer, 'vs.#advancePipelines', async () => { + return startAsyncSpan(tracer, 'vs.#advancePipelines', async span => { + span.setAttribute('clientGroupID', this.id); assert( this.#pipelines.initialized(), 'pipelines must be initialized (advancePipelines', @@ -2097,7 +2116,9 @@ export class ViewSyncerService implements ViewSyncer, ActivityBasedService { const finalVersion = this.#cvr.version; // Signal clients to commit. - await pokers.end(finalVersion); + await startAsyncSpan(tracer, 'vs.#advancePipelines.pokeEnd', () => + pokers.end(finalVersion), + ); const wallTime = performance.now() - start; const totalProcessTime = timer.totalElapsed(); From 9d9153e54df8273f12f306994e828436aac297a5 Mon Sep 17 00:00:00 2001 From: Matt Wonlaw Date: Mon, 6 Apr 2026 10:55:07 -0400 Subject: [PATCH 236/495] fix(zero-cache): correctly return sqlite iterators in table-source (#5696) #mapFromSQLiteTypes used to return the iterator via its own finally block, but it is possible that wrappers over `mapFromSQLiteTypes` return before we ever call into `mapFromSQLiteTypes`! When that happens, we leak the SQLite iterator! The work on `cap` found this. Added a test to reproduce the issue. --- packages/zqlite/src/table-source.test.ts | 66 +++++++++++++++++++++++- packages/zqlite/src/table-source.ts | 45 +++++++--------- 2 files changed, 83 insertions(+), 28 deletions(-) diff --git a/packages/zqlite/src/table-source.test.ts b/packages/zqlite/src/table-source.test.ts index 50f3aa75a2..ede0fd0ef8 100644 --- a/packages/zqlite/src/table-source.test.ts +++ b/packages/zqlite/src/table-source.test.ts @@ -6,7 +6,8 @@ import type {Row, Value} from '../../zero-protocol/src/data.ts'; import {Catch} from '../../zql/src/ivm/catch.ts'; import type {Change} from '../../zql/src/ivm/change.ts'; import {makeComparator} from '../../zql/src/ivm/data.ts'; -import {Database} from './db.ts'; +import type {DebugDelegate} from '../../zql/src/builder/debug-delegate.ts'; +import {Database, Statement} from './db.ts'; import {format} from './internal/sql.ts'; import { fromSQLiteTypes, @@ -15,6 +16,7 @@ import { } from './table-source.ts'; import {filtersToSQL} from './query-builder.ts'; import {assert} from '../../shared/src/asserts.ts'; +import {must} from '../../shared/src/must.ts'; import {consume} from '../../zql/src/ivm/stream.ts'; const columns = { @@ -976,3 +978,65 @@ describe('fromSQLiteTypes error messages', () => { ); }); }); + +test('SQLite iterator is closed when an error occurs before #mapFromSQLiteTypes is iterated', () => { + const db = new Database(lc, ':memory:'); + db.exec('CREATE TABLE test (id TEXT PRIMARY KEY, val INTEGER);'); + db.prepare('INSERT INTO test (id, val) VALUES (?, ?)').run('1', 1); + + const source = new TableSource( + lc, + testLogConfig, + db, + 'test', + {id: {type: 'string'}, val: {type: 'number'}}, + ['id'], + ); + + // Spy on Statement.prototype.iterate to track .return() calls on the + // returned iterator. + let iteratorReturnCalled = false; + const origIterate = Statement.prototype.iterate; + // @ts-expect-error monkey-patching for test + Statement.prototype.iterate = function (...args) { + const iter = origIterate.apply(this, args); + const origReturn = must(iter.return).bind(iter); + iter.return = () => { + iteratorReturnCalled = true; + return origReturn(); + }; + return iter; + }; + + try { + // debug.initQuery() is called in #fetch after the SQLite iterator is + // created but before the yield* generator chain (and thus + // #mapFromSQLiteTypes) is ever iterated. If initQuery throws, the fix + // ensures rowIterator.return() is still called in #fetch's finally block. + // Without the fix, rowIterator.return() was only in #mapFromSQLiteTypes' + // finally block, which never ran because the generator was never started. + const throwingDebug: DebugDelegate = { + initQuery() { + throw new Error('initQuery error'); + }, + rowVended() {}, + getVendedRowCounts: () => ({}), + getVendedRows: () => ({}), + recordNVisit() {}, + getNVisitCounts: () => ({}), + reset() {}, + }; + + const input = source.connect( + [['id', 'asc']], + undefined, + undefined, + throwingDebug, + ); + + expect(() => [...input.fetch({})]).toThrow('initQuery error'); + expect(iteratorReturnCalled).toBe(true); + } finally { + Statement.prototype.iterate = origIterate; + } +}); diff --git a/packages/zqlite/src/table-source.ts b/packages/zqlite/src/table-source.ts index e69841267d..02c4e6e56c 100644 --- a/packages/zqlite/src/table-source.ts +++ b/packages/zqlite/src/table-source.ts @@ -334,12 +334,7 @@ export class TableSource implements Source { ); } } finally { - // Ensure the SQLite iterate() is closed. Normally #mapFromSQLiteTypes - // closes it via its own finally block, but if the generator chain is - // returned before #mapFromSQLiteTypes was ever started (e.g., the - // unordered overlay yielded an add row before iterating the source), - // the SQLite iterator would remain active and lock the connection. - // Calling return() on an already-closed iterator is a safe no-op. + // Ensure the SQLite iterate() is closed. rowIterator.return?.(); if (debug) { let totalNvisit = 0; @@ -371,27 +366,23 @@ export class TableSource implements Source { debug: DebugDelegate | undefined, ): IterableIterator { let result; - try { - do { - result = timeSampled( - this.#lc, - ++eventCount, - this.#logConfig.ivmSampling, - () => rowIterator.next(), - this.#logConfig.slowRowThreshold, - () => - `table-source.next took too long for ${query}. Are you missing an index?`, - ); - if (result.done) { - break; - } - const row = fromSQLiteTypes(valueTypes, result.value, this.#table); - debug?.rowVended(this.#table, query, row); - yield row; - } while (!result.done); - } finally { - rowIterator.return?.(); - } + do { + result = timeSampled( + this.#lc, + ++eventCount, + this.#logConfig.ivmSampling, + () => rowIterator.next(), + this.#logConfig.slowRowThreshold, + () => + `table-source.next took too long for ${query}. Are you missing an index?`, + ); + if (result.done) { + break; + } + const row = fromSQLiteTypes(valueTypes, result.value, this.#table); + debug?.rowVended(this.#table, query, row); + yield row; + } while (!result.done); } *push(change: SourceChange): Stream<'yield'> { From bdd706e32b0ec1c373368a44fa748cf8a529b9c6 Mon Sep 17 00:00:00 2001 From: Darick Tong Date: Mon, 6 Apr 2026 19:43:04 -0700 Subject: [PATCH 237/495] chore(zero-cache): add option to toggle CRUD mutation support (#5761) Add a `ZERO_ENABLE_CRUD_MUTATIONS` option which defaults to `true` for backwards compatibility. When set to `false`, disable any upstream connections for the purpose of CRUD mutations, and return `InvalidPush` errors if they are received. --- .../zero-cache/src/config/zero-config.test.ts | 6 +++ packages/zero-cache/src/config/zero-config.ts | 9 ++++ packages/zero-cache/src/server/main.ts | 2 +- packages/zero-cache/src/server/syncer.ts | 44 +++++++++++-------- .../src/workers/syncer-ws-message-handler.ts | 37 +++++++++++++--- packages/zero-cache/src/workers/syncer.ts | 16 ++++--- 6 files changed, 81 insertions(+), 33 deletions(-) diff --git a/packages/zero-cache/src/config/zero-config.test.ts b/packages/zero-cache/src/config/zero-config.test.ts index d4a786fe3d..28c7ec4833 100644 --- a/packages/zero-cache/src/config/zero-config.test.ts +++ b/packages/zero-cache/src/config/zero-config.test.ts @@ -162,6 +162,12 @@ test('zero-cache --help', () => { If not specified, no client-provided headers are forwarded (secure by default). Example: ZERO_QUERY_ALLOWED_CLIENT_HEADERS=x-request-id,x-correlation-id + --enable-crud-mutations boolean default: true + ZERO_ENABLE_CRUD_MUTATIONS env + Enables support for legacy CRUD mutations. When this is false, no connections + are made from view-syncers to the upstream db, and push messages with CRUD mutations + result in an InvalidPush response. + --cvr-db string optional ZERO_CVR_DB env The Postgres database used to store CVRs. CVRs (client view records) keep track diff --git a/packages/zero-cache/src/config/zero-config.ts b/packages/zero-cache/src/config/zero-config.ts index 22ca6baf63..f0a9093e97 100644 --- a/packages/zero-cache/src/config/zero-config.ts +++ b/packages/zero-cache/src/config/zero-config.ts @@ -350,6 +350,15 @@ export const zeroOptions = { getQueries: getQueriesOptions, query: queryOptions, + enableCrudMutations: { + type: v.boolean().default(true), + desc: [ + `Enables support for legacy CRUD mutations. When this is {bold false}, no connections`, + `are made from view-syncers to the upstream db, and push messages with CRUD mutations`, + `result in an InvalidPush response.`, + ], + }, + cvr: { db: { type: v.string().optional(), diff --git a/packages/zero-cache/src/server/main.ts b/packages/zero-cache/src/server/main.ts index bc6c8824f8..6a2dbd2bfb 100644 --- a/packages/zero-cache/src/server/main.ts +++ b/packages/zero-cache/src/server/main.ts @@ -52,7 +52,7 @@ export default async function runWorker( const processes = new ProcessManager(lc, parent); const {numSyncWorkers: numSyncers} = config; - if (config.upstream.maxConns < numSyncers) { + if (config.enableCrudMutations && config.upstream.maxConns < numSyncers) { throw new Error( `Insufficient upstream connections (${config.upstream.maxConns}) for ${numSyncers} syncers.` + `Increase ZERO_UPSTREAM_MAX_CONNS or decrease ZERO_NUM_SYNC_WORKERS (which defaults to available cores).`, diff --git a/packages/zero-cache/src/server/syncer.ts b/packages/zero-cache/src/server/syncer.ts index 8b7d4b8478..e81d6ac172 100644 --- a/packages/zero-cache/src/server/syncer.ts +++ b/packages/zero-cache/src/server/syncer.ts @@ -5,6 +5,7 @@ import {pid} from 'node:process'; import {assert} from '../../../shared/src/asserts.ts'; import {must} from '../../../shared/src/must.ts'; import {randInt} from '../../../shared/src/rand.ts'; +import {promiseVoid} from '../../../shared/src/resolved-promises.ts'; import * as v from '../../../shared/src/valita.ts'; import {DatabaseStorage} from '../../../zqlite/src/database-storage.ts'; import {AuthSessionImpl, type ValidateLegacyJWT} from '../auth/auth.ts'; @@ -70,26 +71,29 @@ export default function runWorker( assert(args.length > 0, `replicator mode not specified`); const fileMode = v.parse(args[0], replicaFileModeSchema); - const {cvr, upstream} = config; - assert(cvr.maxConnsPerWorker, 'cvr.maxConnsPerWorker must be set'); - assert(upstream.maxConnsPerWorker, 'upstream.maxConnsPerWorker must be set'); + const {cvr, upstream, enableCrudMutations} = config; const replicaFile = replicaFileName(config.replica.file, fileMode); lc.debug?.(`running view-syncer on ${replicaFile}`); const cvrDB = pgClient(lc, cvr.db, { - max: cvr.maxConnsPerWorker, + max: must(cvr.maxConnsPerWorker, 'cvr.maxConnsPerWorker must be set'), connection: {['application_name']: `zero-sync-worker-${pid}-cvr`}, }); - const upstreamDB = pgClient(lc, upstream.db, { - max: upstream.maxConnsPerWorker, - connection: {['application_name']: `zero-sync-worker-${pid}-upstream`}, - }); + const upstreamDB = enableCrudMutations + ? pgClient(lc, upstream.db, { + max: must( + upstream.maxConnsPerWorker, + 'upstream.maxConnsPerWorker must be set', + ), + connection: {['application_name']: `zero-sync-worker-${pid}-upstream`}, + }) + : undefined; const dbWarmup = Promise.allSettled([ warmupConnections(lc, cvrDB, 'cvr'), - warmupConnections(lc, upstreamDB, 'upstream'), + upstreamDB ? warmupConnections(lc, upstreamDB, 'upstream') : promiseVoid, ]); const tmpDir = config.storageDBTmpDir ?? tmpdir(); @@ -170,15 +174,19 @@ export default function runWorker( ); }; - const mutagenFactory = (id: string) => - new MutagenService( - lc.withContext('component', 'mutagen').withContext('clientGroupID', id), - shard, - id, - upstreamDB, - config, - writeAuthzStorage, - ); + const mutagenFactory = upstreamDB + ? (id: string) => + new MutagenService( + lc + .withContext('component', 'mutagen') + .withContext('clientGroupID', id), + shard, + id, + upstreamDB, + config, + writeAuthzStorage, + ) + : undefined; const pusherFactory = config.push.url === undefined && config.mutate.url === undefined diff --git a/packages/zero-cache/src/workers/syncer-ws-message-handler.ts b/packages/zero-cache/src/workers/syncer-ws-message-handler.ts index 0191388f5d..f3c190ee3c 100644 --- a/packages/zero-cache/src/workers/syncer-ws-message-handler.ts +++ b/packages/zero-cache/src/workers/syncer-ws-message-handler.ts @@ -21,7 +21,7 @@ const tracer = trace.getTracer('syncer-ws-server', version); export class SyncerWsMessageHandler implements MessageHandler { readonly #viewSyncer: ViewSyncer; - readonly #mutagen: Mutagen; + readonly #mutagen: Mutagen | undefined; readonly #mutationLock: Lock; readonly #lc: LogContext; readonly #clientGroupID: string; @@ -32,7 +32,7 @@ export class SyncerWsMessageHandler implements MessageHandler { lc: LogContext, connectParams: ConnectParams, viewSyncer: ViewSyncer, - mutagen: Mutagen, + mutagen: Mutagen | undefined, pusher: Pusher | undefined, ) { const { @@ -120,10 +120,19 @@ export class SyncerWsMessageHandler implements MessageHandler { // #pusher will throw if it sees a CRUD mutation. // #mutagen will throw if it see a custom mutation. if (mutations[0].type === 'custom') { - assert( - this.#pusher, - 'A ZERO_MUTATE_URL must be set in order to process custom mutations.', - ); + if (!this.#pusher) { + return [ + { + type: 'fatal', + error: { + kind: ErrorKind.InvalidPush, + message: + 'A ZERO_MUTATE_URL must be set in order to process custom mutations.', + origin: ErrorOrigin.ZeroCache, + }, + } satisfies HandlerResult, + ]; + } return [ this.#pusher.enqueuePush( this.#syncContext.clientID, @@ -135,6 +144,20 @@ export class SyncerWsMessageHandler implements MessageHandler { ]; } + const mutagen = this.#mutagen; + if (!mutagen) { + return [ + { + type: 'fatal', + error: { + kind: ErrorKind.InvalidPush, + message: `Support for legacy CRUD mutations is disabled`, + origin: ErrorOrigin.ZeroCache, + }, + } satisfies HandlerResult, + ]; + } + const auth = viewSyncer.auth; assert( auth?.type !== 'opaque', @@ -147,7 +170,7 @@ export class SyncerWsMessageHandler implements MessageHandler { const ret = await this.#mutationLock.withLock(async () => { const errors: ErrorBody[] = []; for (const mutation of mutations) { - const maybeError = await this.#mutagen.processMutation( + const maybeError = await mutagen.processMutation( mutation, auth?.decoded, this.#pusher !== undefined, diff --git a/packages/zero-cache/src/workers/syncer.ts b/packages/zero-cache/src/workers/syncer.ts index 20b248c840..3ded75dc67 100644 --- a/packages/zero-cache/src/workers/syncer.ts +++ b/packages/zero-cache/src/workers/syncer.ts @@ -72,7 +72,7 @@ export class Syncer implements SingletonService { readonly id = `syncer-${pid}`; readonly #lc: LogContext; readonly #viewSyncers: ServiceRunner; - readonly #mutagens: ServiceRunner; + readonly #mutagens: ServiceRunner | undefined; readonly #pushers: ServiceRunner | undefined; readonly #connections = new Map(); readonly #drainCoordinator = new DrainCoordinator(); @@ -90,7 +90,7 @@ export class Syncer implements SingletonService { drainCoordinator: DrainCoordinator, validateLegacyJWT: ValidateLegacyJWT | undefined, ) => ViewSyncer & ActivityBasedService, - mutagenFactory: (id: string) => Mutagen & Service, + mutagenFactory: ((id: string) => Mutagen & Service) | undefined, pusherFactory: ((id: string) => Pusher & Service) | undefined, parent: Worker, ) { @@ -112,7 +112,9 @@ export class Syncer implements SingletonService { ), v => v.keepalive(), ); - this.#mutagens = new ServiceRunner(lc, mutagenFactory, m => m.hasRefs()); + if (mutagenFactory) { + this.#mutagens = new ServiceRunner(lc, mutagenFactory, m => m.hasRefs()); + } if (pusherFactory) { this.#pushers = new ServiceRunner(lc, pusherFactory, p => p.hasRefs()); } @@ -181,10 +183,10 @@ export class Syncer implements SingletonService { existing.close(`replaced by ${params.wsID}`); } - const mutagen = this.#mutagens.getService(clientGroupID); + const mutagen = this.#mutagens?.getService(clientGroupID); const pusher = this.#pushers?.getService(clientGroupID); // a new connection is using the mutagen and pusher. Bump their ref counts. - mutagen.ref(); + mutagen?.ref(); pusher?.ref(); let connection: Connection; @@ -206,12 +208,12 @@ export class Syncer implements SingletonService { } // Connection is closed. We can unref the mutagen and pusher. // If their ref counts are zero, they will stop themselves and set themselves invalid. - mutagen.unref(); + mutagen?.unref(); pusher?.unref(); }, ); } catch (e) { - mutagen.unref(); + mutagen?.unref(); pusher?.unref(); throw e; } From 5b273ec42601a5ebf9ba8a0a79efd78770acd2d5 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Tue, 7 Apr 2026 12:11:35 +0200 Subject: [PATCH 238/495] perf(zql): fix V8 deopt in compareValues and compareBounds (#5754) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem Running the IVM hot path under Node's `--trace-deopt` flag revealed two deopt sites in the comparison code causing repeated bailouts from Maglev/Turbofan back to the interpreter: ```sh NODE_OPTIONS=--trace-deopt npm --workspace=zql-benchmarks run bench -- memory-ivm-deopt ``` **`compareValues`** — The original implementation narrowed the type of `a` with `typeof` but then called assertion helpers (`assertBoolean`, `assertNumber`, `assertString`) on `b` separately. These helpers introduce additional call sites with mixed type feedback, preventing V8 from compiling a specialised fast path for the common string/number cases. **`compareBounds`** — The sentinel values `minValue`/`maxValue` are Symbols. Checking `a === minValue` before knowing the type of `a` meant that when a Symbol appeared, V8 deopted the integer/string fast path it had compiled for the common case. ## Fix **`compareValues`**: Check `typeof a === 'string' && typeof b === 'string'` (and similarly for number/boolean) so each branch gives V8 a clear monomorphic profile. The null sentinel check is moved after the type checks since it is the less common case. **`compareBounds`**: Guard with `typeof a === 'symbol'` first, giving V8 a clear type discriminant so the non-symbol path stays compiled as a numeric/string specialisation. ## Benchmarks Measured with the new memory-ivm-deopt.bench.ts benchmark (2 runs each, WIP vs. main): | benchmark | main | WIP | speedup | |---|---|---|---| | `compareValues(string, string)` | 305 ns | 190 ns | **1.6×** | | `compareValues(number, number)` | 286 ns | 125 ns | **2.3×** | | `compareValues(mixed)` | 35 ns | 21 ns | **1.7×** | | MemorySource push add/remove | 2.66 µs | 2.39 µs | **1.11×** | | MemorySource push edit | 3.65 µs | 3.18 µs | **1.15×** | | Join push add/remove | 4.22 µs | 3.83 µs | **1.10×** | | Join push edit | 3.69 µs | 3.28 µs | **1.13×** | The IVM operator improvements are a downstream effect of the faster comparator. Fetch/scan paths are unchanged as expected since they do not exercise the comparison hot path heavily. --- packages/shared/src/btree-set.bench.ts | 54 +++ packages/zql-benchmarks/package.json | 1 + .../src/memory-ivm-deopt.bench.ts | 394 ++++++++++++++++++ packages/zql/src/ivm/data.test.ts | 12 +- packages/zql/src/ivm/data.ts | 51 ++- packages/zql/src/ivm/memory-source.ts | 20 +- .../zql/src/ivm/test/compare-rows-test.ts | 2 +- 7 files changed, 496 insertions(+), 38 deletions(-) create mode 100644 packages/zql-benchmarks/src/memory-ivm-deopt.bench.ts diff --git a/packages/shared/src/btree-set.bench.ts b/packages/shared/src/btree-set.bench.ts index a901fe8c11..03b7aac08c 100644 --- a/packages/shared/src/btree-set.bench.ts +++ b/packages/shared/src/btree-set.bench.ts @@ -105,3 +105,57 @@ describe('BTreeSet iterator next() in isolation', () => { use(sum); }); }); + +// Lookup and mutation benchmarks exercise internal node traversal, +// triggering the BNode vs BNodeInternal shape polymorphism. +describe('BTreeSet lookups', () => { + bench('has() hit', () => { + // Spread across the tree to exercise multiple internal nodes + use(tree.has(100)); + use(tree.has(500)); + use(tree.has(900)); + }); + + bench('has() miss', () => { + use(tree.has(NUM_ENTRIES + 1)); + use(tree.has(NUM_ENTRIES + 2)); + use(tree.has(NUM_ENTRIES + 3)); + }); + + bench('get() hit', () => { + use(tree.get(100)); + use(tree.get(500)); + use(tree.get(900)); + }); +}); + +describe('BTreeSet mutations', () => { + bench('add() then delete() single key', function* () { + // Setup: clone the tree so we don't corrupt the shared tree + const t = tree.clone(); + yield () => { + t.add(NUM_ENTRIES + 1); + t.delete(NUM_ENTRIES + 1); + }; + }); + + bench('add() 100 sequential keys', function* () { + yield () => { + const t = new BTreeSet(numericComparator); + for (let i = 0; i < 100; i++) { + t.add(i); + } + use(t.size); + }; + }); + + bench('add() 1000 sequential keys', function* () { + yield () => { + const t = new BTreeSet(numericComparator); + for (let i = 0; i < NUM_ENTRIES; i++) { + t.add(i); + } + use(t.size); + }; + }); +}); diff --git a/packages/zql-benchmarks/package.json b/packages/zql-benchmarks/package.json index c699f7cb2a..e0f4ec699d 100644 --- a/packages/zql-benchmarks/package.json +++ b/packages/zql-benchmarks/package.json @@ -14,6 +14,7 @@ "test": "vitest run --silent=false --disable-console-intercept", "test:watch": "vitest watch", "bench": "vitest run --config vitest.config.bench.ts", + "bench:deopt": "vitest run --config vitest.config.bench.ts --execArgv=--trace-deopt", "bench:bmf": "BENCH_OUTPUT_FORMAT=json npm run bench 2>&1 | npx tsx ../shared/src/tool/mitata-json-to-bmf.ts", "bench:bmf:silent": "npm run bench:bmf --silent", "test-types": "vitest run --typecheck.only --no-browser.enabled", diff --git a/packages/zql-benchmarks/src/memory-ivm-deopt.bench.ts b/packages/zql-benchmarks/src/memory-ivm-deopt.bench.ts new file mode 100644 index 0000000000..372f4759dc --- /dev/null +++ b/packages/zql-benchmarks/src/memory-ivm-deopt.bench.ts @@ -0,0 +1,394 @@ +/** + * In-memory ZQL IVM benchmarks for hot-path deopt analysis. + * Does NOT require postgres or SQLite - uses MemorySource only. + * + * Run: + * npm --workspace=zql-benchmarks run bench -- memory-ivm-deopt + * + * Run with deopt tracing (output goes to stderr inline): + * npm --workspace=zql-benchmarks run bench:deopt -- memory-ivm-deopt + */ + +import {bench, describe} from '../../shared/src/bench.ts'; +import type {Row} from '../../zero-protocol/src/data.ts'; +import type {BuilderDelegate} from '../../zql/src/builder/builder.ts'; +import {Catch} from '../../zql/src/ivm/catch.ts'; +import {compareValues} from '../../zql/src/ivm/data.ts'; +import {buildFilterPipeline} from '../../zql/src/ivm/filter-operators.ts'; +import {Filter} from '../../zql/src/ivm/filter.ts'; +import {Join} from '../../zql/src/ivm/join.ts'; +import {MemorySource} from '../../zql/src/ivm/memory-source.ts'; + +const noopDelegate = {addEdge() {}} as unknown as BuilderDelegate; + +// ---- Schema definitions ---- + +const issueColumns = { + id: {type: 'string'} as const, + title: {type: 'string'} as const, + closed: {type: 'boolean'} as const, + ownerId: {type: 'string', optional: true} as const, + createdAt: {type: 'number'} as const, +}; + +const userColumns = { + id: {type: 'string'} as const, + name: {type: 'string'} as const, +}; + +// ---- Row generators ---- + +function makeIssueRow(i: number): Row { + return { + id: `issue-${i}`, + title: `Issue ${i}`, + closed: i % 3 === 0, + ownerId: i % 5 === 0 ? null : `user-${i % 20}`, + createdAt: 1_000_000 + i, + }; +} + +function makeUserRow(i: number): Row { + return {id: `user-${i}`, name: `User ${i}`}; +} + +const ISSUE_COUNT = 1000; +const USER_COUNT = 20; + +// ---- compareValues (hot path, deopt risk from polymorphism) ---- + +describe('compareValues', () => { + const strs = ['apple', 'banana', 'cherry', 'date', 'elderberry']; + const nums = [1, 2, 3, 4, 5]; + + bench('compareValues(string, string)', () => { + for (let i = 0; i < strs.length; i++) { + for (let j = 0; j < strs.length; j++) { + compareValues(strs[i], strs[j]); + } + } + }); + + bench('compareValues(number, number)', () => { + for (let i = 0; i < nums.length; i++) { + for (let j = 0; j < nums.length; j++) { + compareValues(nums[i], nums[j]); + } + } + }); + + // Mixed types through the same call site — classic deopt trigger. + bench('compareValues(mixed: string/number/bool/null)', () => { + compareValues('a', 'b'); + compareValues(1, 2); + compareValues(true, false); + compareValues(null, null); + }); +}); + +// ---- MemorySource fetch ---- + +describe('MemorySource fetch', () => { + bench(`scan ${ISSUE_COUNT} rows`, function* () { + const src = new MemorySource('issue', issueColumns, ['id']); + for (let i = 0; i < ISSUE_COUNT; i++) { + for (const _ of src.push({type: 'add', row: makeIssueRow(i)})) { + /* consume */ + } + } + const conn = src.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + const out = new Catch(conn); + + yield () => { + out.fetch(); + }; + }); +}); + +// ---- MemorySource push ---- + +describe('MemorySource push', () => { + bench(`add/remove over ${ISSUE_COUNT} rows`, function* () { + const src = new MemorySource('issue', issueColumns, ['id']); + for (let i = 0; i < ISSUE_COUNT; i++) { + for (const _ of src.push({type: 'add', row: makeIssueRow(i)})) { + /* consume */ + } + } + const conn = src.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + new Catch(conn); + + let idx = ISSUE_COUNT; + yield () => { + const row = makeIssueRow(idx++); + for (const _ of src.push({type: 'add', row})) { + /* consume */ + } + for (const _ of src.push({type: 'remove', row})) { + /* consume */ + } + }; + }); + + bench(`edit over ${ISSUE_COUNT} rows`, function* () { + const src = new MemorySource('issue', issueColumns, ['id']); + const rows: Row[] = []; + for (let i = 0; i < ISSUE_COUNT; i++) { + const row = makeIssueRow(i); + rows.push(row); + for (const _ of src.push({type: 'add', row})) { + /* consume */ + } + } + const conn = src.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + new Catch(conn); + + let idx = 0; + yield () => { + const oldRow = rows[idx % rows.length]; + idx++; + const newRow = {...oldRow, title: `Updated ${idx}`}; + for (const _ of src.push({type: 'edit', oldRow, row: newRow})) { + /* consume */ + } + for (const _ of src.push({type: 'edit', oldRow: newRow, row: oldRow})) { + /* consume */ + } + }; + }); +}); + +// ---- Filter ---- + +describe('Filter', () => { + bench(`fetch open issues (${ISSUE_COUNT} total)`, function* () { + const src = new MemorySource('issue', issueColumns, ['id']); + for (let i = 0; i < ISSUE_COUNT; i++) { + for (const _ of src.push({type: 'add', row: makeIssueRow(i)})) { + /* consume */ + } + } + const conn = src.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + const filtered = buildFilterPipeline( + conn, + noopDelegate, + input => new Filter(input, row => row['closed'] === false), + ); + const out = new Catch(filtered); + + yield () => { + out.fetch(); + }; + }); + + bench('push add open issue (passes filter)', function* () { + const src = new MemorySource('issue', issueColumns, ['id']); + for (let i = 0; i < ISSUE_COUNT; i++) { + for (const _ of src.push({type: 'add', row: makeIssueRow(i)})) { + /* consume */ + } + } + const conn = src.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + const filtered = buildFilterPipeline( + conn, + noopDelegate, + input => new Filter(input, row => row['closed'] === false), + ); + new Catch(filtered); + + let idx = ISSUE_COUNT; + yield () => { + const row = makeIssueRow(idx++); + (row as Record)['closed'] = false; + for (const _ of src.push({type: 'add', row})) { + /* consume */ + } + for (const _ of src.push({type: 'remove', row})) { + /* consume */ + } + }; + }); + + bench('push add closed issue (filtered out)', function* () { + const src = new MemorySource('issue', issueColumns, ['id']); + for (let i = 0; i < ISSUE_COUNT; i++) { + for (const _ of src.push({type: 'add', row: makeIssueRow(i)})) { + /* consume */ + } + } + const conn = src.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + const filtered = buildFilterPipeline( + conn, + noopDelegate, + input => new Filter(input, row => row['closed'] === false), + ); + new Catch(filtered); + + let idx = ISSUE_COUNT; + yield () => { + const row = makeIssueRow(idx++); + (row as Record)['closed'] = true; + for (const _ of src.push({type: 'add', row})) { + /* consume */ + } + for (const _ of src.push({type: 'remove', row})) { + /* consume */ + } + }; + }); +}); + +// ---- Join ---- + +describe('Join', () => { + bench(`fetch ${ISSUE_COUNT} issues → ${USER_COUNT} users`, function* () { + const issueSrc = new MemorySource('issue', issueColumns, ['id']); + const userSrc = new MemorySource('user', userColumns, ['id']); + + for (let i = 0; i < USER_COUNT; i++) { + for (const _ of userSrc.push({type: 'add', row: makeUserRow(i)})) { + /* consume */ + } + } + for (let i = 0; i < ISSUE_COUNT; i++) { + for (const _ of issueSrc.push({type: 'add', row: makeIssueRow(i)})) { + /* consume */ + } + } + + const issueConn = issueSrc.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + const userConn = userSrc.connect([['id', 'asc']]); + const join = new Join({ + parent: issueConn, + child: userConn, + parentKey: ['ownerId'], + childKey: ['id'], + relationshipName: 'owner', + hidden: false, + system: 'client', + }); + const out = new Catch(join); + + yield () => { + out.fetch(); + }; + }); + + bench('push add/remove issue with owner', function* () { + const issueSrc = new MemorySource('issue', issueColumns, ['id']); + const userSrc = new MemorySource('user', userColumns, ['id']); + + for (let i = 0; i < USER_COUNT; i++) { + for (const _ of userSrc.push({type: 'add', row: makeUserRow(i)})) { + /* consume */ + } + } + for (let i = 0; i < ISSUE_COUNT; i++) { + for (const _ of issueSrc.push({type: 'add', row: makeIssueRow(i)})) { + /* consume */ + } + } + + const issueConn = issueSrc.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + const userConn = userSrc.connect([['id', 'asc']]); + const join = new Join({ + parent: issueConn, + child: userConn, + parentKey: ['ownerId'], + childKey: ['id'], + relationshipName: 'owner', + hidden: false, + system: 'client', + }); + new Catch(join); + join.fetch({}); + + let idx = ISSUE_COUNT; + yield () => { + const row = makeIssueRow(idx++); + for (const _ of issueSrc.push({type: 'add', row})) { + /* consume */ + } + for (const _ of issueSrc.push({type: 'remove', row})) { + /* consume */ + } + }; + }); + + bench('push edit issue title (non-key field)', function* () { + const issueSrc = new MemorySource('issue', issueColumns, ['id']); + const userSrc = new MemorySource('user', userColumns, ['id']); + + for (let i = 0; i < USER_COUNT; i++) { + for (const _ of userSrc.push({type: 'add', row: makeUserRow(i)})) { + /* consume */ + } + } + const issueRows: Row[] = []; + for (let i = 0; i < ISSUE_COUNT; i++) { + const row = makeIssueRow(i); + issueRows.push(row); + for (const _ of issueSrc.push({type: 'add', row})) { + /* consume */ + } + } + + const issueConn = issueSrc.connect([ + ['createdAt', 'asc'], + ['id', 'asc'], + ]); + const userConn = userSrc.connect([['id', 'asc']]); + const join = new Join({ + parent: issueConn, + child: userConn, + parentKey: ['ownerId'], + childKey: ['id'], + relationshipName: 'owner', + hidden: false, + system: 'client', + }); + new Catch(join); + join.fetch({}); + + let idx = 0; + yield () => { + const oldRow = issueRows[idx % issueRows.length]; + idx++; + const newRow = {...oldRow, title: `Updated ${idx}`}; + for (const _ of issueSrc.push({type: 'edit', oldRow, row: newRow})) { + /* consume */ + } + for (const _ of issueSrc.push({ + type: 'edit', + oldRow: newRow, + row: oldRow, + })) { + /* consume */ + } + }; + }); +}); diff --git a/packages/zql/src/ivm/data.test.ts b/packages/zql/src/ivm/data.test.ts index 9abeff6a0d..5068f3df1b 100644 --- a/packages/zql/src/ivm/data.test.ts +++ b/packages/zql/src/ivm/data.test.ts @@ -57,7 +57,9 @@ test('compareValues', () => { fc.boolean(), fc.oneof(fc.double(), fc.fullUnicodeString()), (b, v) => { - expect(() => compareValues(b, v)).toThrow('expected boolean'); + expect(() => compareValues(b, v)).toThrow( + /Cannot compare values of different types: boolean and (number|string)/, + ); }, ), ); @@ -79,7 +81,9 @@ test('compareValues', () => { fc.double(), fc.oneof(fc.boolean(), fc.fullUnicodeString()), (n, v) => { - expect(() => compareValues(n, v)).toThrow('expected number'); + expect(() => compareValues(n, v)).toThrow( + /Cannot compare values of different types: number and (boolean|string)/, + ); }, ), ); @@ -95,7 +99,9 @@ test('compareValues', () => { fc.fullUnicodeString(), fc.oneof(fc.boolean(), fc.double()), (s, v) => { - expect(() => compareValues(s, v)).toThrow('expected string'); + expect(() => compareValues(s, v)).toThrow( + /Cannot compare values of different types: string and (boolean|number)/, + ); }, ), ); diff --git a/packages/zql/src/ivm/data.ts b/packages/zql/src/ivm/data.ts index c09024e7e8..deaa49449a 100644 --- a/packages/zql/src/ivm/data.ts +++ b/packages/zql/src/ivm/data.ts @@ -1,9 +1,4 @@ import {compareUTF8} from 'compare-utf8'; -import { - assertBoolean, - assertNumber, - assertString, -} from '../../../shared/src/asserts.ts'; import type {Ordering} from '../../../zero-protocol/src/ast.ts'; import type {Row, Value} from '../../../zero-protocol/src/data.ts'; import type {Stream} from './stream.ts'; @@ -35,28 +30,14 @@ export type Node = { * @returns < 0 if a < b, 0 if a === b, > 0 if a > b */ export function compareValues(a: Value, b: Value): number { - a = normalizeUndefined(a); - b = normalizeUndefined(b); + a = a ?? null; + b = b ?? null; if (a === b) { return 0; } - if (a === null) { - return -1; - } - if (b === null) { - return 1; - } - if (typeof a === 'boolean') { - assertBoolean(b); - return a ? 1 : -1; - } - if (typeof a === 'number') { - assertNumber(b); - return a - b; - } - if (typeof a === 'string') { - assertString(b); + + if (typeof a === 'string' && typeof b === 'string') { // We compare all strings in Zero as UTF-8. This is the default on SQLite // and we need to match it. See: // https://blog.replicache.dev/blog/replicache-11-adventures-in-text-encoding. @@ -67,6 +48,30 @@ export function compareValues(a: Value, b: Value): number { // https://www.sqlite.org/c3ref/create_collation.html return compareUTF8(a, b); } + + if (typeof a === 'number' && typeof b === 'number') { + return a - b; + } + + if (typeof a === 'boolean' && typeof b === 'boolean') { + return a ? 1 : -1; + } + + // check with null after since it is less likely to be the common case and we + // want to avoid the extra checks in that case + if (a === null) { + return -1; + } + if (b === null) { + return 1; + } + + if (typeof a !== typeof b) { + throw new Error( + `Cannot compare values of different types: ${typeof a} and ${typeof b}`, + ); + } + throw new Error(`Unsupported type: ${a}`); } diff --git a/packages/zql/src/ivm/memory-source.ts b/packages/zql/src/ivm/memory-source.ts index 3e4e5ba24f..cff787b7c2 100644 --- a/packages/zql/src/ivm/memory-source.ts +++ b/packages/zql/src/ivm/memory-source.ts @@ -872,17 +872,15 @@ function compareBounds(a: Bound, b: Bound): number { if (a === b) { return 0; } - if (a === minValue) { - return -1; - } - if (b === minValue) { - return 1; - } - if (a === maxValue) { - return 1; - } - if (b === maxValue) { - return -1; + // Use typeof to guard the Symbol sentinel checks first. This gives V8 a + // clear type discriminant so the common non-symbol path compiles as a + // specialised numeric/string fast-path without a Smi deopt when the + // minValue/maxValue sentinel symbols appear. + if (typeof a === 'symbol') { + return a === minValue ? -1 : 1; + } + if (typeof b === 'symbol') { + return b === minValue ? 1 : -1; } return compareValues(a, b); } diff --git a/packages/zql/src/ivm/test/compare-rows-test.ts b/packages/zql/src/ivm/test/compare-rows-test.ts index 4c795d3cdf..32e6757e6b 100644 --- a/packages/zql/src/ivm/test/compare-rows-test.ts +++ b/packages/zql/src/ivm/test/compare-rows-test.ts @@ -75,7 +75,7 @@ export function compareRowsTest( order: [['a', 'asc']], r1: {a: 1}, r2: {a: 'foo'}, - expected: 'expected number', + expected: 'Cannot compare values of different types: number and string', }, ]; From 76af98ef4951d45350353350645262b6decea508 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Tue, 7 Apr 2026 12:48:41 +0200 Subject: [PATCH 239/495] chore(lint): add @e18e/eslint-plugin and fix violations --- apps/otel-proxy/package.json | 2 +- apps/zbugs/package.json | 2 +- apps/zbugs/scripts/generate-templates.ts | 1 + apps/zbugs/scripts/seed.ts | 8 +- apps/zbugs/src/components/emoji-panel.tsx | 2 +- apps/zbugs/src/components/filter.tsx | 3 +- apps/zbugs/src/components/fuzzy-search.ts | 4 +- apps/zbugs/src/components/label-picker.tsx | 2 +- apps/zbugs/src/components/loading-spinner.tsx | 2 +- apps/zbugs/src/components/markdown.tsx | 4 +- apps/zbugs/src/components/user-picker.tsx | 3 +- apps/zbugs/src/pages/issue/get-id.tsx | 4 +- apps/zbugs/src/pages/list/list-page.tsx | 2 +- apps/zbugs/src/root.tsx | 4 +- apps/zql-viz/src/query-delegate.ts | 2 +- oxlint.base.ts | 32 + package-lock.json | 550 ++++++++---------- package.json | 5 +- packages/analyze-query/package.json | 5 +- packages/analyze-query/src/bin-analyze.ts | 57 +- packages/ast-to-zql/package.json | 2 +- packages/ast-to-zql/src/ast-to-zql.ts | 3 +- packages/datadog/package.json | 2 +- packages/otel/package.json | 2 +- packages/replicache-perf/package.json | 2 +- packages/replicache-perf/src/benchmark.ts | 6 +- .../src/benchmarks/replicache.ts | 2 +- packages/replicache-perf/src/index.ts | 2 +- packages/replicache-perf/src/runner.ts | 2 +- packages/replicache/package.json | 2 +- packages/replicache/src/btree/node.ts | 9 +- packages/replicache/src/connection-loop.ts | 9 +- packages/replicache/src/dag/gc.test.ts | 4 +- .../replicache/src/dag/lazy-store.test.ts | 55 +- packages/replicache/src/dag/test-store.ts | 1 + packages/replicache/src/db/commit.test.ts | 38 +- packages/replicache/src/db/rebase.test.ts | 12 +- packages/replicache/src/db/test-helpers.ts | 6 +- packages/replicache/src/deleted-clients.ts | 18 +- packages/replicache/src/fetch-mocker.ts | 5 +- packages/replicache/src/hash.ts | 7 +- .../src/kv/sqlite-store-test-util.ts | 16 +- .../src/mutation-recovery-test-helper.ts | 3 +- packages/replicache/src/process-scheduler.ts | 1 - .../replicache-mutation-recovery-dd31.test.ts | 2 +- packages/replicache/src/replicache.test.ts | 8 +- packages/replicache/src/request-idle.ts | 2 +- packages/replicache/src/sync/patch.ts | 4 +- packages/replicache/src/sync/pull.test.ts | 14 +- packages/replicache/src/sync/push.test.ts | 10 +- packages/shared/package.json | 2 +- packages/shared/src/arrays.ts | 5 +- packages/shared/src/bench-format.ts | 6 +- packages/shared/src/bigint-json.ts | 2 +- packages/shared/src/btree-set.ts | 3 +- .../shared/src/build-nested-object-path.ts | 3 +- packages/shared/src/build.ts | 1 + packages/shared/src/iterables.ts | 14 + .../shared/src/logarithmic-histogram.test.ts | 2 +- packages/shared/src/logging.ts | 20 +- packages/shared/src/object-traversal.test.ts | 8 +- packages/shared/src/options.ts | 2 +- packages/shared/src/set-util.test.ts | 2 +- packages/shared/src/tdigest-schema.ts | 1 + packages/shared/src/tdigest.ts | 27 +- packages/shared/src/to-sorted.test.ts | 77 --- packages/shared/src/to-sorted.ts | 4 - packages/shared/src/valita.ts | 3 +- packages/z2s/package.json | 2 +- packages/z2s/src/sql.ts | 6 +- packages/zero-cache/package.json | 3 +- .../zero-cache/src/auth/load-permissions.ts | 2 +- .../src/custom-queries/transform-query.ts | 2 +- packages/zero-cache/src/db/migration-lite.ts | 3 +- packages/zero-cache/src/db/migration.ts | 3 +- packages/zero-cache/src/scripts/create-jwk.ts | 6 +- .../src/server/anonymous-otel-start.ts | 4 +- packages/zero-cache/src/server/worker-urls.ts | 4 +- .../change-source/custom/change-source.ts | 4 +- .../change-source/pg/change-source.ts | 2 +- .../services/change-source/pg/schema/shard.ts | 2 +- .../src/services/change-streamer/broadcast.ts | 2 +- .../services/replicator/change-processor.ts | 4 +- .../services/replicator/replication-status.ts | 1 + .../src/services/view-syncer/client-schema.ts | 7 +- .../src/services/view-syncer/cvr-store.ts | 8 +- .../src/services/view-syncer/cvr.ts | 10 +- .../services/view-syncer/pipeline-driver.ts | 10 +- .../src/services/view-syncer/snapshotter.ts | 2 +- .../src/services/view-syncer/view-syncer.ts | 12 +- packages/zero-cache/src/types/lite.ts | 6 +- packages/zero-cache/src/types/pg.ts | 9 +- packages/zero-cache/src/types/subscription.ts | 5 +- .../src/types/websocket-handoff.test.ts | 2 +- packages/zero-client/package.json | 2 +- .../zero-client/src/client/http-string.ts | 8 +- packages/zero-client/src/client/metrics.ts | 7 +- .../src/client/mutator-proxy.test.ts | 2 +- .../src/client/protocol-version-url.test.ts | 1 + .../zero-client/src/client/server-option.ts | 2 +- .../src/client/zero-poke-handler.ts | 3 +- packages/zero-client/src/client/zero.test.ts | 6 +- packages/zero-events/package.json | 2 +- packages/zero-pg/package.json | 2 +- packages/zero-protocol/package.json | 2 +- packages/zero-protocol/src/ast.ts | 1 + packages/zero-protocol/src/connect.test.ts | 5 +- packages/zero-protocol/src/primary-key.ts | 1 + packages/zero-protocol/src/push.ts | 1 + packages/zero-react-native/package.json | 2 +- packages/zero-react/package.json | 2 +- packages/zero-schema/package.json | 2 +- packages/zero-schema/src/name-mapper.ts | 2 +- packages/zero-server/package.json | 2 +- packages/zero-server/src/process-mutations.ts | 3 +- packages/zero-server/src/push-processor.ts | 4 +- packages/zero-solid/package.json | 2 +- packages/zero-types/package.json | 2 +- packages/zero/package.json | 3 +- packages/zql-benchmarks/package.json | 2 +- .../zql-benchmarks/src/planner-cost.bench.ts | 2 +- .../src/planner-hydration.bench.ts | 2 +- packages/zql-benchmarks/src/zbugs.bench.ts | 9 +- packages/zql-integration-tests/package.json | 2 +- .../src/chinook/planner-controlled.test.ts | 12 +- .../src/helpers/data-gen.ts | 1 + packages/zql/package.json | 2 +- packages/zql/src/builder/like.ts | 4 +- packages/zql/src/ivm/catch.ts | 6 +- .../zql/src/ivm/flipped-join.sibling.test.ts | 13 +- packages/zql/src/ivm/join.sibling.test.ts | 11 +- packages/zql/src/ivm/memory-source.test.ts | 78 +-- packages/zql/src/ivm/source.test.ts | 18 +- packages/zql/src/ivm/stream.test.ts | 6 +- packages/zql/src/ivm/union-fan-in.test.ts | 6 +- packages/zql/src/query/complete-ordering.ts | 2 +- .../zql/src/query/expression-test-util.ts | 1 + .../query-impl.query-kitchen-sink.test.ts | 6 +- packages/zql/src/query/query-registry.ts | 4 +- packages/zql/src/query/test/util.ts | 2 +- packages/zql/src/query/ttl.ts | 2 +- packages/zqlite-zql-test/package.json | 2 +- packages/zqlite/package.json | 2 +- packages/zqlite/src/sqlite-cost-model.ts | 12 +- packages/zqlite/src/sqlite-stat-fanout.ts | 2 +- packages/zqlite/src/table-source.test.ts | 18 +- packages/zqlite/src/table-source.ts | 4 +- prod/package.json | 2 +- tools/client-simulator/package.json | 2 +- tools/load-generator/package.json | 2 +- tools/process-tracker/package.json | 2 +- tools/process-tracker/src/main.ts | 4 +- tools/sqlite-io-yield-simulator/package.json | 2 +- tools/verify-package-deps/package.json | 2 +- tsconfig.json | 4 +- 155 files changed, 757 insertions(+), 809 deletions(-) delete mode 100644 packages/shared/src/to-sorted.test.ts delete mode 100644 packages/shared/src/to-sorted.ts diff --git a/apps/otel-proxy/package.json b/apps/otel-proxy/package.json index 2e837ecb6a..f5ced445dc 100644 --- a/apps/otel-proxy/package.json +++ b/apps/otel-proxy/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@types/node": "^22.10.5", "@vitest/coverage-v8": "4.1.2", - "oxfmt": "^0.43.0", + "oxfmt": "^0.44.0", "typescript": "~6.0.2", "vitest": "4.1.2" } diff --git a/apps/zbugs/package.json b/apps/zbugs/package.json index ecd6d8e788..514d25e429 100644 --- a/apps/zbugs/package.json +++ b/apps/zbugs/package.json @@ -83,7 +83,7 @@ "@vitest/runner": "4.1.2", "drizzle-kit": "^0.31.10", "drizzle-orm": "^0.45.1", - "oxfmt": "^0.43.0", + "oxfmt": "^0.44.0", "postcss-preset-env": "^7.4.3", "rehype-video": "^2.3.0", "shared": "0.0.0", diff --git a/apps/zbugs/scripts/generate-templates.ts b/apps/zbugs/scripts/generate-templates.ts index ab0d6ef18c..b4e818e7a9 100644 --- a/apps/zbugs/scripts/generate-templates.ts +++ b/apps/zbugs/scripts/generate-templates.ts @@ -1,3 +1,4 @@ +// oxlint-disable e18e/prefer-static-regex /** * Generates parameterized template pools via Claude API for synthetic data generation. * diff --git a/apps/zbugs/scripts/seed.ts b/apps/zbugs/scripts/seed.ts index c9dce481f6..f7d8bb193f 100644 --- a/apps/zbugs/scripts/seed.ts +++ b/apps/zbugs/scripts/seed.ts @@ -197,7 +197,7 @@ async function discoverTriggers( function parseBoolEnv(value: string | undefined): boolean { return ( value !== undefined && - ['t', 'true', '1', ''].indexOf(value.toLocaleLowerCase().trim()) !== -1 + ['t', 'true', '1', ''].includes(value.toLocaleLowerCase().trim()) ); } @@ -211,9 +211,9 @@ async function seed() { const appendMode = process.env.ZERO_SEED_APPEND !== undefined && - ['t', 'true', '1', ''].indexOf( + ['t', 'true', '1', ''].includes( process.env.ZERO_SEED_APPEND.toLocaleLowerCase().trim(), - ) !== -1; + ); // oxlint-disable-next-line no-console console.log(process.env.ZERO_UPSTREAM_DB); @@ -274,7 +274,7 @@ async function seed() { if (forceSeed && !appendMode) { // oxlint-disable-next-line no-console console.log('Force mode: truncating existing data...'); - for (const tableName of [...TABLES_IN_SEED_ORDER].reverse()) { + for (const tableName of TABLES_IN_SEED_ORDER.toReversed()) { const exists = await sql` SELECT 1 FROM pg_tables WHERE schemaname = 'public' AND tablename = ${tableName} diff --git a/apps/zbugs/src/components/emoji-panel.tsx b/apps/zbugs/src/components/emoji-panel.tsx index 682f397de4..b3d39e26f9 100644 --- a/apps/zbugs/src/components/emoji-panel.tsx +++ b/apps/zbugs/src/components/emoji-panel.tsx @@ -203,7 +203,7 @@ const EmojiMenuButton = memo( function groupAndSortEmojis(emojis: readonly Emoji[]): Record { // Sort the emojis by creation time. Not sure how to sort this with ZQL. - const sortedEmojis = [...emojis].sort((a, b) => a.created - b.created); + const sortedEmojis = emojis.toSorted((a, b) => a.created - b.created); const rv: Record = {}; for (const emoji of sortedEmojis) { const normalizedEmoji = normalizeEmoji(emoji.value); diff --git a/apps/zbugs/src/components/filter.tsx b/apps/zbugs/src/components/filter.tsx index 1e5bbe165a..42aa0cb57f 100644 --- a/apps/zbugs/src/components/filter.tsx +++ b/apps/zbugs/src/components/filter.tsx @@ -1,7 +1,6 @@ import {useQuery} from '@rocicorp/zero/react'; import classNames from 'classnames'; import {memo, useMemo, useState} from 'react'; -import {toSorted} from '../../../../packages/shared/src/to-sorted.ts'; import {queries} from '../../shared/queries.ts'; import labelIcon from '../assets/icons/label.svg'; import {Button} from './button.tsx'; @@ -24,7 +23,7 @@ export const Filter = memo(function Filter({projectName, onSelect}: Props) { const [unsortedLabels] = useQuery(queries.labels({projectName})); // TODO: Support case-insensitive sorting in ZQL. const labels = useMemo( - () => toSorted(unsortedLabels, (a, b) => a.name.localeCompare(b.name)), + () => unsortedLabels.toSorted((a, b) => a.name.localeCompare(b.name)), [unsortedLabels], ); diff --git a/apps/zbugs/src/components/fuzzy-search.ts b/apps/zbugs/src/components/fuzzy-search.ts index bfd12fca97..277c393deb 100644 --- a/apps/zbugs/src/components/fuzzy-search.ts +++ b/apps/zbugs/src/components/fuzzy-search.ts @@ -1,3 +1,5 @@ +const whitespaceRegex = /\s/; + export function fuzzySearch( searchQuery: string, items: readonly T[], @@ -38,7 +40,7 @@ export function fuzzySearch( } function isWhitespace(c: string): boolean { - return /\s/.test(c); + return whitespaceRegex.test(c); } const ranked = items diff --git a/apps/zbugs/src/components/label-picker.tsx b/apps/zbugs/src/components/label-picker.tsx index 37dbc6f338..d5fed9e99e 100644 --- a/apps/zbugs/src/components/label-picker.tsx +++ b/apps/zbugs/src/components/label-picker.tsx @@ -83,7 +83,7 @@ function LabelPopover({ const handleCreateNewLabel = () => { if ( input && - !filteredLabels.find( + !filteredLabels.some( label => label.name.toLowerCase() === input.toLowerCase(), ) ) { diff --git a/apps/zbugs/src/components/loading-spinner.tsx b/apps/zbugs/src/components/loading-spinner.tsx index 504894b472..5ed321b8dd 100644 --- a/apps/zbugs/src/components/loading-spinner.tsx +++ b/apps/zbugs/src/components/loading-spinner.tsx @@ -23,7 +23,7 @@ export function LoadingSpinner({forceShow}: {forceShow?: boolean | undefined}) { } useEffect(() => { - const timer = setTimeout(() => setShow(true), 500); + const timer = setTimeout(setShow, 500, true); return () => clearTimeout(timer); }, []); diff --git a/apps/zbugs/src/components/markdown.tsx b/apps/zbugs/src/components/markdown.tsx index c6f021546f..b7c6798dcc 100644 --- a/apps/zbugs/src/components/markdown.tsx +++ b/apps/zbugs/src/components/markdown.tsx @@ -10,6 +10,8 @@ function isElement(node: Parent | null): node is Element { return node !== null && node.type === 'element' && 'tagName' in node; } +const videoExtensionsRe = /\.(mp4|webm|ogg)$/; + /** * Custom rehype plugin to transform with video extensions to